[LLVMdev] Prevent instruction elimination

Devang Patel dpatel at apple.com
Tue Oct 26 10:21:04 PDT 2010


On Oct 26, 2010, at 9:23 AM, Xinfinity wrote:

> 
> Hello,
> 
> 
> Devang Patel wrote:
>> 
>> 
>> On Oct 25, 2010, at 12:09 PM, Xinfinity wrote:
>> 
>>> #pragma my_pragma{
>>> code
>>> }
>> 
>>> I use a map
>>> (source_location, pragma) and I insert the dummy instruction when this
>>> location is reached in the code generator. It seems difficult to attach
>>> the
>>> metadata to the first and the last instruction emitted for the compound
>>> statement, as the "code" inside the pragma region can be anything.
>>> 
>>> Do you consider it would be a better idea to attach metadata to all
>>> instructions emitted between source_location marking the beginning and
>>> the
>>> source_location marking the end of the region?
>> 
>> Yes, that's how, now, we keep track of lexical scopes for debug info's
>> use.
>> -
>> Devang
>> 
>> 
> It seems I need some more guidance in these matters. So the plan is to
> attach metadata to all instructions contained in the scope of the pragma. In
> this respect, I create a boolean inside CodeGenFunction which is set to true
> once we reach the pragma and reset to false, when we exit the pragma scope.
> The set and reset functions are called from 
> CGStmt in EmitCompoundStmt, if there is a pragma corresponding to the left
> brace and the right brace of the compound statement.
> 
> Next, I tried to attach metadata to all instructions emitted, if the boolean
> is set to true. However this is rather a tedious work, as it implies
> modifying all files in clang::CodeGen. Actually, for each generated
> instruction I should check if it is in the pragma region and in this case
> attach metadata info. I am not sure if tracking all the instructions and
> verifying them is the best idea.
> 
> Another idea would be to create a boolean as part of the IRBuilder and set
> it from CodeGen. And for each instruction inserted by the IRBuilder to check
> the boolean and attach metadata if necessary. But I think this is too
> specialized to my particular needs and it would not be a good solution.
> Is there a cleaner method? 

Setting a bit in IRBuilder is simpler. Why not use special purpose IRBuilder based on standard IRBuilder ?
Another alternative is to take two step approach:

step 1: insert special intrinsics to mark begin and end of your special scopes.
step 2: immediately after clang finishes generating IR, run your special pass to remove your special intrinsics and update all instructions in the scope appropriately. 

This  way, you'll be able to localize your changes. 

-
Devang






More information about the llvm-dev mailing list