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; +}