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: r51358
This commit is contained in:
Richard Henderson 2002-03-25 16:31:40 -08:00 committed by Richard Henderson
parent d1db771802
commit 61fee22b62
2 changed files with 27 additions and 10 deletions

View File

@ -1,3 +1,10 @@
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>
* combine.c (simplify_comparison <ASHIFTRT, LSHIFTRT>): Correct

View File

@ -3064,7 +3064,7 @@ peephole2_optimize (dump_file)
prev = PREV_INSN (insn);
if (INSN_P (insn))
{
rtx try;
rtx try, before_try;
int match_len;
rtx note;
@ -3147,14 +3147,16 @@ peephole2_optimize (dump_file)
if (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. */
try = emit_insn_after (try, peep2_insn_data[i].insn);
before_try = PREV_INSN (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)))
if (note)
{
rtx x;
edge eh_edge;
@ -3164,11 +3166,11 @@ peephole2_optimize (dump_file)
if (eh_edge->flags & EDGE_EH)
break;
for (x = NEXT_INSN (peep2_insn_data[i].insn);
x != NEXT_INSN (try); x = NEXT_INSN (x))
for (x = try ; x != before_try ; x = PREV_INSN (x))
if (GET_CODE (x) == CALL_INSN
|| (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)
= gen_rtx_EXPR_LIST (REG_EH_REGION,
@ -3177,9 +3179,16 @@ peephole2_optimize (dump_file)
if (x != bb->end && eh_edge)
{
edge nfte = split_block (bb, x);
edge nehe = make_edge (nfte->src, eh_edge->dest,
eh_edge->flags);
edge nfte, nehe;
int 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;
nfte->probability
= REG_BR_PROB_BASE - nehe->probability;
@ -3190,6 +3199,7 @@ peephole2_optimize (dump_file)
changed = true;
#endif
bb = nfte->src;
eh_edge = nehe;
}
}