On Fri, Feb 7, 2025 at 1:57 PM H.J. Lu <hjl.to...@gmail.com> wrote:
>
> For
>
> ---
> int f(int);
>
> int advance(int dz)
> {
>     if (dz > 0)
>         return (dz + dz) * dz;
>     else
>         return dz * f(dz);
> }
> ---
>
> Before r15-1619-g3b9b8d6cfdf593
>
> advance(int):
>         push    rbx
>         mov     ebx, edi
>         test    edi, edi
>         jle     .L2
>         imul    ebx, edi
>         lea     eax, [rbx+rbx]
>         pop     rbx
>         ret
> .L2:
>         call    f(int)
>         imul    eax, ebx
>         pop     rbx
>         ret
>
> After
>
>  advance(int):
>         test    edi, edi
>         jle     .L2
>         imul    edi, edi
>         lea     eax, [rdi+rdi]
>         ret
> .L2:
>         sub     rsp, 24
>         mov     DWORD PTR [rsp+12], edi
>         call    f(int)
>         imul    eax, DWORD PTR [rsp+12]
>         add     rsp, 24
>         ret
>
> There's no call in if branch, it's not optimal to push rbx at the entry
> of the function, it can be sinked to else branch. When "jle .L2" is not
> taken, it can save one push instruction.  Update pr111673.c to verify
> that this optimization isn't turned off.
Ok
>
> PR rtl-optimization/111673
> * gcc.target/i386/pr111673.c: Verify that PUSH/POP can be
> skipped.
>
>
> --
> H.J.



-- 
BR,
Hongtao

Reply via email to