[LLVMdev] problem with replacing an instruction

Jonathan Roelofs jonathan at codesourcery.com
Thu Jun 18 14:02:22 PDT 2015



On 6/18/15 2:40 PM, Frank Winter wrote:
> I am trying to change this
>
> define void @main(float* noalias %arg0, float* noalias %arg1, float*
> noalias %arg2) {
> entrypoint:
>    %0 = bitcast float* %arg1 to <4 x float>*
>
> intothis
>
> define void @main(float* noalias %arg0, float* noalias %arg1, float*
> noalias %arg2) {
> entrypoint:
>    %0 = getelementptr float* %arg1, i64 0
>    %1 = bitcast float* %0 to <4 x float>*
>
>
> I must be close but the final instruction replacement results in a
> segfault.
>
>
>    for (Instruction& I : BB) {
I think the problem might be that the iterator here
>      if (isa<BitCastInst>(I)) {
>        BitCastInst* BCI = dyn_cast<BitCastInst>(&I);
>        for (Use& U : I.operands()) {
>            Value* V = U.get();
>            if (!dyn_cast<Instruction>(V)) {
>              // must be a function's argument
>              std::vector<llvm::Value*> vect_1;
>              vect_1.push_back(Builder->getInt64(0));
>              llvm::GetElementPtrInst* gep1 =
> llvm::GetElementPtrInst::Create(V, ArrayRef< Value * >(vect_1) );
>              BB.getInstList().insert(&I, gep1);
>
>              llvm::BitCastInst *bci = new BitCastInst (gep1,
> BCI->getDestTy() );
>              llvm::ReplaceInstWithInst( &I , bci );
is being invalidated here because you're deleting the thing that it 
points at.

You can avoid deleting it if you update the bitcast instruction in place 
instead. On the plus side, that avoids an unnecessary allocation.


Jon

>            }
>         }
>      }
>   }
>
> What am I missing?
>
> Thanks,
> Frank
>
>
>
>
> _______________________________________________
> LLVM Developers mailing list
> LLVMdev at cs.uiuc.edu         http://llvm.cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev

-- 
Jon Roelofs
jonathan at codesourcery.com
CodeSourcery / Mentor Embedded



More information about the llvm-dev mailing list