Commit 6b2e80b7 by Richard Henderson Committed by Richard Henderson

recog.c (peephole2_optimize): Distribute EH_REGION -1 notes anywhere in the block.

        * recog.c (peephole2_optimize): Distribute EH_REGION -1 notes
        anywhere in the block.  Don't refer to insns that have been
        removed from the chain.  Iterate backward through the new insns.
        Don't refer to edges that have been removed.

From-SVN: r51357
parent 9ad6276f
2002-03-25 Richard Henderson <rth@redhat.com>
* recog.c (peephole2_optimize): Distribute EH_REGION -1 notes
anywhere in the block. Don't refer to insns that have been
removed from the chain. Iterate backward through the new insns.
Don't refer to edges that have been removed.
2002-03-26 Alan Modra <amodra@bigpond.net.au> 2002-03-26 Alan Modra <amodra@bigpond.net.au>
* combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct * combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct
......
...@@ -3045,7 +3045,7 @@ peephole2_optimize (dump_file) ...@@ -3045,7 +3045,7 @@ peephole2_optimize (dump_file)
prev = PREV_INSN (insn); prev = PREV_INSN (insn);
if (INSN_P (insn)) if (INSN_P (insn))
{ {
rtx try; rtx try, before_try;
int match_len; int match_len;
rtx note; rtx note;
...@@ -3128,14 +3128,16 @@ peephole2_optimize (dump_file) ...@@ -3128,14 +3128,16 @@ peephole2_optimize (dump_file)
if (i >= MAX_INSNS_PER_PEEP2 + 1) if (i >= MAX_INSNS_PER_PEEP2 + 1)
i -= MAX_INSNS_PER_PEEP2 + 1; i -= MAX_INSNS_PER_PEEP2 + 1;
note = find_reg_note (peep2_insn_data[i].insn,
REG_EH_REGION, NULL_RTX);
/* Replace the old sequence with the new. */ /* Replace the old sequence with the new. */
try = emit_insn_after (try, peep2_insn_data[i].insn); try = emit_insn_after (try, peep2_insn_data[i].insn);
before_try = PREV_INSN (insn);
delete_insn_chain (insn, peep2_insn_data[i].insn); delete_insn_chain (insn, peep2_insn_data[i].insn);
/* Re-insert the EH_REGION notes. */ /* Re-insert the EH_REGION notes. */
if (try == bb->end if (note)
&& (note = find_reg_note (peep2_insn_data[i].insn,
REG_EH_REGION, NULL_RTX)))
{ {
rtx x; rtx x;
edge eh_edge; edge eh_edge;
...@@ -3145,11 +3147,11 @@ peephole2_optimize (dump_file) ...@@ -3145,11 +3147,11 @@ peephole2_optimize (dump_file)
if (eh_edge->flags & EDGE_EH) if (eh_edge->flags & EDGE_EH)
break; break;
for (x = NEXT_INSN (peep2_insn_data[i].insn); for (x = try ; x != before_try ; x = PREV_INSN (x))
x != NEXT_INSN (try); x = NEXT_INSN (x))
if (GET_CODE (x) == CALL_INSN if (GET_CODE (x) == CALL_INSN
|| (flag_non_call_exceptions || (flag_non_call_exceptions
&& may_trap_p (PATTERN (x)))) && may_trap_p (PATTERN (x))
&& !find_reg_note (x, REG_EH_REGION, NULL)))
{ {
REG_NOTES (x) REG_NOTES (x)
= gen_rtx_EXPR_LIST (REG_EH_REGION, = gen_rtx_EXPR_LIST (REG_EH_REGION,
...@@ -3158,9 +3160,16 @@ peephole2_optimize (dump_file) ...@@ -3158,9 +3160,16 @@ peephole2_optimize (dump_file)
if (x != bb->end && eh_edge) if (x != bb->end && eh_edge)
{ {
edge nfte = split_block (bb, x); edge nfte, nehe;
edge nehe = make_edge (nfte->src, eh_edge->dest, int flags;
eh_edge->flags);
nfte = split_block (bb, x);
flags = EDGE_EH | EDGE_ABNORMAL;
if (GET_CODE (x) == CALL_INSN)
flags |= EDGE_ABNORMAL_CALL;
nehe = make_edge (nfte->src, eh_edge->dest,
flags);
nehe->probability = eh_edge->probability; nehe->probability = eh_edge->probability;
nfte->probability nfte->probability
= REG_BR_PROB_BASE - nehe->probability; = REG_BR_PROB_BASE - nehe->probability;
...@@ -3171,6 +3180,7 @@ peephole2_optimize (dump_file) ...@@ -3171,6 +3180,7 @@ peephole2_optimize (dump_file)
changed = true; changed = true;
#endif #endif
bb = nfte->src; bb = nfte->src;
eh_edge = nehe;
} }
} }
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment