aboutsummaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorVladimir Makarov <vmakarov@redhat.com>2015-07-14 20:54:00 +0000
committerVladimir Makarov <vmakarov@redhat.com>2015-07-14 20:54:00 +0000
commit12787be74e166256322233d339bf0e36bd6c752c (patch)
tree62ccd56b35e933003653d5a5b1bcc8d7d34eb5d0
parent5a0c216184792faa8d8276d180bec3437ef8a458 (diff)
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. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@225789 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog7
-rw-r--r--gcc/lra-constraints.c8
-rw-r--r--gcc/testsuite/ChangeLog5
-rw-r--r--gcc/testsuite/gcc.target/i386/pr66626.c26
4 files changed, 45 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 79e5ba01c7a..4679097fa0e 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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.
diff --git a/gcc/lra-constraints.c b/gcc/lra-constraints.c
index ddb91dd49cf..58a388fa9e8 100644
--- a/gcc/lra-constraints.c
+++ b/gcc/lra-constraints.c
@@ -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;
diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog
index 6284431035a..45df0cc0095 100644
--- a/gcc/testsuite/ChangeLog
+++ b/gcc/testsuite/ChangeLog
@@ -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
index 00000000000..dca4afc299a
--- /dev/null
+++ b/gcc/testsuite/gcc.target/i386/pr66626.c
@@ -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;
+}