constant, type_size);
}
else
- DR_INIT (dr) = init_cond = ssize_int (0);;
-
+ DR_INIT (dr) = init_cond = ssize_int (0);
+
if (invariant)
DR_OFFSET (dr) = invariant;
else
new_step = size_binop (TRUNC_DIV_EXPR,
fold_convert (ssizetype, step), type_size);
+ init_cond = chrec_convert (chrec_type (access_fn), init_cond, stmt);
+ new_step = chrec_convert (chrec_type (access_fn), new_step, stmt);
access_fn = chrec_replace_initial_condition (access_fn, init_cond);
access_fn = reset_evolution_in_loop (loop->num, access_fn, new_step);
int j;
for (j = 0; j < TREE_VEC_LENGTH (chrec) - 1; j++)
- {
- tree chrec_j = TREE_VEC_ELT (chrec, j);
- tree chrec_j_1 = TREE_VEC_ELT (chrec, j + 1);
- if (!integer_zerop
- (chrec_fold_minus
- (integer_type_node, chrec_j, chrec_j_1)))
- return false;
- }
+ if (!eq_evolutions_p (TREE_VEC_ELT (chrec, j),
+ TREE_VEC_ELT (chrec, j + 1)))
+ return false;
+
return true;
}
conflicts_b = TREE_VEC_ELT (conflicts_b, 0);
}
+ conflicts_b = chrec_convert (integer_type_node, conflicts_b,
+ NULL_TREE);
+ conflicts_a = chrec_convert (integer_type_node, conflicts_a,
+ NULL_TREE);
difference = chrec_fold_minus
(integer_type_node, conflicts_b, conflicts_a);
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "(analyze_ziv_subscript \n");
+ chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
+ chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
switch (TREE_CODE (difference))
tree *last_conflicts)
{
bool value0, value1, value2;
- tree difference = chrec_fold_minus
+ tree difference;
+
+ chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
+ chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
+ difference = chrec_fold_minus
(integer_type_node, CHREC_LEFT (chrec_b), chrec_a);
if (!chrec_is_positive (initial_condition (difference), &value0))
*overlaps_b = integer_zero_node;
if (xz_p)
{
- TREE_VEC_ELT (*overlaps_a, 0) =
- chrec_fold_plus (integer_type_node, TREE_VEC_ELT (*overlaps_a, 0),
- overlaps_a_xz);
- *overlaps_b =
- chrec_fold_plus (integer_type_node, *overlaps_b, overlaps_b_xz);
+ tree t0 = chrec_convert (integer_type_node,
+ TREE_VEC_ELT (*overlaps_a, 0), NULL_TREE);
+ tree t1 = chrec_convert (integer_type_node, overlaps_a_xz,
+ NULL_TREE);
+ tree t2 = chrec_convert (integer_type_node, *overlaps_b,
+ NULL_TREE);
+ tree t3 = chrec_convert (integer_type_node, overlaps_b_xz,
+ NULL_TREE);
+
+ TREE_VEC_ELT (*overlaps_a, 0) = chrec_fold_plus (integer_type_node,
+ t0, t1);
+ *overlaps_b = chrec_fold_plus (integer_type_node, t2, t3);
*last_conflicts = last_conflicts_xz;
}
if (yz_p)
{
- TREE_VEC_ELT (*overlaps_a, 1) =
- chrec_fold_plus (integer_type_node, TREE_VEC_ELT (*overlaps_a, 1),
- overlaps_a_yz);
- *overlaps_b =
- chrec_fold_plus (integer_type_node, *overlaps_b, overlaps_b_yz);
+ tree t0 = chrec_convert (integer_type_node,
+ TREE_VEC_ELT (*overlaps_a, 1), NULL_TREE);
+ tree t1 = chrec_convert (integer_type_node, overlaps_a_yz, NULL_TREE);
+ tree t2 = chrec_convert (integer_type_node, *overlaps_b, NULL_TREE);
+ tree t3 = chrec_convert (integer_type_node, overlaps_b_yz, NULL_TREE);
+
+ TREE_VEC_ELT (*overlaps_a, 1) = chrec_fold_plus (integer_type_node,
+ t0, t1);
+ *overlaps_b = chrec_fold_plus (integer_type_node, t2, t3);
*last_conflicts = last_conflicts_yz;
}
if (xyz_p)
{
- TREE_VEC_ELT (*overlaps_a, 0) =
- chrec_fold_plus (integer_type_node, TREE_VEC_ELT (*overlaps_a, 0),
- overlaps_a_xyz);
- TREE_VEC_ELT (*overlaps_a, 1) =
- chrec_fold_plus (integer_type_node, TREE_VEC_ELT (*overlaps_a, 1),
- overlaps_a_xyz);
- *overlaps_b =
- chrec_fold_plus (integer_type_node, *overlaps_b, overlaps_b_xyz);
+ tree t0 = chrec_convert (integer_type_node,
+ TREE_VEC_ELT (*overlaps_a, 0), NULL_TREE);
+ tree t1 = chrec_convert (integer_type_node, overlaps_a_xyz,
+ NULL_TREE);
+ tree t2 = chrec_convert (integer_type_node,
+ TREE_VEC_ELT (*overlaps_a, 1), NULL_TREE);
+ tree t3 = chrec_convert (integer_type_node, overlaps_a_xyz,
+ NULL_TREE);
+ tree t4 = chrec_convert (integer_type_node, *overlaps_b, NULL_TREE);
+ tree t5 = chrec_convert (integer_type_node, overlaps_b_xyz,
+ NULL_TREE);
+
+ TREE_VEC_ELT (*overlaps_a, 0) = chrec_fold_plus (integer_type_node,
+ t0, t1);
+ TREE_VEC_ELT (*overlaps_a, 1) = chrec_fold_plus (integer_type_node,
+ t2, t3);
+ *overlaps_b = chrec_fold_plus (integer_type_node, t4, t5);
*last_conflicts = last_conflicts_xyz;
}
}
int init_a, init_b, gamma, gcd_alpha_beta;
int tau1, tau2;
lambda_matrix A, U, S;
- tree difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
- if (integer_zerop (difference))
+ if (eq_evolutions_p (chrec_a, chrec_b))
{
- /* The difference is equal to zero: the accessed index
- overlaps for each iteration in the loop. */
+ /* The accessed index overlaps for each iteration in the
+ loop. */
*overlaps_a = integer_zero_node;
*overlaps_b = integer_zero_node;
*last_conflicts = chrec_dont_know;
there is no dependence. This function outputs a description of
the iterations that hold the intersections. */
-
nb_vars_a = nb_vars_in_chrec (chrec_a);
nb_vars_b = nb_vars_in_chrec (chrec_b);
static bool
can_use_analyze_subscript_affine_affine (tree *chrec_a, tree *chrec_b)
{
- tree diff;
+ tree diff, type, left_a, left_b, right_b;
if (chrec_contains_symbols (CHREC_RIGHT (*chrec_a))
|| chrec_contains_symbols (CHREC_RIGHT (*chrec_b)))
/* FIXME: For the moment not handled. Might be refined later. */
return false;
- diff = chrec_fold_minus (chrec_type (*chrec_a), CHREC_LEFT (*chrec_a),
- CHREC_LEFT (*chrec_b));
+ type = chrec_type (*chrec_a);
+ left_a = CHREC_LEFT (*chrec_a);
+ left_b = chrec_convert (type, CHREC_LEFT (*chrec_b), NULL_TREE);
+ diff = chrec_fold_minus (type, left_a, left_b);
+
if (!evolution_function_is_constant_p (diff))
return false;
*chrec_a = build_polynomial_chrec (CHREC_VARIABLE (*chrec_a),
diff, CHREC_RIGHT (*chrec_a));
+ right_b = chrec_convert (type, CHREC_RIGHT (*chrec_b), NULL_TREE);
*chrec_b = build_polynomial_chrec (CHREC_VARIABLE (*chrec_b),
- integer_zero_node,
- CHREC_RIGHT (*chrec_b));
+ build_int_cst (type, 0),
+ right_b);
return true;
}
dependence_stats.num_miv++;
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "(analyze_miv_subscript \n");
-
+
+ chrec_a = chrec_convert (integer_type_node, chrec_a, NULL_TREE);
+ chrec_b = chrec_convert (integer_type_node, chrec_b, NULL_TREE);
difference = chrec_fold_minus (integer_type_node, chrec_a, chrec_b);
- if (chrec_zerop (difference))
+ if (eq_evolutions_p (chrec_a, chrec_b))
{
/* Access functions are the same: all the elements are accessed
in the same order. */
unsigned i;
for (i = 0; i < DDR_NUM_SUBSCRIPTS (ddr); i++)
- {
- tree access_fun_a = DR_ACCESS_FN (DDR_A (ddr), i);
- tree access_fun_b = DR_ACCESS_FN (DDR_B (ddr), i);
- tree difference = chrec_fold_minus (integer_type_node, access_fun_a,
- access_fun_b);
- if (TREE_CODE (difference) != INTEGER_CST
- || !integer_zerop (difference))
- return false;
- }
+ if (!eq_evolutions_p (DR_ACCESS_FN (DDR_A (ddr), i),
+ DR_ACCESS_FN (DDR_B (ddr), i)))
+ return false;
return true;
}
static void
compute_all_dependences (VEC (data_reference_p, heap) *datarefs,
- VEC (ddr_p, heap) *dependence_relations,
+ VEC (ddr_p, heap) **dependence_relations,
VEC (loop_p, heap) *loop_nest,
bool compute_self_and_rr)
{
if (!DR_IS_READ (a) || !DR_IS_READ (b) || compute_self_and_rr)
{
ddr = initialize_data_dependence_relation (a, b, loop_nest);
- VEC_safe_push (ddr_p, heap, dependence_relations, ddr);
+ VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
compute_affine_dependence (ddr);
}
for (i = 0; VEC_iterate (data_reference_p, datarefs, i, a); i++)
{
ddr = initialize_data_dependence_relation (a, a, loop_nest);
- VEC_safe_push (ddr_p, heap, dependence_relations, ddr);
+ VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
compute_self_dependence (ddr);
}
}
VEC_safe_push (ddr_p, heap, *dependence_relations, ddr);
}
else
- compute_all_dependences (*datarefs, *dependence_relations, vloops,
+ compute_all_dependences (*datarefs, dependence_relations, vloops,
compute_self_and_read_read_dependences);
if (dump_file && (dump_flags & TDF_STATS))