diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 26ceb86ce4ac..ce0ac90a24e1 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2009-05-29 Andrey Belevantsev + + PR rtl-optimization/40101 + * sel-sched-ir.c (get_seqno_by_preds): Allow returning negative + seqno. Adjust comment. + * sel-sched.c (find_seqno_for_bookkeeping): Assert that when + inserting bookkeeping before a jump, the jump is not scheduled. + When no positive seqno found, provide a value. Add comment. + 2009-05-29 Richard Guenther * tree-ssa-alias.c (nonaliasing_component_refs_p): Remove diff --git a/gcc/sel-sched-ir.c b/gcc/sel-sched-ir.c index d3f35627815a..655c87327250 100644 --- a/gcc/sel-sched-ir.c +++ b/gcc/sel-sched-ir.c @@ -3730,7 +3730,8 @@ get_seqno_of_a_pred (insn_t insn) return seqno; } -/* Find the proper seqno for inserting at INSN. */ +/* Find the proper seqno for inserting at INSN. Returns -1 if no predecessors + with positive seqno exist. */ int get_seqno_by_preds (rtx insn) { @@ -3749,7 +3750,6 @@ get_seqno_by_preds (rtx insn) for (i = 0, seqno = -1; i < n; i++) seqno = MAX (seqno, INSN_SEQNO (preds[i])); - gcc_assert (seqno > 0); return seqno; } diff --git a/gcc/sel-sched.c b/gcc/sel-sched.c index b1a33beb7d04..a7dedc5ef2d9 100644 --- a/gcc/sel-sched.c +++ b/gcc/sel-sched.c @@ -4524,11 +4524,27 @@ find_seqno_for_bookkeeping (insn_t place_to_insert, insn_t join_point) if (INSN_P (next) && JUMP_P (next) && BLOCK_FOR_INSN (next) == BLOCK_FOR_INSN (place_to_insert)) - seqno = INSN_SEQNO (next); + { + gcc_assert (INSN_SCHED_TIMES (next) == 0); + seqno = INSN_SEQNO (next); + } else if (INSN_SEQNO (join_point) > 0) seqno = INSN_SEQNO (join_point); else - seqno = get_seqno_by_preds (place_to_insert); + { + seqno = get_seqno_by_preds (place_to_insert); + + /* Sometimes the fences can move in such a way that there will be + no instructions with positive seqno around this bookkeeping. + This means that there will be no way to get to it by a regular + fence movement. Never mind because we pick up such pieces for + rescheduling anyways, so any positive value will do for now. */ + if (seqno < 0) + { + gcc_assert (pipelining_p); + seqno = 1; + } + } gcc_assert (seqno > 0); return seqno;