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