[LLVMdev] Moving dependent code into conditional statements

Chris Lattner clattner at apple.com
Wed Oct 14 08:22:53 PDT 2009


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 (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

-------------- next part --------------
An HTML attachment was scrubbed...
URL: <http://lists.llvm.org/pipermail/llvm-dev/attachments/20091014/c60a1b3d/attachment.html>


More information about the llvm-dev mailing list