+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
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 ();
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);
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;
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;
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);