Commit 9a2091cd by Hans-Peter Nilsson Committed by Hans-Peter Nilsson

re PR rtl-optimization/48542 (unchanged variables in code which calls setjmp may…

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: r175132
parent a26335b5
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-16 Jeff Law <law@redhat.com> 2011-06-16 Jeff Law <law@redhat.com>
* tree-ssa-threadupdate.c (struct redirection_data): New field * tree-ssa-threadupdate.c (struct redirection_data): New field
......
...@@ -6791,6 +6791,15 @@ find_equiv_reg (rtx goal, rtx insn, enum reg_class rclass, int other, ...@@ -6791,6 +6791,15 @@ find_equiv_reg (rtx goal, rtx insn, enum reg_class rclass, int other,
|| num > PARAM_VALUE (PARAM_MAX_RELOAD_SEARCH_INSNS)) || num > PARAM_VALUE (PARAM_MAX_RELOAD_SEARCH_INSNS))
return 0; 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 (NONJUMP_INSN_P (p)
/* If we don't want spill regs ... */ /* If we don't want spill regs ... */
&& (! (reload_reg_p != 0 && (! (reload_reg_p != 0
......
...@@ -4844,6 +4844,13 @@ reload_as_needed (int live_known) ...@@ -4844,6 +4844,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, call_used_reg_set);
AND_COMPL_HARD_REG_SET (reg_reloaded_valid, reg_reloaded_call_part_clobbered); 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);
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment