/* Get the index corresponding to VAR in the current LOOP. If
it's the first time we ask for this VAR, then we return
- chrec_not_analysed_yet for this VAR and return its index. */
+ chrec_not_analyzed_yet for this VAR and return its index. */
static tree *
find_var_scev_info (tree var)
/* Number of iterations is off by one (the ssa name we
analyze must be defined before the exit). */
nb_iter = chrec_fold_minus (chrec_type (nb_iter),
- nb_iter,
- fold_convert (chrec_type (nb_iter),
- integer_one_node));
+ nb_iter,
+ build_int_cst_type (chrec_type (nb_iter), 1));
/* evolution_fn is the evolution function in LOOP. Get
its value in the nb_iter-th iteration. */
nb_iter = chrec_fold_minus
(chrec_type (nb_iter), nb_iter,
- fold_convert (chrec_type (nb_iter), integer_one_node));
+ build_int_cst (chrec_type (nb_iter), 1));
#if 0
/* TODO -- If the test is after the exit, we may decrease the number of
if (after_exit)
nb_iter = chrec_fold_minus
(chrec_type (nb_iter), nb_iter,
- fold_convert (chrec_type (nb_iter), integer_one_node));
+ build_int_cst (chrec_type (nb_iter), 1));
#endif
end_value = chrec_apply (CHREC_VARIABLE (chrec), chrec, nb_iter);
{
var = loop_nb;
left = chrec_before;
- right = fold_convert (type, integer_zero_node);
+ right = build_int_cst (type, 0);
}
else
{
if (code == MINUS_EXPR)
to_add = chrec_fold_multiply (type, to_add,
- fold_convert (type, integer_minus_one_node));
+ build_int_cst_type (type, -1));
res = add_to_evolution_1 (loop_nb, chrec_before, to_add);
set_nb_iterations_in_loop (struct loop *loop,
tree res)
{
- res = chrec_fold_plus (chrec_type (res), res, integer_one_node);
+ res = chrec_fold_plus (chrec_type (res), res,
+ build_int_cst_type (chrec_type (res), 1));
+
/* FIXME HWI: However we want to store one iteration less than the
count of the loop in order to be compatible with the other
nb_iter computations in loop-iv. This also allows the
switch (TREE_CODE (condition))
{
case SSA_NAME:
- /* Volatile expressions are not analyzable. */
- if (TREE_THIS_VOLATILE (SSA_NAME_VAR (condition)))
- return false;
return true;
case LT_EXPR:
case GE_EXPR:
case EQ_EXPR:
case NE_EXPR:
- {
- tree opnd0, opnd1;
-
- opnd0 = TREE_OPERAND (condition, 0);
- opnd1 = TREE_OPERAND (condition, 1);
-
- if (TREE_CODE (opnd0) == SSA_NAME
- && TREE_THIS_VOLATILE (SSA_NAME_VAR (opnd0)))
- return false;
-
- if (TREE_CODE (opnd1) == SSA_NAME
- && TREE_THIS_VOLATILE (SSA_NAME_VAR (opnd1)))
- return false;
-
- return true;
- }
+ return true;
default:
return false;
}
/* Select the candidate loop nests for the analysis. This function
- initializes the EXIT_CONDITIONS array. */
+ initializes the EXIT_CONDITIONS array. */
static void
select_loops_exit_conditions (struct loops *loops,
if (TREE_CODE (rhs0) == SSA_NAME)
{
- if (TREE_CODE (rhs1) == SSA_NAME)
- {
- /* Match an assignment under the form:
- "a = b - c". */
- res = follow_ssa_edge
- (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
- evolution_of_loop);
-
- if (res)
- *evolution_of_loop = add_to_evolution
- (loop->num, chrec_convert (type_rhs, *evolution_of_loop),
- MINUS_EXPR, rhs1);
-
- else
- {
- res = follow_ssa_edge
- (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi,
- evolution_of_loop);
-
- if (res)
- *evolution_of_loop = add_to_evolution
- (loop->num,
- chrec_fold_multiply (type_rhs,
- *evolution_of_loop,
- fold_convert (type_rhs,
- integer_minus_one_node)),
- PLUS_EXPR, rhs0);
- }
- }
-
- else
- {
- /* Match an assignment under the form:
- "a = b - ...". */
- res = follow_ssa_edge
- (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
- evolution_of_loop);
- if (res)
- *evolution_of_loop = add_to_evolution
- (loop->num, chrec_convert (type_rhs, *evolution_of_loop),
- MINUS_EXPR, rhs1);
- }
- }
-
- else if (TREE_CODE (rhs1) == SSA_NAME)
- {
/* Match an assignment under the form:
- "a = ... - c". */
- res = follow_ssa_edge
- (loop, SSA_NAME_DEF_STMT (rhs1), halting_phi,
- evolution_of_loop);
+ "a = b - ...". */
+ res = follow_ssa_edge (loop, SSA_NAME_DEF_STMT (rhs0), halting_phi,
+ evolution_of_loop);
if (res)
*evolution_of_loop = add_to_evolution
- (loop->num,
- chrec_fold_multiply (type_rhs,
- *evolution_of_loop,
- fold_convert (type_rhs, integer_minus_one_node)),
- PLUS_EXPR, rhs0);
+ (loop->num, chrec_convert (type_rhs, *evolution_of_loop),
+ MINUS_EXPR, rhs1);
}
-
else
/* Otherwise, match an assignment under the form:
"a = ... - ...". */
}
/* This case occurs when one of the condition branches sets
- the variable to a constant: ie. a phi-node like
+ the variable to a constant: i.e. a phi-node like
"a_2 = PHI <a_7(5), 2(6)>;".
FIXME: This case have to be refined correctly:
for (i = 1; i < PHI_NUM_ARGS (condition_phi); i++)
{
+ /* Quickly give up when the evolution of one of the branches is
+ not known. */
+ if (*evolution_of_loop == chrec_dont_know)
+ return true;
+
if (!follow_ssa_edge_in_condition_phi_branch (i, loop, condition_phi,
halting_phi,
&evolution_of_branch,
return true;
/* Otherwise, the evolution of the HALTING_PHI depends
- on the evolution of another loop-phi-node, ie. the
+ on the evolution of another loop-phi-node, i.e. the
evolution function is a higher degree polynomial. */
if (def_loop == loop)
return false;
/* When it is impossible to go back on the same
loop_phi_node by following the ssa edges, the
- evolution is represented by a peeled chrec, ie. the
+ evolution is represented by a peeled chrec, i.e. the
first iteration, EV_FN has the value INIT_COND, then
all the other iterations it has the value of ARG.
For the moment, PEELED_CHREC nodes are not built. */
opnd10 = TREE_OPERAND (opnd1, 0);
chrec10 = analyze_scalar_evolution (loop, opnd10);
chrec10 = chrec_convert (type, chrec10);
- res = chrec_fold_minus (type, fold_convert (type, integer_zero_node),
- chrec10);
+ res = chrec_fold_minus (type, build_int_cst (type, 0), chrec10);
break;
case MULT_EXPR:
type = TREE_TYPE (niter_desc.niter);
if (integer_nonzerop (niter_desc.may_be_zero))
- res = fold_convert (type, integer_zero_node);
+ res = build_int_cst (type, 0);
else if (integer_zerop (niter_desc.may_be_zero))
res = niter_desc.niter;
else
loop = loop_containing_stmt (VARRAY_TREE (exit_conditions, i));
bb = loop->header;
- for (phi = phi_nodes (bb); phi; phi = TREE_CHAIN (phi))
+ for (phi = phi_nodes (bb); phi; phi = PHI_CHAIN (phi))
if (is_gimple_reg (PHI_RESULT (phi)))
{
chrec = instantiate_parameters