re PR rtl-optimization/66626 (gcc.dg/torture/stackalign/non-local-goto-5.c segfaults...
authorVladimir Makarov <vmakarov@redhat.com>
Tue, 14 Jul 2015 20:54:00 +0000 (20:54 +0000)
committerVladimir Makarov <vmakarov@gcc.gnu.org>
Tue, 14 Jul 2015 20:54:00 +0000 (20:54 +0000)
2015-07-14  Vladimir Makarov  <vmakarov@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  <vmakarov@redhat.com>

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

From-SVN: r225789

gcc/ChangeLog
gcc/lra-constraints.c
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.target/i386/pr66626.c [new file with mode: 0644]

index 79e5ba0..4679097 100644 (file)
@@ -1,3 +1,10 @@
+2015-07-14  Vladimir Makarov  <vmakarov@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  Sandra Loosemore  <sandra@codesourcery.com>
 
        * config/nios2/nios2.c (TEMP_REG_NUM): Move define up in file.
index ddb91dd..58a388f 100644 (file)
@@ -4306,7 +4306,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 6284431..45df0cc 100644 (file)
@@ -1,3 +1,8 @@
+2015-07-14  Vladimir Makarov  <vmakarov@redhat.com>
+
+       PR rtl-optimization/66626
+       * gcc.target/i386/pr66626.c: New.
+
 2015-07-14  Sandra Loosemore  <sandra@codesourcery.com>
 
        * gcc.target/nios2/nios2-stack-check-1.c: Adjust patterns.
diff --git a/gcc/testsuite/gcc.target/i386/pr66626.c b/gcc/testsuite/gcc.target/i386/pr66626.c
new file mode 100644 (file)
index 0000000..dca4afc
--- /dev/null
@@ -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;
+}