[LLVMdev] insertion points for newly created instructions

Nuno Lopes nunoplopes at sapo.pt
Thu Mar 25 16:08:43 PDT 2010


>>>> I've been scratching my head with a little problem: how to determine 
>>>> the
>>>> insertion point for a newly created instruction?
>>>> The operands of these instructions can be defined in different BBs, and 
>>>> they
>>>> may have several users. Thereby determining where to put those 
>>>> instructions
>>>> is not obvious. In my case, these instructions don't have side-effects, 
>>>> and
>>>> so they could be placed anywhere after the definition of the
>>>> "more-recently-defined" operand, but before the last dominator of all 
>>>> the
>>>> users.
>>>>
>>>> Does LLVM already has any function that will do this (i.e., magically 
>>>> insert
>>>> an instruction in a valid point)?
>>>>
>>> There is no magical utility function available to do this.
>>>
>>
>> That's what I was afraid of :)
>>
>>
>>>> If not, is there any way I can implement
>>>> this without transversing all the instructions in the enclosing 
>>>> function?
>>>>
>>> Find a user that dominates all other users and then insert this
>>> instruction just before the dominating users.
>>>
>>
>> The problem is if none of the users dominates the other ones. That's why 
>> I wanted to somewhat insert the new instruction after the last definition 
>> of the operands. I guess that's a tricky business..
>>
>
> I'm a little confused: are you trying to find a place where your new 
> instruction is dominated by all of the values it uses as operands, are you 
> trying to find a place where your new instruction dominates all 
> instructions that use its value, or both?


Both. Actually that's the necessary condition that all instructions must 
met. I was just trying to figure out if there was already a simple way of 
doing it automatically (i.e., letting llvm insert the instructions where 
appropriate). Something in the style of specifying the computation as a 
data-flow graph, and leave the linearization to the compiler.
Just for the sake of curiosity, I'm lowering certain instructions into 
several other simpler instructions (like lowering multiplications into 
adds/shifts/..), but in a way that the result of these instructions may be 
shared across several intermediate results.
e.g.:
A = B * 2
C = B * 4
I translate that to:
A = B << 1
C = A << 1

so 'B << 1' has 2 users: as the replacement of an operation that was 
previously in the code, and has an intermediate value for another 
computation.  Maybe I should be doing this in the codegen lowering pass 
(dunno if that would help, anyway).

Thanks,
Nuno 




More information about the llvm-dev mailing list