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

zhi chen zchenhn at gmail.com
Fri Apr 17 10:48:08 PDT 2015


I got it. Thanks, Nick. So, it is back to the previous problem. If I have
the following instruction:

%3 = fadd double %1, double %2

I want to change it into
%6 = fadd <2 x double> %4, double %5

where %4 = <double %1, double %1>, %5 = <double %2, double %2>, how can I
do this?

Thanks,
Best


On Fri, Apr 17, 2015 at 1:56 AM, Nick Lewycky <nicholas at mxc.ca> wrote:

> 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
>>
>
>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150417/1a7c5d29/attachment.html>


More information about the llvm-dev mailing list