re PR target/55940 (Incorrect code for accessing parameters with 32-bit Intel hosts)
authorJakub Jelinek <jakub@gcc.gnu.org>
Tue, 15 Jan 2013 22:58:21 +0000 (23:58 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Tue, 15 Jan 2013 22:58:21 +0000 (23:58 +0100)
PR target/55940
* function.c (thread_prologue_and_epilogue_insns): Always
add crtl->drap_reg to set_up_by_prologue.set, even if
stack_realign_drap is false.

* gcc.dg/pr55940.c: New test.

From-SVN: r195220

gcc/ChangeLog
gcc/function.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr55940.c [new file with mode: 0644]

index 02b41f7619475566667a7da1decb0902d82ea29a..e9220f5f8c6a7c17562b3ba6ff513c5e5129e2e6 100644 (file)
@@ -1,3 +1,10 @@
+2013-01-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/55940
+       * function.c (thread_prologue_and_epilogue_insns): Always
+       add crtl->drap_reg to set_up_by_prologue.set, even if
+       stack_realign_drap is false.
+
 2013-01-15  Jan-Benedict Glaw  <jbglaw@lug-owl.de>
 
        * config/vax/vax.md (add<mode>3, sub<mode>3, mul<mode>3, div<mode>3,
@@ -12,7 +19,7 @@
 
 2013-01-15  Vladimir Makarov  <vmakarov@redhat.com>
 
-       PR rtl-optimization/pr55153
+       PR rtl-optimization/55153
        * sched-deps.c (sched_analyze_2): Add pending reads for prefetch.
 
 2013-01-15  Martin Jambor  <mjambor@suse.cz>
index 37ac7d2c0d6b05dfcffc2df5cbf7156e9c7c84d9..bb6a9ae9979d82315a4830f16b8dedfeb993fd1a 100644 (file)
@@ -6029,7 +6029,7 @@ thread_prologue_and_epilogue_insns (void)
       if (pic_offset_table_rtx)
        add_to_hard_reg_set (&set_up_by_prologue.set, Pmode,
                             PIC_OFFSET_TABLE_REGNUM);
-      if (stack_realign_drap && crtl->drap_reg)
+      if (crtl->drap_reg)
        add_to_hard_reg_set (&set_up_by_prologue.set,
                             GET_MODE (crtl->drap_reg),
                             REGNO (crtl->drap_reg));
index 5ad1cef4679f30c3bd6515fcb17980fcc1849e1d..6c6f0b40c7476649eb4cd2195b4da61ee6da2c28 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-15  Jakub Jelinek  <jakub@redhat.com>
+
+       PR target/55940
+       * gcc.dg/pr55940.c: New test.
+
 2013-01-15  Manfred Schwarb  <manfred99@gmx.ch>
            Harald Anlauf  <anlauf@gmx.de>
 
@@ -18,7 +23,7 @@
 
 2013-01-15  Vladimir Makarov  <vmakarov@redhat.com>
 
-       PR rtl-optimization/pr55153
+       PR rtl-optimization/55153
        * gcc.dg/pr55153.c: New.
 
 2013-01-15  Jakub Jelinek  <jakub@redhat.com>
diff --git a/gcc/testsuite/gcc.dg/pr55940.c b/gcc/testsuite/gcc.dg/pr55940.c
new file mode 100644 (file)
index 0000000..d046d0b
--- /dev/null
@@ -0,0 +1,54 @@
+/* PR target/55940 */
+/* { dg-do run } */
+/* { dg-options "-Os" } */
+/* { dg-additional-options "-mpreferred-stack-boundary=2" { target { { i?86-*-* x86_64-*-* } && ia32 } } } */
+
+struct S { int s; unsigned long t; };
+
+__attribute__ ((noinline, noclone)) unsigned long long
+bar (struct S *x, unsigned long y)
+{
+  asm volatile ("" : : "r" (x), "r" (y) : "memory");
+  return x->s + y;
+}
+
+__attribute__ ((noinline, noclone)) unsigned long long
+foo (struct S *x, unsigned long y)
+{
+  unsigned long a;
+  if (__builtin_expect (((__UINTPTR_TYPE__) (x) + 0x1000U < 0x2000U), 0))
+    return ~0ULL;
+  if (__builtin_expect (x->s <= 0 || x->s > 9, 0))
+    return ~0ULL;
+  a = x->t >> 12;
+  if (y == a)
+    return ~0ULL;
+  if (x->s == 3)
+    return x->t + y * 4096;
+  return bar (x, y);
+}
+
+int va, vb, vc, vd;
+
+int
+main ()
+{
+  struct S s;
+  asm volatile ("" : : : "memory");
+  int a = va, b = vb, c = vc, d = vd;
+  asm volatile ("" : : : "memory");
+  int i;
+  for (i = 0; i < 64; i++)
+    if (foo ((struct S *) 0, 0) != ~0ULL)
+      __builtin_abort ();
+  s.s = 3;
+  s.t = 2 << 12;
+  if (foo (&s, 2) != ~0ULL)
+    __builtin_abort ();
+  if (foo (&s, 3) != (2 << 12) + 3 * 4096)
+    __builtin_abort ();
+  asm volatile ("" : : : "memory");
+  va = a; vb = b; vc = c; vd = d;
+  asm volatile ("" : : : "memory");
+  return 0;
+}