diff options
author | hp <hp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-06-17 02:18:24 +0000 |
---|---|---|
committer | hp <hp@138bc75d-0d04-0410-961f-82ee72b054a4> | 2011-06-17 02:18:24 +0000 |
commit | fd7a154df349ff34ac9d96db9f143844ba04d19e (patch) | |
tree | 691aeafddb0a87acbd9aac366c7ea95648cda6d0 | |
parent | f5945047d04c5006a37fa100b8e41153b84cb762 (diff) | |
download | ppe42-gcc-fd7a154df349ff34ac9d96db9f143844ba04d19e.tar.gz ppe42-gcc-fd7a154df349ff34ac9d96db9f143844ba04d19e.zip |
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/trunk@175132 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r-- | gcc/ChangeLog | 8 | ||||
-rw-r--r-- | gcc/reload.c | 9 | ||||
-rw-r--r-- | gcc/reload1.c | 7 |
3 files changed, 24 insertions, 0 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c1620d2eff4..26c1f813011 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,11 @@ +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> * tree-ssa-threadupdate.c (struct redirection_data): New field diff --git a/gcc/reload.c b/gcc/reload.c index 27d57877501..3ad46b991ad 100644 --- a/gcc/reload.c +++ b/gcc/reload.c @@ -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)) 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 e65503b9fa5..a87e6ad08d6 100644 --- a/gcc/reload1.c +++ b/gcc/reload1.c @@ -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, 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); } } |