
#7571: LLVM codegen does not handle integer literals in branch conditionals. --------------------------------+------------------------------------------- Reporter: thoughtpolice | Owner: thoughtpolice Type: bug | Status: new Priority: normal | Component: Compiler (LLVM) Version: 7.6.1 | Keywords: llvm, codegen Os: Unknown/Multiple | Architecture: Unknown/Multiple Failure: Building GHC failed | Blockedby: Blocking: | Related: --------------------------------+------------------------------------------- When compiling GHC HEAD on my ODROID-U2 ARM machine, running Ubuntu 12.10, with LLVM 3.3svn, I get this error while building part of the RTS: {{{ linaro@linaro-ubuntu-desktop ~/code/ghc % "inplace/bin/ghc-stage1" -static -prof -H32m -O -Iincludes -Iincludes/dist -Iincludes/dist-derivedconstants/header -Iincludes/dist- ghcconstants/header -Irts -Irts/dist/build -DCOMPILING_RTS -package-name rts -dcmm-lint -i -irts -irts/dist/build -irts/dist/build/autogen -Irts/dist/build -Irts/dist/build/autogen -optc-O2 -O2 -c rts/StgStdThunks.cmm -o rts/dist/build/StgStdThunks.p_o You are using a new version of LLVM that hasn't been tested yet! We will try though... ghc-stage1: panic! (the 'impossible' happened) (GHC version 7.7.20130111 for arm-unknown-linux): LlvmCodeGen.CodeGen.genCondBranch: Cond expr not bool! (i32 1) Please report this as a GHC bug: http://www.haskell.org/ghc/reportabug linaro@linaro-ubuntu-desktop ~/code/ghc % }}} The reason is that StgStdThunks.cmm does something like: {{{ #ifdef FOO #define THING(x) 1 #else #define THING(x) do_something((x)) #endif ... if (THING(x)) { ... } }}} Depending on if FOO is defined, the conditional could have an expression or a literal in the branch head. This is directly fed into the backend from the compiler. LlvmCodeGen.CodeGen.genLit does not properly narrow the type of the literal from i32 to i1 when generating the code, causing a compiler panic. We would have likely never seen this outside hand-written Cmm, since the code generator would otherwise trivially eliminate such branches in the optimizers. Coincidentally, I would imagine this failure would mean that the compiler has not been able to bootstrap with LLVM for quite some time. I haven't bisected this, but I'd speculate it was some time around the switch to the NCG. I believe I have a fix for this that I am testing on my machine. -- Ticket URL: http://hackage.haskell.org/trac/ghc/ticket/7571 GHC http://www.haskell.org/ghc/ The Glasgow Haskell Compiler