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

zhi chen zchenhn at gmail.com
Fri Apr 17 13:19:39 PDT 2015


Thank you Nick, that's was a stupid error.

On Fri, Apr 17, 2015 at 12:28 PM, Nick Lewycky <nicholas at mxc.ca> wrote:

> zhi chen wrote:
>
>> Thanks Nick, that's something what I am trying to implement as the
>> following. But it seems I still only get the constant value not the
>> instruction. Could you please go over the following instruction and see
>> what wrong with it? Thanks for your time again.
>>
>>    Value *vecVal = NULL;
>>    IRBuilder<> builder(&*pInst);
>>    Type *vecTy = VectorType::get(Type::getDoubleTy(ctxt), 2);
>>    Value *emptyVec = UndefValue::get(vecTy);
>>    Type* u32Ty = Type::getInt32Ty(currF->getContext());
>>    Value *index0 =  ConstantInt::get(u32Ty, 0);
>>    Value *index1 =  ConstantInt::get(u32Ty, 1);
>>
>>     Instruction *InsertVal = InsertElementInst::Create(emptyVec, oprnd,
>> index0, "insert");
>>
>
> This makes you:
>
> %insert = insertelement <2 x double> undef, double %oprnd, i32 0
>
> So far so good.
>
>      InsertVal = InsertElementInst::Create(emptyVec, oprnd, index1,
>> "insert");
>>
>
> This makes you:
>
> %insert1 = insertelement <2 x double> undef, double %oprnd, i32 1
>
> Not what you wanted. You meant to create:
>
> %insert1 = insertelement <2 x double> %insert, double %oprnd, i32 1
>
> by calling
>
> InsertVal = InsertElementInst::Create(InsertVal, oprnd, index1,  "insert");
>
>      vecVal = builder.CreateFAdd(emptyVec, emptyVec, "");
>>
>
> This makes you:
>
> %0 = fadd <2 x double> undef, undef
>
> which constant folds away into a non-instruction. You wanted to sum
>
> vecVal = builder.CreateFAdd(InsertVal, [...], "");
>
> where the [...] is because you haven't yet written the code to create the
> second vector (%5) yet.
>
> Nick
>
>
>
>> Best,
>> Zhi
>>
>> On Fri, Apr 17, 2015 at 12:17 PM, Nick Lewycky <nicholas at mxc.ca
>> <mailto:nicholas at mxc.ca>> wrote:
>>
>>     zhi chen wrote:
>>
>>         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?
>>
>>
>>     %4 = <double %1, double %1> isn't valid syntax, the way you would do
>>     it is:
>>
>>     %tmp4 = insertelement <2 x double> undef, double %1, i32 0
>>     %4 = insertelement <2 x double> %A, double %1, i32 1
>>
>>     and similarly for %5, then you create the fadd of the two of them.
>>
>>     Nick
>>
>>
>>         Thanks,
>>         Best
>>
>>
>>         On Fri, Apr 17, 2015 at 1:56 AM, Nick Lewycky <nicholas at mxc.ca
>>         <mailto:nicholas at mxc.ca>
>>         <mailto:nicholas at mxc.ca <mailto: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>
>>         <mailto:zchenhn at gmail.com <mailto:zchenhn at gmail.com>>
>>         <mailto:zchenhn at gmail.com <mailto:zchenhn at gmail.com>
>>         <mailto: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>
>>         <mailto:dberlin at dberlin.org <mailto:dberlin at dberlin.org>>
>>         <mailto:dberlin at dberlin.org <mailto:dberlin at dberlin.org>
>>         <mailto: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>
>>         <mailto:zchenhn at gmail.com <mailto:zchenhn at gmail.com>>
>>         <mailto:zchenhn at gmail.com <mailto:zchenhn at gmail.com>
>>         <mailto: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>
>>         <mailto:zchenhn at gmail.com <mailto:zchenhn at gmail.com>>
>>         <mailto:zchenhn at gmail.com <mailto:zchenhn at gmail.com>
>>         <mailto: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>
>>         <mailto:t.p.northover at gmail.com <mailto:t.p.northover at gmail.com>>
>>         <mailto:t.p.northover at gmail.com <mailto:t.p.northover at gmail.com>
>>         <mailto: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>
>>         <mailto:LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>>
>>         <mailto:LLVMdev at cs.uiuc.edu <mailto:LLVMdev at cs.uiuc.edu>
>>         <mailto: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 <mailto:LLVMdev at cs.uiuc.edu>
>>         <mailto:LLVMdev at cs.uiuc.edu <mailto: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/84ff4dea/attachment.html>


More information about the llvm-dev mailing list