The following patch fixes

https://gcc.gnu.org/bugzilla/show_bug.cgi?id=66626

  The patch was bootstrapped and tested on x86/x86-64.

Committed as rev. 225789.

2015-07-14  Vladimir Makarov  <vmaka...@redhat.com>

        PR rtl-optimization/66626
        * lra-constraints.c (lra_constraints): Prevent equivalence
        substitution for static chain pseudo in functions with nonlocal
        goto.

2015-07-14  Vladimir Makarov  <vmaka...@redhat.com>

        PR rtl-optimization/66626
        * gcc.target/i386/pr66626.c: New.

Index: lra-constraints.c
===================================================================
--- lra-constraints.c	(revision 225618)
+++ lra-constraints.c	(working copy)
@@ -4305,7 +4305,13 @@ lra_constraints (bool first_p)
 		    && ((CONST_POOL_OK_P (PSEUDO_REGNO_MODE (i), x)
 			 && (targetm.preferred_reload_class
 			     (x, lra_get_allocno_class (i)) == NO_REGS))
-			|| contains_symbol_ref_p (x))))
+			|| contains_symbol_ref_p (x)))
+		/* Static chain equivalence may contain eliminable
+		   regs and the result of elimination might be wrong
+		   after restoring frame pointer for a nonlocal
+		   goto.  */
+		|| (cfun->static_chain_decl && crtl->has_nonlocal_goto
+		    && REG_EXPR (reg) == cfun->static_chain_decl))
 	      ira_reg_equiv[i].defined_p = false;
 	    if (contains_reg_p (x, false, true))
 	      ira_reg_equiv[i].profitable_p = false;
Index: testsuite/gcc.target/i386/pr66626.c
===================================================================
--- testsuite/gcc.target/i386/pr66626.c	(revision 0)
+++ testsuite/gcc.target/i386/pr66626.c	(working copy)
@@ -0,0 +1,26 @@
+/* { dg-do run } */
+/* { dg-options "-O2 -mregparm=3" } */
+/* { dg-require-effective-target ia32 } */
+extern void abort (void);
+
+int s (int i, int j, int k, int l)
+{
+  __label__ l1;
+    int f (int i, int j, int k, int l)
+    {
+      if (i + j + k + l == 10)
+	goto l1;
+      return 0;
+    }
+    return f (i, j, k, l);
+ l1:;
+    return 1;
+}
+
+int main ()
+{
+  if (s (1, 2, 3, 4) != 1)
+      abort ();
+
+  return 0;
+}

Reply via email to