re PR rtl-optimization/29924 (pr24626-4.c fails on powerpc-aix and others)
PR rtl-optimization/29924 * loop-unroll.c (split_edge_and_insert): Handle the case insns is NULL. (unroll_loop_runtime_iterations): Assert that the argument passed to split_edge_and_insert is not NULL. * loop-doloop.c (add_test): Ditto. From-SVN: r119078
This commit is contained in:
parent
92c59193a1
commit
7d93d98774
@ -1,3 +1,11 @@
|
||||
2006-11-22 Zdenek Dvorak <dvorakz@suse.cz>
|
||||
|
||||
PR rtl-optimization/29924
|
||||
* loop-unroll.c (split_edge_and_insert): Handle the case insns is NULL.
|
||||
(unroll_loop_runtime_iterations): Assert that the argument passed to
|
||||
split_edge_and_insert is not NULL.
|
||||
* loop-doloop.c (add_test): Ditto.
|
||||
|
||||
2006-11-22 Zdenek Dvorak <dvorakz@suse.cz>
|
||||
|
||||
* tree-loop-linear.c (linear_transform_loops): Use single_exit accessor
|
||||
|
@ -248,7 +248,7 @@ add_test (rtx cond, edge *e, basic_block dest)
|
||||
do_compare_rtx_and_jump (op0, op1, code, 0, mode, NULL_RTX, NULL_RTX, label);
|
||||
|
||||
jump = get_last_insn ();
|
||||
if (!JUMP_P (jump))
|
||||
if (!jump || !JUMP_P (jump))
|
||||
{
|
||||
/* The condition is always false and the jump was optimized out. */
|
||||
end_sequence ();
|
||||
@ -257,6 +257,10 @@ add_test (rtx cond, edge *e, basic_block dest)
|
||||
|
||||
seq = get_insns ();
|
||||
end_sequence ();
|
||||
|
||||
/* There always is at least the jump insn in the sequence. */
|
||||
gcc_assert (seq != NULL_RTX);
|
||||
|
||||
bb = split_edge_and_insert (*e, seq);
|
||||
*e = single_succ_edge (bb);
|
||||
|
||||
|
@ -899,13 +899,18 @@ decide_unroll_runtime_iterations (struct loop *loop, int flags)
|
||||
loop->lpt_decision.times);
|
||||
}
|
||||
|
||||
/* Splits edge E and inserts INSNS on it. */
|
||||
/* Splits edge E and inserts the sequence of instructions INSNS on it, and
|
||||
returns the newly created block. If INSNS is NULL_RTX, nothing is changed
|
||||
and NULL is returned instead. */
|
||||
|
||||
basic_block
|
||||
split_edge_and_insert (edge e, rtx insns)
|
||||
{
|
||||
basic_block bb = split_edge (e);
|
||||
gcc_assert (insns != NULL_RTX);
|
||||
basic_block bb;
|
||||
|
||||
if (!insns)
|
||||
return NULL;
|
||||
bb = split_edge (e);
|
||||
emit_insn_after (insns, BB_END (bb));
|
||||
bb->flags |= BB_SUPERBLOCK;
|
||||
return bb;
|
||||
@ -1069,6 +1074,10 @@ unroll_loop_runtime_iterations (struct loops *loops, struct loop *loop)
|
||||
block_label (preheader), p,
|
||||
NULL_RTX);
|
||||
|
||||
/* We rely on the fact that the compare and jump cannot be optimized out,
|
||||
and hence the cfg we create is correct. */
|
||||
gcc_assert (branch_code != NULL_RTX);
|
||||
|
||||
swtch = split_edge_and_insert (single_pred_edge (swtch), branch_code);
|
||||
set_immediate_dominator (CDI_DOMINATORS, preheader, swtch);
|
||||
single_pred_edge (swtch)->probability = REG_BR_PROB_BASE - p;
|
||||
@ -1086,6 +1095,7 @@ unroll_loop_runtime_iterations (struct loops *loops, struct loop *loop)
|
||||
branch_code = compare_and_jump_seq (copy_rtx (niter), const0_rtx, EQ,
|
||||
block_label (preheader), p,
|
||||
NULL_RTX);
|
||||
gcc_assert (branch_code != NULL_RTX);
|
||||
|
||||
swtch = split_edge_and_insert (single_succ_edge (swtch), branch_code);
|
||||
set_immediate_dominator (CDI_DOMINATORS, preheader, swtch);
|
||||
|
Loading…
x
Reference in New Issue
Block a user