[LLVMdev] gcc4.4's -O2 is breaking include/llvm/CodeGen/ValueTypes.h

Erick Tryzelaar idadesub at users.sourceforge.net
Tue Aug 18 11:50:50 PDT 2009


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;
      }

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?




More information about the llvm-dev mailing list