summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2011-06-17 11:24:55 +0000
committerhp <hp@138bc75d-0d04-0410-961f-82ee72b054a4>2011-06-17 11:24:55 +0000
commit18d611d919292f33b1dbf500363bca0364624507 (patch)
tree75e94450f78ce94f5ac45b625952838be3b85831
parent577aba7a0428046b4072480b9635c62953640af7 (diff)
downloadgcc-18d611d919292f33b1dbf500363bca0364624507.tar.gz
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. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/branches/gcc-4_3-branch@175146 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog11
-rw-r--r--gcc/reload.c9
-rw-r--r--gcc/reload1.c7
3 files changed, 27 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 27eb7e8df3e..eb0f7f9b8cc 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -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-05 Kaz Kojima <kkojima@gcc.gnu.org>
Backport from mainline
diff --git a/gcc/reload.c b/gcc/reload.c
index 5e33ff4b843..cfe6be8c564 100644
--- a/gcc/reload.c
+++ b/gcc/reload.c
@@ -6716,6 +6716,15 @@ find_equiv_reg (rtx goal, rtx insn, enum reg_class class, 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
diff --git a/gcc/reload1.c b/gcc/reload1.c
index d0fec9b29af..8e6dbbc61a5 100644
--- a/gcc/reload1.c
+++ b/gcc/reload1.c
@@ -4311,6 +4311,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);
}
}