Commit da7ba240 by Andrey Belevantsev Committed by Andrey Belevantsev

re PR rtl-optimization/40101 (200.sixtrack ICEs in get_seqno_by_preds, at sel-sched-ir.c:3752)

        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.

From-SVN: r147977
parent 71dcd609
2009-05-29 Andrey Belevantsev <abel@ispras.ru>
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 <rguenther@suse.de> 2009-05-29 Richard Guenther <rguenther@suse.de>
* tree-ssa-alias.c (nonaliasing_component_refs_p): Remove * tree-ssa-alias.c (nonaliasing_component_refs_p): Remove
......
...@@ -3730,7 +3730,8 @@ get_seqno_of_a_pred (insn_t insn) ...@@ -3730,7 +3730,8 @@ get_seqno_of_a_pred (insn_t insn)
return seqno; 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 int
get_seqno_by_preds (rtx insn) get_seqno_by_preds (rtx insn)
{ {
...@@ -3749,7 +3750,6 @@ get_seqno_by_preds (rtx insn) ...@@ -3749,7 +3750,6 @@ get_seqno_by_preds (rtx insn)
for (i = 0, seqno = -1; i < n; i++) for (i = 0, seqno = -1; i < n; i++)
seqno = MAX (seqno, INSN_SEQNO (preds[i])); seqno = MAX (seqno, INSN_SEQNO (preds[i]));
gcc_assert (seqno > 0);
return seqno; return seqno;
} }
......
...@@ -4524,11 +4524,27 @@ find_seqno_for_bookkeeping (insn_t place_to_insert, insn_t join_point) ...@@ -4524,11 +4524,27 @@ find_seqno_for_bookkeeping (insn_t place_to_insert, insn_t join_point)
if (INSN_P (next) if (INSN_P (next)
&& JUMP_P (next) && JUMP_P (next)
&& BLOCK_FOR_INSN (next) == BLOCK_FOR_INSN (place_to_insert)) && 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) else if (INSN_SEQNO (join_point) > 0)
seqno = INSN_SEQNO (join_point); seqno = INSN_SEQNO (join_point);
else 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); gcc_assert (seqno > 0);
return seqno; return seqno;
......
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