[LLVMdev] <badref> showed up when duplicating a list of dependent instructions
Chuck Zhao
czhao at eecg.toronto.edu
Mon May 9 08:21:31 PDT 2011
Duncan,
I see.
Seems the per-operand value mapping is also needed, and is currently
missing.
Thank you
Chuck
On 5/9/2011 11:13 AM, Duncan Sands wrote:
> Hi Chuck,
>
>> std::vector<Instruction *>::iterator p;
>> Instruction * pi = PREVIOUS_POSITION;
>> BasicBlock * pb = PREVIOUS_POSITION->getParent();
>>
>> for(p = coll.begin(); p != coll.end(); ++p){
>> Instruction * CurI = * p;
>> Instruction * CloneI = CurI->clone();
> clone doesn't know have any magical way of knowing that it should update the
> instruction's operands to point to the clone you created earlier. For example,
> consider
>
> %l = load i32* @ins_h, align 4
> %s = shl i32 %l, 5
>
> You clone %l, getting:
> %lc = load i32* @ins_h, align 4
> You clone %s, getting:
> %sc = shl i32 %l, 5
> But %sc still has %l as an operand. You want it to have %lc as an
> operand, which requires doing more.
>
> Ciao, Duncan.
>
>> CloneI->setName(CurI->getName());
>> errs()<< *CloneI<< "\n";
>> pb->getInstList().insertAfter(pi, CloneI); // Inserts newInst after pi in pb
>>
>> // adjust pi: point to the newly inserted inst:
>> pi = CurI;
>>
>> }//end of for loop on p
>>
>>
>> However, I got the following errors:
>>
>> --- Insert New (cloned) Instructions: ...
>> <badref> = load i32* @strstart, align 4
>> <badref> = add i32<badref>, 2
>> <badref> = load i32* @ins_h, align 4
>> <badref> = getelementptr inbounds [65536 x i8]* @window, i32 0, i32<badref>
>> <badref> = shl i32<badref>, 5
>> <badref> = load i8*<badref>, align 1
>> %.masked = and i32<badref>, 32736
>> <badref> = zext i8<badref> to i32
>> <badref> = xor i32<badref>, %.masked
>> %.sum73 = or i32<badref>, 32768
>> <badref> = getelementptr inbounds [65536 x i16]* @prev, i32 0, i32 %.sum73
>> %take_addr2 = getelementptr i16*<badref>
>> <badref> = bitcast i16* %take_addr2 to i8*
>> call void @bkp_memory(i8*<badref>, i32 2)
>> Instruction does not dominate all uses!
>> %95 = add i32 %93, 2
>> %90 = getelementptr inbounds [65536 x i8]* @window, i32 0, i32 %95
>> Instruction does not dominate all uses!
>> %97 = getelementptr inbounds [65536 x i8]* @window, i32 0, i32 %95
>> %92 = load i8* %97, align 1
>> Instruction does not dominate all uses!
>> %.masked = and i32 %91, 32736
>> %101 = xor i32 %100, %.masked
>> Broken module found, compilation aborted!
>>
>>
>> What am I doing wrong here?
>> Does the<badref> sound alarm to anyone?
>> What is the right approach I should take here?
>>
>>
>> Thank you very much
>>
>> Chuck
>>
>>
>>
>>
>>
>>
>> _______________________________________________
>> LLVM Developers mailing list
>> 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
More information about the llvm-dev
mailing list