/* Instruction scheduling pass. Selective scheduler and pipeliner.
- Copyright (C) 2006, 2007, 2008 Free Software Foundation, Inc.
+ Copyright (C) 2006, 2007, 2008, 2009 Free Software Foundation, Inc.
This file is part of GCC.
&& targetm.sched.skip_rtx_p (x))
{
*nx = XVECEXP (x, 0 ,0);
- *nmode = 0;
+ *nmode = VOIDmode;
return 1;
}
{
expr_history_def *phist = VEC_index (expr_history_def, vect, ind);
- /* When merging, either old vinsns are the *same* or, if not, both
- old and new vinsns are different pointers. In the latter case,
- though, new vinsns should be equal. */
- gcc_assert (phist->old_expr_vinsn == old_expr_vinsn
- || (phist->new_expr_vinsn != new_expr_vinsn
- && (vinsn_equal_p
- (phist->old_expr_vinsn, old_expr_vinsn))));
-
/* It is possible that speculation types of expressions that were
propagated through different paths will be different here. In this
case, merge the status to get the correct check later. */
{
rtx pat = PATTERN (insn);
- if (GET_CODE (insn) == INSN
+ if (NONJUMP_INSN_P (insn)
&& GET_CODE (pat) == SET
&& !force_unique_p)
{
maybe_tidy_empty_bb (basic_block bb)
{
basic_block succ_bb, pred_bb;
+ edge e;
+ edge_iterator ei;
bool rescan_p;
/* Keep empty bb only if this block immediately precedes EXIT and
|| !(single_pred_edge (bb)->flags & EDGE_FALLTHRU))))
return false;
+ /* Do not attempt to redirect complex edges. */
+ FOR_EACH_EDGE (e, ei, bb->preds)
+ if (e->flags & EDGE_COMPLEX)
+ return false;
+
free_data_sets (bb);
/* Do not delete BB if it has more than one successor.
/* Redirect all non-fallthru edges to the next bb. */
while (rescan_p)
{
- edge e;
- edge_iterator ei;
-
rescan_p = false;
FOR_EACH_EDGE (e, ei, bb->preds)
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)
{
for (i = 0, seqno = -1; i < n; i++)
seqno = MAX (seqno, INSN_SEQNO (preds[i]));
- gcc_assert (seqno > 0);
return seqno;
}
void
sel_merge_blocks (basic_block a, basic_block b)
{
- gcc_assert (can_merge_blocks_p (a, b));
-
sel_remove_empty_bb (b, true, false);
merge_blocks (a, b);
basic_block src;
int prev_max_uid;
rtx jump;
+ edge redirected;
latch_edge_p = (pipelining_p
&& current_loop_nest
src = e->src;
prev_max_uid = get_max_uid ();
-
- redirect_edge_and_branch (e, to);
- gcc_assert (last_added_blocks == NULL);
+
+ redirected = redirect_edge_and_branch (e, to);
+
+ gcc_assert (redirected && last_added_blocks == NULL);
/* When we've redirected a latch edge, update the header. */
if (latch_edge_p)
NULL, /* rgn_rank */
sel_print_insn, /* rgn_print_insn */
contributes_to_priority,
+ NULL, /* insn_finishes_block_p */
NULL, NULL,
NULL, NULL,