Does anyone know how to instrument *double* to <2 x doulbe>**, e.g., 2.2 --> <2.2, 2.2>? For example, I want to change the following IR code %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 %i.021 %1 = load double* %arrayidx1, align 4, !tbaa !0 to: %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 %i.021 %1 = bitcast double* %arrayidx1 to <2 x double>* %2 = load <2 x double>* %1, align 4 what I right now doing is: *Assume pInst is *%1 = load double* %arrayidx1, align 4, !tbaa !0 Value *loadValue = pInst->getOperand(0); Type *vecTy = VectorType::get(Type::getDoublePtrTy(currF->getContext()), 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, loadValue, index0, ""); InsertVal = InsertElementInst::Create(emptyVec, loadValue, index1, ""); InsertVal->insertBefore(pInst); It turned out that the way I am doing is not right because the output is <2 x double*>. Any help will be appreciated! BTW, can I use bitcastInst (*if so, how?*) or I have to use insertelementInst? Thanks, Zhi -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150416/1e4dd80f/attachment.html>
The result of getelementptr is a pointer to double, you want a pointer to 2 x double, not a type of 2 x double *. So, you need to make a pointer to a 2 x double (writing from memory, so syntax may be off, but conceptually this should be right) vecPtrTy = Type::getUnqualPtr(VectorType:get(Type::getDoubleTy(), 2)); -- Mats On 16 April 2015 at 08:46, zhi chen <zchenhn at gmail.com> wrote:> Does anyone know how to instrument double* to <2 x doulbe>*, e.g., 2.2 --> > <2.2, 2.2>? > For example, I want to change the following IR code > > %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 > %i.021 > %1 = load double* %arrayidx1, align 4, !tbaa !0 > > to: > > %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 > %i.021 > %1 = bitcast double* %arrayidx1 to <2 x double>* > %2 = load <2 x double>* %1, align 4 > > what I right now doing is: > Assume pInst is %1 = load double* %arrayidx1, align 4, !tbaa !0 > > Value *loadValue = pInst->getOperand(0); > Type *vecTy = VectorType::get(Type::getDoublePtrTy(currF->getContext()), 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, loadValue, > index0, ""); > InsertVal = InsertElementInst::Create(emptyVec, loadValue, index1, ""); > InsertVal->insertBefore(pInst); > > It turned out that the way I am doing is not right because the output is <2 > x double*>. Any help will be appreciated! > > BTW, can I use bitcastInst (if so, how?) or I have to use insertelementInst? > > Thanks, > Zhi > > _______________________________________________ > LLVM Developers mailing list > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev >
Thanks, Mats. But, it seems that there is no getUnqualPtr member function in Type. Best, Zhi On Thu, Apr 16, 2015 at 1:46 AM, mats petersson <mats at planetcatfish.com> wrote:> The result of getelementptr is a pointer to double, you want a pointer > to 2 x double, not a type of 2 x double *. > > So, you need to make a pointer to a 2 x double (writing from memory, > so syntax may be off, but conceptually this should be right) > vecPtrTy = Type::getUnqualPtr(VectorType:get(Type::getDoubleTy(), 2)); > > -- > Mats > > On 16 April 2015 at 08:46, zhi chen <zchenhn at gmail.com> wrote: > > Does anyone know how to instrument double* to <2 x doulbe>*, e.g., 2.2 > --> > > <2.2, 2.2>? > > For example, I want to change the following IR code > > > > %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 > > %i.021 > > %1 = load double* %arrayidx1, align 4, !tbaa !0 > > > > to: > > > > %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 > > %i.021 > > %1 = bitcast double* %arrayidx1 to <2 x double>* > > %2 = load <2 x double>* %1, align 4 > > > > what I right now doing is: > > Assume pInst is %1 = load double* %arrayidx1, align 4, !tbaa !0 > > > > Value *loadValue = pInst->getOperand(0); > > Type *vecTy = VectorType::get(Type::getDoublePtrTy(currF->getContext()), > 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, loadValue, > > index0, ""); > > InsertVal = InsertElementInst::Create(emptyVec, loadValue, index1, ""); > > InsertVal->insertBefore(pInst); > > > > It turned out that the way I am doing is not right because the output is > <2 > > x double*>. Any help will be appreciated! > > > > BTW, can I use bitcastInst (if so, how?) or I have to use > insertelementInst? > > > > Thanks, > > Zhi > > > > _______________________________________________ > > 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/20150416/bb59fa2a/attachment.html>
Sorry. You probably mean pointerType::getUnqual(VectorType::get(Type::getDoubleTy(LLVMContext), 2)); On Thu, Apr 16, 2015 at 1:46 AM, mats petersson <mats at planetcatfish.com> wrote:> The result of getelementptr is a pointer to double, you want a pointer > to 2 x double, not a type of 2 x double *. > > So, you need to make a pointer to a 2 x double (writing from memory, > so syntax may be off, but conceptually this should be right) > vecPtrTy = Type::getUnqualPtr(VectorType:get(Type::getDoubleTy(), 2)); > > -- > Mats > > On 16 April 2015 at 08:46, zhi chen <zchenhn at gmail.com> wrote: > > Does anyone know how to instrument double* to <2 x doulbe>*, e.g., 2.2 > --> > > <2.2, 2.2>? > > For example, I want to change the following IR code > > > > %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 > > %i.021 > > %1 = load double* %arrayidx1, align 4, !tbaa !0 > > > > to: > > > > %arrayidx1 = getelementptr inbounds [100 x double]* @main.B, i32 0, i32 > > %i.021 > > %1 = bitcast double* %arrayidx1 to <2 x double>* > > %2 = load <2 x double>* %1, align 4 > > > > what I right now doing is: > > Assume pInst is %1 = load double* %arrayidx1, align 4, !tbaa !0 > > > > Value *loadValue = pInst->getOperand(0); > > Type *vecTy = VectorType::get(Type::getDoublePtrTy(currF->getContext()), > 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, loadValue, > > index0, ""); > > InsertVal = InsertElementInst::Create(emptyVec, loadValue, index1, ""); > > InsertVal->insertBefore(pInst); > > > > It turned out that the way I am doing is not right because the output is > <2 > > x double*>. Any help will be appreciated! > > > > BTW, can I use bitcastInst (if so, how?) or I have to use > insertelementInst? > > > > Thanks, > > Zhi > > > > _______________________________________________ > > LLVM Developers mailing list > > LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu > > http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev > > >-- PhD Student Department of Computer Science University of California, Irvine -------------- next part -------------- An HTML attachment was scrubbed... URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20150416/be79a9b0/attachment.html>