This is the mail archive of the
gcc-cvs@gcc.gnu.org
mailing list for the GCC project.
r235334 - in /branches/gcc-4_9-branch/gcc: Chan...
- From: krebbel at gcc dot gnu dot org
- To: gcc-cvs at gcc dot gnu dot org
- Date: Thu, 21 Apr 2016 11:50:22 -0000
- Subject: r235334 - in /branches/gcc-4_9-branch/gcc: Chan...
Author: krebbel
Date: Thu Apr 21 11:50:22 2016
New Revision: 235334
URL: https://gcc.gnu.org/viewcvs?rev=235334&root=gcc&view=rev
Log:
PR70674: S/390: Add memory barrier to stack pointer restore
from fpr.
This patches fixes a problem with stack variable accesses being
scheduled after the stack pointer restore instructions. In the
testcase this happened with the stack variable 'a' accessed through the
frame pointer.
The existing stack_tie we have in the backend is basically useless
when trying to block stack variable accesses from being scheduled
across an insn. The alias set of stack variables and the frame alias
set usually differ and hence aren't in conflict with each other. The
solution appears to be a magic MEM term with a scratch register which
is handled as a full memory barrier when analyzing scheduling
dependencies.
With the patch a (clobber (mem:BLK (scratch))) is being added to the
restore instruction in order to prevent any memory operations to be
scheduled across the insn. The patch does that only for the one case
where the stack pointer is restored from an FPR. Theoretically this
might happen also in the case where the stack pointer gets restored
using a load multiple. However, triggering that problem with
load-multiple appears to be much harder since the load-multiple will
restore the frame pointer as well. So in order to see the problem a
different call-clobbered register would need to be used as temporary
stack pointer.
Another case which needs to be handled some day is the stack pointer
allocation part. It needs to be a memory barrier as well.
gcc/ChangeLog:
2016-04-21 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
Backport from mainline
2016-04-20 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/70674
* config/s390/s390.c (s390_restore_gprs_from_fprs): Pick the new
stack_restore_from_fpr pattern when restoring r15.
(s390_optimize_prologue): Strip away the memory barrier in the
parallel when trying to get rid of restore insns.
* config/s390/s390.md ("stack_restore_from_fpr"): New insn
definition for loading the stack pointer from an FPR. Compared to
the normal move insn this pattern includes a full memory barrier.
gcc/testsuite/ChangeLog:
2016-04-21 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
Backport from mainline
2016-04-20 Andreas Krebbel <krebbel@linux.vnet.ibm.com>
PR target/70674
* gcc.target/s390/pr70674.c: New test.
Added:
branches/gcc-4_9-branch/gcc/testsuite/gcc.target/s390/pr70674.c
Modified:
branches/gcc-4_9-branch/gcc/ChangeLog
branches/gcc-4_9-branch/gcc/config/s390/s390.c
branches/gcc-4_9-branch/gcc/config/s390/s390.md
branches/gcc-4_9-branch/gcc/testsuite/ChangeLog