diff options
author | Jan Hubicka <jh@suse.cz> | 2002-03-08 21:14:04 +0100 |
---|---|---|
committer | Jan Hubicka <hubicka@gcc.gnu.org> | 2002-03-08 20:14:04 +0000 |
commit | 189ae0f4d5e55f86b2ad0e7b307ba1d8dfbeed74 (patch) | |
tree | 8b96f4c7e6fd1a9c5bce9b9939d59c4b2d420add /gcc | |
parent | 07fc65c47c45af6439208797e1ab26f7daedb666 (diff) | |
download | gcc-189ae0f4d5e55f86b2ad0e7b307ba1d8dfbeed74.zip gcc-189ae0f4d5e55f86b2ad0e7b307ba1d8dfbeed74.tar.gz gcc-189ae0f4d5e55f86b2ad0e7b307ba1d8dfbeed74.tar.bz2 |
* recog.c (peephole2_optimize): Re-distribute EH edges.
From-SVN: r50452
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 4 | ||||
-rw-r--r-- | gcc/recog.c | 23 |
2 files changed, 26 insertions, 1 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 0e63f66..be3f2b7 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,7 @@ +Fri Mar 8 21:08:52 CET 2002 Jan Hubicka <jh@suse.cz> + + * recog.c (peephole2_optimize): Re-distribute EH edges. + 2002-03-08 Neil Booth <neil@daikokuya.demon.co.uk> * expr.c (expand_expr): Use unsave lang hook. diff --git a/gcc/recog.c b/gcc/recog.c index 968f1e5..9eb9538 100644 --- a/gcc/recog.c +++ b/gcc/recog.c @@ -3054,6 +3054,7 @@ peephole2_optimize (dump_file) { rtx try; int match_len; + rtx note; /* Record this insn. */ if (--peep2_current < 0) @@ -3105,7 +3106,6 @@ peephole2_optimize (dump_file) note = XEXP (note, 1)) switch (REG_NOTE_KIND (note)) { - case REG_EH_REGION: case REG_NORETURN: case REG_SETJMP: case REG_ALWAYS_RETURN: @@ -3139,6 +3139,27 @@ peephole2_optimize (dump_file) try = emit_insn_after (try, peep2_insn_data[i].insn); delete_insn_chain (insn, peep2_insn_data[i].insn); + /* Re-insert the EH_REGION notes. */ + if (try == bb->end + && (note = find_reg_note (peep2_insn_data[i].insn, + REG_EH_REGION, NULL_RTX))) + { + rtx x; + for (x = NEXT_INSN (peep2_insn_data[i].insn); + x != NEXT_INSN (try); x = NEXT_INSN (x)) + if (GET_CODE (x) == CALL_INSN + || (flag_non_call_exceptions + && may_trap_p (PATTERN (x)))) + REG_NOTES (x) + = gen_rtx_EXPR_LIST (REG_EH_REGION, + XEXP (note, 0), + REG_NOTES (x)); + } + /* Converting possibly trapping insn to non-trapping is + possible. Zap dummy outgoing edges. */ + if (try == bb->end) + purge_dead_edges (bb); + #ifdef HAVE_conditional_execution /* With conditional execution, we cannot back up the live information so easily, since the conditional |