diff options
author | Vladimir Makarov <vmakarov@redhat.com> | 2015-07-14 20:54:00 +0000 |
---|---|---|
committer | Vladimir Makarov <vmakarov@redhat.com> | 2015-07-14 20:54:00 +0000 |
commit | 12787be74e166256322233d339bf0e36bd6c752c (patch) | |
tree | 62ccd56b35e933003653d5a5b1bcc8d7d34eb5d0 | |
parent | 5a0c216184792faa8d8276d180bec3437ef8a458 (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/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/lra-constraints.c | 8 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.target/i386/pr66626.c | 26 |
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; +} |