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

Nick Lewycky nicholas at mxc.ca
Fri Apr 17 12:17:03 PDT 2015


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
>
>
>




More information about the llvm-dev mailing list