rs6000: Don't touch below the stack pointer (PR77687)
authorSegher Boessenkool <segher@kernel.crashing.org>
Wed, 20 Sep 2017 21:48:31 +0000 (23:48 +0200)
committerSegher Boessenkool <segher@gcc.gnu.org>
Wed, 20 Sep 2017 21:48:31 +0000 (23:48 +0200)
commit6073d0028debf7cbd80dc0678402cbe2c6ea652d
treefc2fcb802e5a5fb4290674455ed642597118e67b
parent9283471ba0d8b605a5ddf8cbd2814d81d4dd8550
rs6000: Don't touch below the stack pointer (PR77687)

With the 32-bit SVR4 ABI we don't have a red zone, so we have to restore
the callee-saved registers before we restore the stack pointer.

The previous fix for this PR failed in two ways, for huge frames: first,
we use a negative offset from r11 in that case, so the (mem:BLK 11) access
does no good; second, sched does not handle accesses to mem:BLK correctly
in this case (does not make dependencies).

This patch fixes it by doing a store to (mem:BLK (scratch)) instead.
This means no unrelated (not to stack) loads/stores can be moved over the
stack restore either, but so be it.

PR target/77687
* config/rs6000/rs6000.md (stack_restore_tie): Store to a scratch
address instead of to r1 and r11.

gcc/testsuite/
PR target/77687
* gcc.target/powerpc/pr77687.c: New testcase.

From-SVN: r253033
gcc/ChangeLog
gcc/config/rs6000/rs6000.md
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/powerpc/pr77687.c [new file with mode: 0644]