[LLVMdev] Failure to optimize ? operator

Brent Walker brenthwalker at gmail.com
Wed Dec 14 05:19:59 PST 2011


I don't understand your point.  Which version is better does NOT
depend on what inputs are passed to the function.  The compiled code
for (as per llvm) f1 will always take less time to execute than f2.

for x > 0 => T(f1) < T(f2)
for x <= 0 => T(f1) = T(f2)

where T() is the time to execute the given function.

So always T(f1) <= T(f2).

I would call this a missed optimization opportunity.  I think it
warrants a bug report.

If I do the same experiment with gcc I get identical code for the two functions:

==============================================
_f1:        pushl   %ebp        xorl    %eax, %eax        movl
%esp, %ebp        movl    8(%ebp), %edx        testl   %edx, %edx
  jle     L5        popl    %ebp        ret        .p2align 4,,7L5:
    movl    %edx, %ecx        imull   %edx, %ecx        popl    %ebp
     leal    3(%ecx,%ecx,4), %eax        imull   %edx, %eax
leal    1(%eax,%ecx,2), %eax        ret        .p2align 4,,15
_f2:
        pushl   %ebp        xorl    %eax, %eax        movl    %esp,
%ebp        movl    8(%ebp), %edx        testl   %edx, %edx        jle
    L9        popl    %ebp        ret        .p2align 4,,7L9:
movl    %edx, %ecx        imull   %edx, %ecx        popl    %ebp
 leal    3(%ecx,%ecx,4), %eax        imull   %edx, %eax        leal
1(%eax,%ecx,2), %eax
ret==============================================

Brent


On Wed, Dec 14, 2011 at 9:58 AM, Eli Friedman <eli.friedman at gmail.com> wrote:
> On Tue, Dec 13, 2011 at 5:59 AM, Brent Walker <brenthwalker at gmail.com> wrote:
>> The following seemingly identical functions, get compiled to quite
>> different machine code.  The first is correctly optimized (the
>> computation of var y is nicely moved into the else branch of the "if"
>> statement), which the second one is not (the full computation of var y
>> is always done).  The output was produced using the demo page on
>> llvm's web site (optimization level LTO).
>>
>> Can someone shed some light on this strange behavior?
>
> The IR you're seeing is the IR we naturally generate for the given IR,
> and LLVM doesn't have an optimization to turn your f2 into f1.  Which
> version is better depends on the values passed into the function,
> which makes it a bit tricky to write an optimization to turn one into
> the other.
>
> -Eli




More information about the llvm-dev mailing list