[LLVMdev] how to use "new instruction()"

Nick Lewycky
2015-04-17T08:56:46Z

zhi chen wrote:
> It seems that the problem was because I used  builder.CreateFAdd to
> create a <2 x double> vectortype FADD instruction. It works if I use
it
> to create the scalar version FADD. I want to have an instruction like:
> *%2 = fadd <2 x double> undef, <2 x double> undef. *The
following is the
> way I used to create the vectorized FADD instruction:
>
> //pInst is a double type instruction
>
>    Type *vecTy = VectorType::get(pInst->getType(), 2);
> Value *emptyVec = UndefValue::get(vecTy);
>    IRBuilder<> builder(&*pInst);
>    Value *dupVal = builder.CreateFAdd(emptyVec, emptyVec, instName);
>    std::cout << " dupVal " << *dupVal <<
"\n";
>
> It outputs:  dupVal <2 x double> <double fadd (double undef,
double
> undef), double fadd (double undef, double undef)>
>
> If I dyn_cast the dupVal to instruction type (dupInst) and print
> dupInst, it outputs: "dupInst printing a <null> value"
> But if I use Instruction *dupInst = (Instruction *) dupVal and print it,
> I'll get:
> dupInst <2 x double> <double fadd (double undef, double undef),
double
> fadd (double undef, double undef)>
>
> It seems that if simply fails to generate the vectorized FADD
> instruction. Anything wrong with my code?

IRBuilder gave you back a constant instead of an Instruction. This is
why it returns a Value*. For a simple example, if you ask it to create
"add i32 1, 2" it will not return an add instruction, it will instead
return "i32 3" which is a ConstantInt.

In your case, it returned to you a ConstantExpr whose getOpcode() shows
Instruction::FAdd, and getOperand(0) and getOperand(1) show 'undef', but
it is not an instruction. "Undef" is treated as a constant, so an fadd
between two constants gets you a constant instead of an instruction.

Usually it won't matter, just build the function top down and don't look
at whether you're getting an Instruction* or Constant* and everything
will be fine.

Nick

>
> Best,
> Zhi
>
>
>
>
>
> On Thu, Apr 16, 2015 at 11:55 PM, zhi chen <zchenhn at gmail.com
> <mailto:zchenhn at gmail.com>> wrote:
>
>     Yes. I was using this. It seems the produced instruction is not
>     correct. There are probably some other problems. I need to recheck
>     it. Thanks for your help, Daniel.
>
>     Best,
>     Zhi
>
>     On Thu, Apr 16, 2015 at 11:40 PM, Daniel Berlin <dberlin at
dberlin.org
>     <mailto:dberlin at dberlin.org>> wrote:
>
>         Value * is the instruction.
>
>         use dyn_cast<Instruction> to get to it.
>
>
>         On Thu, Apr 16, 2015 at 11:39 PM zhi chen <zchenhn at gmail.com
>         <mailto:zchenhn at gmail.com>> wrote:
>
>             But IRBuilder.CreateXYZ only returns a "VALUE" type.
Can I
>             get the instruction created by it? For example,
>
>             IRBuilder<> builder(&*pinst);
>             Value *val = builder.CreateFAdd(LV, RV, "");
>
>             How can I get the fadd instruction created by builder?
>
>             On Thu, Apr 16, 2015 at 8:52 PM, zhi chen <zchenhn at
gmail.com
>             <mailto:zchenhn at gmail.com>> wrote:
>
>                 Yes. That's what I was the solution in my mind. But I
>                 just wanted to know if there was a generic way to save
>                 some code...
>
>                 On Thu, Apr 16, 2015 at 8:32 PM, Tim Northover
>                 <t.p.northover at gmail.com
>                 <mailto:t.p.northover at gmail.com>> wrote:
>
>                     >  I understand that I can detect the operation
>                     first, and use "create" to
>                     >  create for each of them. But I don't if there
is a
>                     generic way to do this
>                     >  because if might be add/sub/mul... operations.
>
>                     I don't think there is. Realistically, just blindly
>                     replacing
>                     instructions with vector equivalents is only going
>                     to work in a few
>                     cases anyway. You're probably best to intentionally
>                     detect those cases
>                     and call the correct CreateXYZ function.
>
>                     Cheers.
>
>                     Tim.
>
>
>
>             _______________________________________________
>             LLVM Developers mailing list
>             LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>             http://llvm.cs.uiuc.edu
>             http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev