patch for PR rtl-optimization/25130
authorsteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Dec 2005 15:28:16 +0000 (15:28 +0000)
committersteven <steven@138bc75d-0d04-0410-961f-82ee72b054a4>
Wed, 21 Dec 2005 15:28:16 +0000 (15:28 +0000)
gcc/
        * postreload-gcse.c (record_last_set_info): Notice stack pointer
        changes in push insns without REG_INC notes.

testsuite/
        * gcc.dg/pr25130.c: New test.

git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@108906 138bc75d-0d04-0410-961f-82ee72b054a4

gcc/ChangeLog
gcc/postreload-gcse.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr25130.c [new file with mode: 0644]

index 7c34089..2db3153 100644 (file)
@@ -1,3 +1,9 @@
+2005-12-21  Steven Bosscher  <stevenb@suse.de>
+
+       PR rtl-optimization/25130
+       * postreload-gcse.c (record_last_set_info): Notice stack pointer
+       changes in push insns without REG_INC notes.
+
 2005-12-21  Kazu Hirata  <kazu@codesourcery.com>
 
        PR tree-optimization/25382.
index 191d796..4fc66ec 100644 (file)
@@ -671,10 +671,18 @@ record_last_set_info (rtx dest, rtx setter ATTRIBUTE_UNUSED, void *data)
 
   if (REG_P (dest))
     record_last_reg_set_info (last_set_insn, REGNO (dest));
-  else if (MEM_P (dest)
-          /* Ignore pushes, they clobber nothing.  */
-          && ! push_operand (dest, GET_MODE (dest)))
-    record_last_mem_set_info (last_set_insn);
+  else if (MEM_P (dest))
+    {
+      /* Ignore pushes, they don't clobber memory.  They may still
+        clobber the stack pointer though.  Some targets do argument
+        pushes without adding REG_INC notes.  See e.g. PR25196,
+        where a pushsi2 on i386 doesn't have REG_INC notes.  Note
+        such changes here too.  */
+      if (! push_operand (dest, GET_MODE (dest)))
+       record_last_mem_set_info (last_set_insn);
+      else
+       record_last_reg_set_info (last_set_insn, STACK_POINTER_REGNUM);
+    }
 }
 
 
index 2899ab2..fb9dd48 100644 (file)
@@ -1,3 +1,8 @@
+2005-12-21  Steven Bosscher  <stevenb@suse.de>
+
+       PR rtl-optimization/25130
+       * gcc.dg/pr25130.c: New test.
+
 2005-12-21  Erik Edelmann  <eedelman@gcc.gnu.org>
 
        PR fortran/25423
diff --git a/gcc/testsuite/gcc.dg/pr25130.c b/gcc/testsuite/gcc.dg/pr25130.c
new file mode 100644 (file)
index 0000000..e73faff
--- /dev/null
@@ -0,0 +1,34 @@
+/* { dg-do run { target i?86-*-* x86_64-*-* } } */
+/* { dg-require-effective-target ilp32 } */
+/* { dg-options "-march=i386 -O3 -fomit-frame-pointer" } */
+
+/* For this test case, we used to do an invalid load motion after
+   reload, because we missed autoincrements of the stack pointer.  */
+
+extern void abort (void);
+
+static int j;
+
+static void __attribute__((noinline))
+f1 (int a, int b, int c, int d, int e)
+{
+  j = a;
+}
+
+int __attribute__((noinline))
+f2 (int a, int b, int c, int d, int e)
+{
+  if ((b & 0x1111) != 1)
+    f1 (a, b, c, d, e);
+  return 0;
+}
+
+int
+main (void)
+{
+  f2 (123, 0, 0, 0, 0);
+  if (j != 123)
+    abort ();
+  return 0;
+}
+