https://gcc.gnu.org/bugzilla/show_bug.cgi?id=69041

Andrew Pinski <pinskia at gcc dot gnu.org> changed:

           What    |Removed                     |Added
----------------------------------------------------------------------------
           Severity|normal                      |enhancement
            Summary|Unnecessary push/pop of     |Unnecessary push/pop of
                   |caller-save register (ecx)  |caller-save register (ecx)
                   |on 32bit with vector        |on 32bit with vector
                   |intrinsics.  Sometimes      |intrinsics.
                   |without the pop, clobbering |
                   |ebp (callee-save)           |
           Keywords|wrong-code                  |

--- Comment #2 from Andrew Pinski <pinskia at gcc dot gnu.org> ---
>clobbers the caller's ebp with the pushed value of ecx, but the esp=ebp part 
>of leave cleans up after the mismatched push/pop

This is wrong. Leave does the pop.
Basically leave is `sp = ebp + 4; ebp = [ebp];`

So no wrong code. Just missed optimizations.

The removal of the stack frame happened in GCC 6 for dummy/dummy2.


The removal of vzeroupper for dummy/dummy2 happened in GCC 9.

Looks like there is still a frame pointer creation happening for add_pixdiff; I
have not looked into why though

Reply via email to