[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