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