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

zhi chen zchenhn at gmail.com
Fri Apr 17 12:22:54 PDT 2015


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");
   InsertVal = InsertElementInst::Create(emptyVec, oprnd, index1, "insert");

   vecVal = builder.CreateFAdd(emptyVec, emptyVec, "");

Best,
Zhi

On Fri, Apr 17, 2015 at 12:17 PM, Nick Lewycky <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>> 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>>> 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>>> 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>>> 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>>> 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>>> 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>>
>>         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>
>>         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/537d668d/attachment.html>


More information about the llvm-dev mailing list