[LLVMdev] gcc4.4's -O2 is breaking include/llvm/CodeGen/ValueTypes.h
Dan Gohman
gohman at apple.com
Tue Aug 18 18:46:07 PDT 2009
On Aug 18, 2009, at 11:50 AM, Erick Tryzelaar wrote:
> I was running into a problem with compiling llvm with gcc 4.4 on
> fedora 11 with --enable-optimized. I was seeing this warning dozens of
> times:
>
> /net/hakodate/scratch/llvm/llvm/include/llvm/CodeGen/ValueTypes.h: In
> member function
> ‘llvm::SDNode*<unnamed>::SPUDAGToDAGISel::Select(llvm::SDValue)’:
> /net/hakodate/scratch/llvm/llvm/include/llvm/CodeGen/ValueTypes.h:362:
> warning: comparison always false due to limited range of data type
>
> And on "make check" would print out:
>
> llc: /scratch/llvm/llvm/include/llvm/CodeGen/ValueTypes.h:231:
> unsigned int llvm::MVT::getSizeInBits() const: Assertion `0 &&
> "getSizeInBits called on extended MVT."' failed.
> 0 llc 0x0000000000ee2bef
> 1 llc 0x0000000000ee488d
> 2 libpthread.so.0 0x00007f988a8f8e90
> 3 libc.so.6 0x00007f9889c022f5 gsignal + 53
> 4 libc.so.6 0x00007f9889c03b20 abort + 384
> 5 libc.so.6 0x00007f9889bfb2fa __assert_fail + 234
> 6 llc 0x0000000000640421
> llvm::TargetLowering::getTypeToTransformTo(llvm::LLVMContext&,
> llvm::EVT) const + 977
> 7 llc 0x0000000000be1aff
> 8 llc 0x0000000000be6e11
> 9 llc 0x0000000000badf80
> 10 llc 0x0000000000bae9d8
> llvm::SelectionDAG::LegalizeTypes() + 824
> 11 llc 0x0000000000b71c14
> llvm::SelectionDAGISel::CodeGenAndEmitDAG() + 580
> 12 llc 0x0000000000b73d00
> llvm::SelectionDAGISel::SelectBasicBlock(llvm::BasicBlock*,
> llvm::ilist_iterator<llvm::Instruction>,
> llvm::ilist_iterator<llvm::Instruction>) + 96
> 13 llc 0x0000000000b74103
> llvm::SelectionDAGISel::SelectAllBasicBlocks(llvm::Function&,
> llvm::MachineFunction&, llvm::MachineModuleInfo*, llvm::DwarfWriter*,
> llvm::TargetInstrInfo const&) + 707
> 14 llc 0x0000000000b75b90
> llvm::SelectionDAGISel::runOnMachineFunction(llvm::MachineFunction&) +
> 1024
> 15 llc 0x0000000000e7715e
> llvm::FPPassManager::runOnFunction(llvm::Function&) + 574
> 16 llc 0x0000000000e7737b
> llvm::FunctionPassManagerImpl::run(llvm::Function&) + 171
> 17 llc 0x0000000000e775e1
> llvm::FunctionPassManager::run(llvm::Function&) + 81
> 18 llc 0x000000000052418f main + 5247
> 19 libc.so.6 0x00007f9889beda2d __libc_start_main + 253
> 20 llc 0x0000000000522129
> Stack dump:
> 0. Program arguments: llc -march=arm
> 1. Running pass 'ARM Instruction Selection' on function
> '@_ZL6createP6node_tii3v_tS1_d'
>
>
> The problem appears to be gcc 4.4 optimizing away comparisons of one
> plus the last item in the SimpleValueType enum, like this:
>
> bool operator==(const EVT VT) const {
> if (V.SimpleTy == VT.V.SimpleTy) {
> if (V.SimpleTy == MVT::LastSimpleValueType+1)
> return LLVMTy == VT.LLVMTy;
> return true;
> }
> return false;
> }
ValueTypes.h was particularly heavily impacted by the recent API
changes, and it looks like it's a bit disheveled at the moment.
>
> I confirmed this by adding a dummy value to the enum that equals
> LastSimpleValueType+1, and both the warning and the failures in "make
> check" go away. Is this the right thing to do, or is there a better
> way to do this?
At some point, someone should take a take a closer look, though
the change you propose is fine for now.
Dan
More information about the llvm-dev
mailing list