Eric Botcazou <ebotca...@adacore.com> writes: >> JUMP_INSNs already invalidate the register use information. The problem >> is that CALL_INSNs that can throw don't. > > Sure, that's precisely what I was suggesting to change, like in rev 162301.
Ahh, you mean something like this? (Fixes the testcase, but not properly tested yet.) Andreas. 2010-11-15 Andreas Schwab <sch...@redhat.com> * postreload.c (reload_combine): Invalidate register use information on all control flow insns. diff --git a/gcc/postreload.c b/gcc/postreload.c index 1fc9bfc..3b20d6e 100644 --- a/gcc/postreload.c +++ b/gcc/postreload.c @@ -1320,7 +1320,24 @@ reload_combine (void) note_stores (PATTERN (insn), reload_combine_note_store, NULL); - if (CALL_P (insn)) + if (control_flow_insn_p (insn) + && GET_CODE (PATTERN (insn)) != RETURN) + { + /* Non-spill registers might be used at the call destination in + some unknown fashion, so we have to mark the unknown use. */ + HARD_REG_SET *live; + + if ((condjump_p (insn) || condjump_in_parallel_p (insn)) + && JUMP_LABEL (insn)) + live = &LABEL_LIVE (JUMP_LABEL (insn)); + else + live = &ever_live_at_start; + + for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; --i) + if (TEST_HARD_REG_BIT (*live, i)) + reg_state[i].use_index = -1; + } + else if (CALL_P (insn)) { rtx link; @@ -1354,23 +1371,6 @@ reload_combine (void) } } - else if (JUMP_P (insn) - && GET_CODE (PATTERN (insn)) != RETURN) - { - /* Non-spill registers might be used at the call destination in - some unknown fashion, so we have to mark the unknown use. */ - HARD_REG_SET *live; - - if ((condjump_p (insn) || condjump_in_parallel_p (insn)) - && JUMP_LABEL (insn)) - live = &LABEL_LIVE (JUMP_LABEL (insn)); - else - live = &ever_live_at_start; - - for (i = FIRST_PSEUDO_REGISTER - 1; i >= 0; --i) - if (TEST_HARD_REG_BIT (*live, i)) - reg_state[i].use_index = -1; - } reload_combine_note_use (&PATTERN (insn), insn, reload_combine_ruid, NULL_RTX); -- Andreas Schwab, sch...@redhat.com GPG Key fingerprint = D4E8 DBE3 3813 BB5D FA84 5EC7 45C6 250E 6F00 984E "And now for something completely different."