[LLVMdev] Moving dependent code into conditional statements
Vikram S. Adve
vadve at illinois.edu
Wed Oct 14 10:54:35 PDT 2009
On Oct 14, 2009, at 10:22 AM, Chris Lattner wrote:
>
> On Oct 14, 2009, at 12:21 AM, Nicolas Capens wrote:
>
>> Hi all,
>>
>> Is there any existing optimization pass that will move as much code
>> into the body of a forward branch as possible? Consider the
>> following example:
>
> Hi Nicolas,
>
> Instcombine does this in simple cases
The general version of this looks like classical PRE.
--Vikram
Associate Professor, Computer Science
University of Illinois at Urbana-Champaign
http://llvm.org/~vadve
> (see "See if we can trivially sink this instruction to a successor
> basic block.") but it misses this case because the if gets folded
> into a select early. It was also not handling the "phi use" case
> very aggressively, which I fixed in r84103. We now sink the divide
> and add in this example:
>
> int foo(int x)
> {
> for(int i = 0; i < 1000000; i++)
> {
> int y = (x + 1) / x; // Expensive calculation! Result
> written to memory.
>
> if(x == 0) // Forward branch
> {
> bar();
> x = y; // Body
> }
> }
>
> return x;
> }
>
>
> -Chris
>
>
>>
>> int foo(int x)
>> {
>> for(int i = 0; i < 1000000; i++)
>> {
>> int y = (x + 1) / x; // Expensive calculation! Result
>> written to memory.
>>
>> if(x == 0) // Forward branch
>> {
>> x = y; // Body
>> }
>> }
>>
>> return x;
>> }
>>
>> It appears that LLVM compiles this quite literally, performing the
>> expensive calculation a million times. Yet it could be rewritten
>> like this:
>>
>> int foo(int x)
>> {
>> for(int i = 0; i < 1000000; i++)
>> {
>> if(x == 0) // Unlikely to hit
>> {
>> int y = (x + 1) / x;
>> x = y;
>> }
>> }
>>
>> return x;
>> }
>>
>> This runs way faster.
>>
>> I noticed there’s a loop hoisting optimization (moving as many
>> independent operations out of the body of a backward branch), but
>> I’m looking for its twin. Did I overlook it or is it not yet
>> supported?
>>
>> Thanks,
>>
>> Nicolas
>> _______________________________________________
>> LLVM Developers mailing list
>> LLVMdev at cs.uiuc.edu http://llvm.cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvmdev
>
> <ATT00001.txt>
-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20091014/6dcdeee2/attachment.html>
More information about the llvm-dev
mailing list