[LLVMdev] problem with replacing an instruction
Frank Winter
fwinter at jlab.org
Thu Jun 18 15:09:33 PDT 2015
Hi Jon! I guess it makes sense what you say about invalidating "I". I
looked through the LLVM manual but could not find anything about
'replacing in place'. Can I still iterate over the instructions in a
basic block like
for (Instruction& I : BB) {
if (isa<BitCastInst>(I)) {
and change 'I' in place? I said from the plus side.. How's the pseudo
code for that?
Frank
On 06/18/2015 05:02 PM, Jonathan Roelofs wrote:
>
>
> 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
>
More information about the llvm-dev
mailing list