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