summaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorvmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-22 14:26:51 +0000
committervmakarov <vmakarov@138bc75d-0d04-0410-961f-82ee72b054a4>2013-04-22 14:26:51 +0000
commitfbb45ff16ad0870e6ba4243da2aa6317103dae8e (patch)
tree972114b4e0989e2e816099da413dd707f4b716fd /gcc
parentea4d38ee9bafc04110155147671e477290da5833 (diff)
downloadgcc-fbb45ff16ad0870e6ba4243da2aa6317103dae8e.tar.gz
2013-04-22 Vladimir Makarov <vmakarov@redhat.com>
PR target/57018 * lra-eliminations.c (mark_not_eliminable): Prevent elimination of a set sp if no stack realignment. 2013-04-22 Vladimir Makarov <vmakarov@redhat.com> PR target/57018 * gcc.target/i386/pr57018.c: New test. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@198140 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc')
-rw-r--r--gcc/ChangeLog6
-rw-r--r--gcc/lra-eliminations.c4
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr57018.c31
4 files changed, 45 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 358ced13d12..3e930b47039 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,3 +1,9 @@
+2013-04-22 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR target/57018
+ * lra-eliminations.c (mark_not_eliminable): Prevent elimination of
+ a set sp if no stack realignment.
+
2013-04-22 Nick Clifton <nickc@redhat.com>
* config.gcc (tilegx-linux): Extend extra_objs rather than
diff --git a/gcc/lra-eliminations.c b/gcc/lra-eliminations.c
index b8ec69fdcd9..27a5d7560c5 100644
--- a/gcc/lra-eliminations.c
+++ b/gcc/lra-eliminations.c
@@ -716,7 +716,9 @@ mark_not_eliminable (rtx x)
ep++)
if (ep->to_rtx == SET_DEST (x)
&& SET_DEST (x) != hard_frame_pointer_rtx
- && (GET_CODE (SET_SRC (x)) != PLUS
+ && (! (SUPPORTS_STACK_ALIGNMENT && stack_realign_fp
+ && REGNO (ep->to_rtx) == STACK_POINTER_REGNUM)
+ || GET_CODE (SET_SRC (x)) != PLUS
|| XEXP (SET_SRC (x), 0) != SET_DEST (x)
|| ! CONST_INT_P (XEXP (SET_SRC (x), 1))))
setup_can_eliminate (ep, false);
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 0938ce462b6..3917bbe7111 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -1,3 +1,8 @@
+2013-04-22 Vladimir Makarov <vmakarov@redhat.com>
+
+ PR target/57018
+ * gcc.target/i386/pr57018.c: New test.
+
2013-04-22 James Greenhalgh <james.greenhalgh@arm.com>
* gcc.target/aarch64/vrecps.c: New.
diff --git a/gcc/testsuite/gcc.target/i386/pr57018.c b/gcc/testsuite/gcc.target/i386/pr57018.c
new file mode 100644
index 00000000000..fb0d849adc9
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr57018.c
@@ -0,0 +1,31 @@
+/* { dg-do run } */
+/* { dg-options "-Os -fomit-frame-pointer -fno-asynchronous-unwind-tables" } */
+/* { dg-additional-options "-march=i686" { target ia32 } } */
+
+struct A { char a[16]; } a;
+
+void __attribute__((noinline, noclone))
+foo (struct A b)
+{
+ if (__builtin_memcmp (b.a, "\0\0\0\0\0\0\0\0\0\0\0\0\0\0\0", 16))
+ __builtin_abort ();
+ asm volatile ("" : : : "memory");
+}
+
+void __attribute__((noinline, noclone))
+bar (struct A b)
+{
+ foo (a);
+ a = b;
+}
+
+int
+main ()
+{
+ struct A b = { "\0\1\2\3\4\5\6\7\10\11\12\13\14\15\16\17" };
+ bar (b);
+ if (__builtin_memcmp (a.a, b.a, 16))
+ __builtin_abort ();
+ return 0;
+}
+