Marge Bot pushed to branch master at Glasgow Haskell Compiler / GHC

Commits:

3 changed files:

Changes:

  • compiler/GHC/Driver/Pipeline/Execute.hs
    ... ... @@ -181,52 +181,13 @@ runMergeForeign _pipe_env hsc_env input_fn foreign_os = do
    181 181
     
    
    182 182
     runLlvmLlcPhase :: PipeEnv -> HscEnv -> FilePath -> IO FilePath
    
    183 183
     runLlvmLlcPhase pipe_env hsc_env input_fn = do
    
    184
    -    -- Note [Clamping of llc optimizations]
    
    185
    -    -- ~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~~
    
    186
    -    -- See #13724
    
    187
    -    --
    
    188
    -    -- we clamp the llc optimization between [1,2]. This is because passing -O0
    
    189
    -    -- to llc 3.9 or llc 4.0, the naive register allocator can fail with
    
    190
    -    --
    
    191
    -    --   Error while trying to spill R1 from class GPR: Cannot scavenge register
    
    192
    -    --   without an emergency spill slot!
    
    193
    -    --
    
    194
    -    -- Observed at least with target 'arm-unknown-linux-gnueabihf'.
    
    195
    -    --
    
    196
    -    --
    
    197
    -    -- With LLVM4, llc -O3 crashes when ghc-stage1 tries to compile
    
    198
    -    --   rts/HeapStackCheck.cmm
    
    199
    -    --
    
    200
    -    -- llc -O3 '-mtriple=arm-unknown-linux-gnueabihf' -enable-tbaa /var/folders/fv/xqjrpfj516n5xq_m_ljpsjx00000gn/T/ghc33674_0/ghc_6.bc -o /var/folders/fv/xqjrpfj516n5xq_m_ljpsjx00000gn/T/ghc33674_0/ghc_7.lm_s
    
    201
    -    -- 0  llc                      0x0000000102ae63e8 llvm::sys::PrintStackTrace(llvm::raw_ostream&) + 40
    
    202
    -    -- 1  llc                      0x0000000102ae69a6 SignalHandler(int) + 358
    
    203
    -    -- 2  libsystem_platform.dylib 0x00007fffc23f4b3a _sigtramp + 26
    
    204
    -    -- 3  libsystem_c.dylib        0x00007fffc226498b __vfprintf + 17876
    
    205
    -    -- 4  llc                      0x00000001029d5123 llvm::SelectionDAGISel::LowerArguments(llvm::Function const&) + 5699
    
    206
    -    -- 5  llc                      0x0000000102a21a35 llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function const&) + 3381
    
    207
    -    -- 6  llc                      0x0000000102a202b1 llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 1457
    
    208
    -    -- 7  llc                      0x0000000101bdc474 (anonymous namespace)::ARMDAGToDAGISel::runOnMachineFunction(llvm::MachineFunction&) + 20
    
    209
    -    -- 8  llc                      0x00000001025573a6 llvm::MachineFunctionPass::runOnFunction(llvm::Function&) + 134
    
    210
    -    -- 9  llc                      0x000000010274fb12 llvm::FPPassManager::runOnFunction(llvm::Function&) + 498
    
    211
    -    -- 10 llc                      0x000000010274fd23 llvm::FPPassManager::runOnModule(llvm::Module&) + 67
    
    212
    -    -- 11 llc                      0x00000001027501b8 llvm::legacy::PassManagerImpl::run(llvm::Module&) + 920
    
    213
    -    -- 12 llc                      0x000000010195f075 compileModule(char**, llvm::LLVMContext&) + 12133
    
    214
    -    -- 13 llc                      0x000000010195bf0b main + 491
    
    215
    -    -- 14 libdyld.dylib            0x00007fffc21e5235 start + 1
    
    216
    -    -- Stack dump:
    
    217
    -    -- 0.  Program arguments: llc -O3 -mtriple=arm-unknown-linux-gnueabihf -enable-tbaa /var/folders/fv/xqjrpfj516n5xq_m_ljpsjx00000gn/T/ghc33674_0/ghc_6.bc -o /var/folders/fv/xqjrpfj516n5xq_m_ljpsjx00000gn/T/ghc33674_0/ghc_7.lm_s
    
    218
    -    -- 1.  Running pass 'Function Pass Manager' on module '/var/folders/fv/xqjrpfj516n5xq_m_ljpsjx00000gn/T/ghc33674_0/ghc_6.bc'.
    
    219
    -    -- 2.  Running pass 'ARM Instruction Selection' on function '@"stg_gc_f1$def"'
    
    220
    -    --
    
    221
    -    -- Observed at least with -mtriple=arm-unknown-linux-gnueabihf -enable-tbaa
    
    222
    -    --
    
    223 184
         llvm_config <- readLlvmConfigCache (hsc_llvm_config hsc_env)
    
    224 185
         let dflags = hsc_dflags hsc_env
    
    225 186
             logger = hsc_logger hsc_env
    
    226 187
             llvmOpts = case llvmOptLevel dflags of
    
    227 188
               0 -> "-O1" -- required to get the non-naive reg allocator. Passing -regalloc=greedy is not sufficient.
    
    228 189
               1 -> "-O1"
    
    229
    -          _ -> "-O2"
    
    190
    +          _ -> "-O3"
    
    230 191
     
    
    231 192
         llvm_version <- figureLlvmVersion logger dflags
    
    232 193
         let defaultOptions = map GHC.SysTools.Option . concatMap words . snd
    
    ... ... @@ -259,7 +220,7 @@ runLlvmOptPhase pipe_env hsc_env input_fn = do
    259 220
         llvm_config <- readLlvmConfigCache (hsc_llvm_config hsc_env)
    
    260 221
         let -- we always (unless -optlo specified) run Opt since we rely on it to
    
    261 222
             -- fix up some pretty big deficiencies in the code we generate
    
    262
    -        optIdx = max 0 $ min 2 $ llvmOptLevel dflags  -- ensure we're in [0,2]
    
    223
    +        optIdx = max 0 $ min 3 $ llvmOptLevel dflags  -- ensure we're in [0,3]
    
    263 224
             llvmOpts = case lookup optIdx $ llvmPasses llvm_config of
    
    264 225
                         Just passes -> passes
    
    265 226
                         Nothing -> panic ("runPhase LlvmOpt: llvm-passes file "
    

  • compiler/GHC/Driver/Session.hs
    ... ... @@ -798,8 +798,11 @@ updOptLevelChanged n dfs
    798 798
          | not (gopt f dfs) = (dfs, changed)
    
    799 799
          | otherwise = (gopt_unset dfs f, True)
    
    800 800
     
    
    801
    +   -- Use -O3 for llc/opt when we are compiling with -O2
    
    802
    +   llvm_n = if final_n == 2 then 3 else final_n
    
    803
    +
    
    801 804
        setLlvmOptLevel dfs
    
    802
    -     | llvmOptLevel dfs /= final_n = (dfs{ llvmOptLevel = final_n }, True)
    
    805
    +     | llvmOptLevel dfs /= llvm_n = (dfs{ llvmOptLevel = llvm_n }, True)
    
    803 806
          | otherwise = (dfs, False)
    
    804 807
     
    
    805 808
     updOptLevel :: Int -> DynFlags -> DynFlags
    

  • llvm-passes
    1 1
     [
    
    2 2
     (0, "-passes=function(require<tbaa>),function(mem2reg),globalopt,function(lower-expect)"),
    
    3 3
     (1, "-passes=default<O1>"),
    
    4
    -(2, "-passes=default<O2>")
    
    4
    +(2, "-passes=default<O2>"),
    
    5
    +(3, "-passes=default<O3>")
    
    5 6
     ]