| ... |
... |
@@ -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 "
|