use call-clobbered reg to disalign the stack

Jeff Law law@redhat.com
Mon Oct 14 21:25:00 GMT 2019


On 10/7/19 8:42 PM, Alexandre Oliva wrote:
> Some x86 tests of stack realignment, that disaligned the stack with
> pushes and pops, failed when the compiler was configured to tune for a
> target that preferred to accumulate outgoing arguments: the stack
> space is reserved before the asm push, the call sequence overwrites
> the saved register, and then the asm pop restores the overwritten
> value.  Since that's a call-preserved register in 32-bit mode, it
> should be preserved unchanged, but isn't.
> 
> Merely changing the register to a call-clobbered one would be enough,
> but the tests would remain fragile and prone to failure due to other
> optimizations, so I arranged for the compiler to be made aware of the
> register used for the push and the pop, so it won't use it for
> something else, and forced the function to use a frame pointer, so
> that it won't use stack pointer offsets for local variables: the
> offsets would likely be wrong between the asm push and pop.
> 
> Tested on x86_64-linux-gnu with -m64 and -m32.  Ok to install?
> 
> 
> for  gcc/testsuite/ChangeLog
> 
> 	* gcc.target/i386/20060512-1.c (sse2_test): Use a
> 	call-clobbered register variable for stack-disaligning push
> 	and pop.  Require a frame pointer.
> 	* gcc.target/i386/20060512-3.c (sse2_test): Likewise.
OK
jeff
> ---



More information about the Gcc-patches mailing list