aboutsummaryrefslogtreecommitdiff
path: root/gcc
diff options
context:
space:
mode:
authorJan Hubicka <jh@suse.cz>2002-03-08 21:14:04 +0100
committerJan Hubicka <hubicka@gcc.gnu.org>2002-03-08 20:14:04 +0000
commit189ae0f4d5e55f86b2ad0e7b307ba1d8dfbeed74 (patch)
tree8b96f4c7e6fd1a9c5bce9b9939d59c4b2d420add /gcc
parent07fc65c47c45af6439208797e1ab26f7daedb666 (diff)
downloadgcc-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/ChangeLog4
-rw-r--r--gcc/recog.c23
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