re PR rtl-optimization/48542 (unchanged variables in code which calls setjmp may be clobbered (including the return-address))
PR rtl-optimization/48542 * reload.c (find_equiv_reg): Stop looking when finding a setjmp-type call. * reload1.c (reload_as_needed): Invalidate all reload registers when crossing a setjmp-type call. From-SVN: r175144
This commit is contained in:
parent
a079fb105a
commit
45898b407d
|
@ -1,3 +1,14 @@
|
|||
2011-06-17 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
Backport from mainline
|
||||
2011-06-17 Hans-Peter Nilsson <hp@axis.com>
|
||||
|
||||
PR rtl-optimization/48542
|
||||
* reload.c (find_equiv_reg): Stop looking when finding a
|
||||
setjmp-type call.
|
||||
* reload1.c (reload_as_needed): Invalidate all reload
|
||||
registers when crossing a setjmp-type call.
|
||||
|
||||
2011-06-09 Eric Botcazou <ebotcazou@adacore.com>
|
||||
|
||||
* config/sparc/sparc.md (return_internal): Adjust 'length' attribute.
|
||||
|
|
|
@ -6731,6 +6731,15 @@ find_equiv_reg (rtx goal, rtx insn, enum reg_class rclass, int other,
|
|||
|| num > PARAM_VALUE (PARAM_MAX_RELOAD_SEARCH_INSNS))
|
||||
return 0;
|
||||
|
||||
/* Don't reuse register contents from before a setjmp-type
|
||||
function call; on the second return (from the longjmp) it
|
||||
might have been clobbered by a later reuse. It doesn't
|
||||
seem worthwhile to actually go and see if it is actually
|
||||
reused even if that information would be readily available;
|
||||
just don't reuse it across the setjmp call. */
|
||||
if (CALL_P (p) && find_reg_note (p, REG_SETJMP, NULL_RTX))
|
||||
return 0;
|
||||
|
||||
if (NONJUMP_INSN_P (p)
|
||||
/* If we don't want spill regs ... */
|
||||
&& (! (reload_reg_p != 0
|
||||
|
|
|
@ -4428,6 +4428,13 @@ reload_as_needed (int live_known)
|
|||
{
|
||||
AND_COMPL_HARD_REG_SET (reg_reloaded_valid, call_used_reg_set);
|
||||
AND_COMPL_HARD_REG_SET (reg_reloaded_valid, reg_reloaded_call_part_clobbered);
|
||||
|
||||
/* If this is a call to a setjmp-type function, we must not
|
||||
reuse any reload reg contents across the call; that will
|
||||
just be clobbered by other uses of the register in later
|
||||
code, before the longjmp. */
|
||||
if (find_reg_note (insn, REG_SETJMP, NULL_RTX))
|
||||
CLEAR_HARD_REG_SET (reg_reloaded_valid);
|
||||
}
|
||||
}
|
||||
|
||||
|
|
Loading…
Reference in New Issue