/* Loop unswitching.
- Copyright (C) 2004 Free Software Foundation, Inc.
+ Copyright (C) 2004, 2005 Free Software Foundation, Inc.
This file is part of GCC.
continue;
changed |= tree_unswitch_single_loop (loops, loop, 0);
-#ifdef ENABLE_CHECKING
- verify_dominators (CDI_DOMINATORS);
- verify_loop_structure (loops);
-#endif
}
if (changed)
static tree
tree_may_unswitch_on (basic_block bb, struct loop *loop)
{
- tree stmt, def, cond;
+ tree stmt, def, cond, use;
basic_block def_bb;
- use_optype uses;
- unsigned i;
+ ssa_op_iter iter;
/* BB must end in a simple conditional jump. */
stmt = last_stmt (bb);
return NULL_TREE;
/* Condition must be invariant. */
- get_stmt_operands (stmt);
- uses = STMT_USE_OPS (stmt);
- for (i = 0; i < NUM_USES (uses); i++)
+ FOR_EACH_SSA_TREE_OPERAND (use, stmt, iter, SSA_OP_USE)
{
- def = SSA_NAME_DEF_STMT (USE_OP (uses, i));
+ def = SSA_NAME_DEF_STMT (use);
def_bb = bb_for_stmt (def);
if (def_bb
&& flow_bb_inside_loop_p (loop, def_bb))
? boolean_true_node
: boolean_false_node);
- if (EDGE_COUNT (e->src->preds) > 1)
+ if (!single_pred_p (e->src))
return cond;
- e = EDGE_PRED (e->src, 0);
+ e = single_pred_edge (e->src);
if (e->src == ENTRY_BLOCK_PTR)
return cond;
}
else
break;
- modify_stmt (stmt);
+ update_stmt (stmt);
i++;
}
if (!nloop)
return changed;
+ /* Update the SSA form after unswitching. */
+ update_ssa (TODO_update_ssa);
+
/* Invoke itself on modified loops. */
tree_unswitch_single_loop (loops, nloop, num + 1);
tree_unswitch_single_loop (loops, loop, num + 1);
gcc_assert (EDGE_COUNT (unswitch_on->succs) == 2);
gcc_assert (loop->inner == NULL);
- return tree_ssa_loop_version (loops, loop, unshare_expr (cond),
- &condition_bb);
+ return loop_version (loops, loop, unshare_expr (cond),
+ &condition_bb);
}