[LLVMdev] A problem creating operands for a new IR instruction to the mailing list

Jeffrey Yasskin jyasskin at google.com
Tue May 5 21:18:05 PDT 2009


2009/5/5 seventh moon <suigintou_ at hotmail.com>:
> Thank you for your answer.  But there is still a problem.
>
> You seem correct about how to define a constant operand.  So I added it into
> my code, like so:
>        Builder.SetInsertPoint(LLVMBB, I);
>        Constant *C = ConstantInt::get(APInt(32, 5, false));
>         Instruction *newI=Builder.Create! Load(C,"");
>
> It compiles. But it still aborts at runtime with a complaint that the type
> is not right.
> This leads me to think that immediate loads are not generated with the
> CreateLoad
> instruction?

Correct. Immediates are already Value*s in LLVM IR; you don't have to
load them. You may want to read http://llvm.org/docs/LangRef.html for
descriptions of the instructions and the arguments they take. And
http://llvm.org/docs/ProgrammersManual.html#Value for a description of
the Value class.

> Another person's reply to my question indicated that a way to avoid
> inserting the
> immediate load entirely; but that is also not what I want, because my
> explicit purpose
> in inserting this load is to claim a register.

I'd bet that's not actually your purpose. Why do you think you need to
claim a register? Note that LLVM pseudo-registers (the things
Instructions define) are not at all the same as machine registers.

If you really want an Instruction, you can bitcast the constant to its
original type. So:

  new BitCastInst(ConstantInt::get(Type::Int32Ty, 5), Type::Int32Ty, I);

Don't use the IRBuilder to create the BitCast because it'll
constant-fold it into a ConstantExpr, which isn't an Instruction.

Jeffrey




More information about the llvm-dev mailing list