id	summary	reporter	owner	description	type	status	priority	milestone	component	version	resolution	keywords	cc	os	architecture	failure	difficulty	testcase	blockedby	blocking	related
7571	LLVM codegen does not handle integer literals in branch conditionals.	thoughtpolice	thoughtpolice	"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."	bug	closed	normal		Compiler (LLVM)	7.7	fixed	llvm, codegen	dterei mad.one@…	Unknown/Multiple	Unknown/Multiple	Compile-time crash	Unknown		7573	7588, 7589, 7590	#7574, #7575
