[LLVMdev] mem2reg for non entry blocks?

John Criswell criswell at illinois.edu
Tue Feb 26 08:39:50 PST 2013


On 2/26/13 8:06 AM, Duncan Sands wrote:
> Hi Justin,
>
>>     an alloca outside of the entry block might be inside a loop, in 
>> which case the
>>     semantics are that it would allocate more stack space on every 
>> loop iteration.
>>     I think some of the optimizers that run later try to move allocas 
>> into the entry
>>     block if possible, but in general it is simpler to have the 
>> front-end just put
>>     them there in the first place.
>>
>>
>> Mem2reg is already changing that semantic, though.  If I use an 
>> "alloca i32" in
>> the entry block, then I am saying I want 4 bytes of stack space, but 
>> mem2reg may
>> replace that with registers.
>
> the problem isn't with mem2reg changing the amount of used stack 
> space, it's
> that those semantics get in the way of the mem2reg transform.  For 
> example,
> as you get new stack space each time round the loop, a write to the 
> alloca
> can't be retrieved by reading it back from the alloca next time round the
> loop, because it isn't the same memory.  This is quite different to 
> how things
> work if the alloca is in the entry block.

I think it might be useful to separate what is possible versus what is 
done for practicality.

I believe that there is no technical reason for mem2reg to restrict 
itself to allocas within the entry block.  It should be possible to 
promote allocas not within the entry block into SSA registers provided 
that they meet certain restrictions.  Off the top of my head, those 
restrictions are ensuring that the alloca is not in a loop and ensuring 
that the returned pointer doesn't escape the function.  I suspect that 
allocas that don't dominate all of the basic blocks in the function 
might require special handling.

My guess is that mem2reg limits itself to allocas within the entry block 
because that is where nearly all allocas that can be converted reside, 
and there's little benefit (at least for C/C++) in trying to promote 
allocas that aren't in the entry block.  Mem2reg was originally built so 
that front-ends (namely the original llvm-gcc) wouldn't have to do SSA 
construction; since llvm-gcc put its allocas in the entry block, there 
probably wasn't a need to promote other allocas.

If you want to promote allocas outside the entry block, you can probably 
implement an algorithm to do it.  I think mem2reg doesn't do it because 
it hasn't been worth the trouble.

-- John T.

>
> Ciao, Duncan.
> _______________________________________________
> 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