aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorJeff Law <law@redhat.com>2016-11-17 16:39:08 -0700
committerJeff Law <law@gcc.gnu.org>2016-11-17 16:39:08 -0700
commitf2b6aad987ce2828f9b157a70bf76fada97a0a30 (patch)
tree5ee1637c3650ad8d655da30909516bd875089fde
parente080b2818b12b856ed8bc6dd26edb89703a2ff0d (diff)
downloadgcc-f2b6aad987ce2828f9b157a70bf76fada97a0a30.zip
gcc-f2b6aad987ce2828f9b157a70bf76fada97a0a30.tar.gz
gcc-f2b6aad987ce2828f9b157a70bf76fada97a0a30.tar.bz2
re PR target/47192 (m68k target - gcc uses stack frame after it has been unlinked when compiling with -Os)
PR target/47192 * config/m68k/m68k.c (m68k_expand_epilogue): Emit a scheduling barrier prior to deallocating the stack. PR target/47192 * gcc.target/m68k/pr47192.c: New test. From-SVN: r242575
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/config/m68k/m68k.c2
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/m68k/pr47192.c36
4 files changed, 49 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 24ed0f8..86a8fdf 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2016-11-17 Jeff Law <law@redhat.com>
+
+ PR target/47192
+ * config/m68k/m68k.c (m68k_expand_epilogue): Emit a scheduling
+ barrier prior to deallocating the stack.
+
2016-11-17 Andrew Burgess <andrew.burgess@embecosm.com>
* config/arc/arc.md (cmem bit/sign-extend peephole2): New peephole
diff --git a/gcc/config/m68k/m68k.c b/gcc/config/m68k/m68k.c
index ce56692..346c2dc 100644
--- a/gcc/config/m68k/m68k.c
+++ b/gcc/config/m68k/m68k.c
@@ -1205,6 +1205,7 @@ m68k_expand_epilogue (bool sibcall_p)
stack-based restore. */
emit_move_insn (gen_rtx_REG (Pmode, A1_REG),
GEN_INT (-(current_frame.offset + fsize)));
+ emit_insn (gen_blockage ());
emit_insn (gen_addsi3 (stack_pointer_rtx,
gen_rtx_REG (Pmode, A1_REG),
frame_pointer_rtx));
@@ -1306,6 +1307,7 @@ m68k_expand_epilogue (bool sibcall_p)
current_frame.fpu_mask, false, false);
}
+ emit_insn (gen_blockage ());
if (frame_pointer_needed)
emit_insn (gen_unlink (frame_pointer_rtx));
else if (fsize_with_regs)
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 356d75a..5dd6f56 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2016-11-17 Jeff Law <law@redhat.com>
+
+ PR target/47192
+ * gcc.target/m68k/pr47192.c: New test.
+
2016-11-17 Toma Tabacu <toma.tabacu@imgtec.com>
* gcc.target/mips/branch-cost-1.c (dg-options): Use (HAS_MOVN)
diff --git a/gcc/testsuite/gcc.target/m68k/pr47192.c b/gcc/testsuite/gcc.target/m68k/pr47192.c
new file mode 100644
index 0000000..5bbef58
--- /dev/null
+++ b/gcc/testsuite/gcc.target/m68k/pr47192.c
@@ -0,0 +1,36 @@
+/* { dg-do compile } */
+/* { dg-options "-O2 -mcpu=51qe -fdisable-ipa-pure-const -fdump-rtl-pro_and_epilogue" } */
+/* { dg-final { scan-rtl-dump-times "unspec_volatile" 1 "pro_and_epilogue"} } */
+
+
+char F(short *ty);
+
+short V(char cmd)
+{
+ static short st256;
+ static short stc;
+ short sc;
+ short scd;
+ short d;
+
+ F(&sc);
+
+ if (cmd == 4)
+ {
+ st256 = 0;
+ d = 0;
+ }
+ else
+ {
+ scd = sc - stc;
+ if (scd < -128)
+ {
+ scd += 256;
+ }
+ d = st256 >> 8;
+ st256 -= d << 8;
+ }
+ stc = sc;
+ return d;
+}
+