diff mbox

patch to fix PR55672

Message ID 50EF1E2F.30300@redhat.com
State New
Headers show

Commit Message

Vladimir Makarov Jan. 10, 2013, 8:01 p.m. UTC
The following patch fixes

http://gcc.gnu.org/bugzilla/show_bug.cgi?id=55672

The patch was successfully tested and bootstrapped on x86-64 (with and 
without -fstack-check=generic).

Committed as rev. 195095.

2013-01-10  Vladimir Makarov  <vmakarov@redhat.com>

         PR rtl-optimization/pr55672
         * lra-eliminations.c (mark_not_eliminable): Permit addition with
         const to be eliminable.

2013-01-10  Vladimir Makarov  <vmakarov@redhat.com>

         PR rtl-optimization/pr55672
         * gcc.target/i386/pr55672.c: New.
diff mbox

Patch

Index: lra-eliminations.c
===================================================================
--- lra-eliminations.c	(revision 195058)
+++ lra-eliminations.c	(working copy)
@@ -657,7 +657,7 @@  mark_not_eliminable (rtx x)
     case PRE_MODIFY:
       if (REG_P (XEXP (x, 0)) && REGNO (XEXP (x, 0)) < FIRST_PSEUDO_REGISTER)
 	/* If we modify the source of an elimination rule, disable
-	   it. Do the same if it is the source and not the hard frame
+	   it.  Do the same if it is the source and not the hard frame
 	   register.  */
 	for (ep = reg_eliminate;
 	     ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
@@ -716,7 +716,10 @@  mark_not_eliminable (rtx x)
 	       ep < &reg_eliminate[NUM_ELIMINABLE_REGS];
 	       ep++)
 	    if (ep->to_rtx == SET_DEST (x)
-		&& SET_DEST (x) != hard_frame_pointer_rtx)
+		&& SET_DEST (x) != hard_frame_pointer_rtx
+		&& (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);
 	}
 
Index: testsuite/gcc.target/i386/pr55672.c
===================================================================
--- testsuite/gcc.target/i386/pr55672.c	(revision 0)
+++ testsuite/gcc.target/i386/pr55672.c	(working copy)
@@ -0,0 +1,10 @@ 
+/* { dg-do compile } */
+/* { dg-options "-O -fstack-check=generic" } */
+
+int main ()
+{
+  int x[8];
+  if (x[0] != 4)
+    __builtin_abort ();
+  return 0;
+}