[LLVMdev] nested GEP in a static initializer fails

Joel E. Denny jdenny at etinternational.com
Mon Oct 25 13:17:00 PDT 2010


Hi,

Given this LLVM assembly:

  @a = global i8* getelementptr (i8* null, i64 mul (i64 ptrtoint (i32* getelementptr (i32* null, i32 1) to i64), i64 2))

llc fails an assertion:

  llc: /home/jdenny/llvm-svn/include/llvm/Support/Casting.h:202: typename llvm::cast_retty<To, From>::ret_type llvm::cast(const Y&) [with X = llvm::ConstantInt, Y = llvm::Value*]: Assertion `isa<X>(Val) && "cast<Ty>() argument of incompatible type!"' failed.

This has been reported previously as a bug and was resolved as invalid:

  http://llvm.org/bugs/show_bug.cgi?id=2672

The explanation was:

"I don't think we should try to fold arbitrary expressions in the code 
generator.  Instead, we should accept that targets have limitations on 
these.  We can't ever support things like "void *X = &G / &H;" for 
example."

Are the limitations on what can be placed in a static initializer 
documented somewhere?  When those limitations aren't obeyed, would it be 
possible for llc to print a more intelligible error message for the user?

Thanks.



More information about the llvm-dev mailing list