use call-clobbered reg to disalign the stack
authorAlexandre Oliva <oliva@adacore.com>
Wed, 9 Oct 2019 01:14:02 +0000 (01:14 +0000)
committerAlexandre Oliva <aoliva@gcc.gnu.org>
Wed, 9 Oct 2019 01:14:02 +0000 (01:14 +0000)
commit4e78c6883f97bf45eeb1ad3041dcf2e2de01912c
treef1501df656c903e2d98944667905fc93de3969ec
parentffbef318488159e807d93c0cf43f0d72417e5dfc
use call-clobbered reg to disalign the stack

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.

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.

From-SVN: r276751
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/20060512-1.c
gcc/testsuite/gcc.target/i386/20060512-3.c