+/* Insert in the SCOP context constraints from the estimation of the
+ number of iterations. UB_EXPR is a linear expression describing
+ the number of iterations in a loop. This expression is bounded by
+ the estimation NIT. */
+
+static void
+add_upper_bounds_from_estimated_nit (scop_p scop, double_int nit,
+ ppl_dimension_type dim,
+ ppl_Linear_Expression_t ub_expr)
+{
+ mpz_t val;
+ ppl_Linear_Expression_t nb_iters_le;
+ ppl_Polyhedron_t pol;
+ ppl_Coefficient_t coef;
+ ppl_Constraint_t ub;
+
+ ppl_new_Linear_Expression_with_dimension (&ub_expr, dim);
+ ppl_new_C_Polyhedron_from_space_dimension (&pol, dim, 0);
+ ppl_new_Linear_Expression_from_Linear_Expression (&nb_iters_le,
+ ub_expr);
+
+ /* Construct the negated number of last iteration in VAL. */
+ mpz_init (val);
+ mpz_set_double_int (val, nit, false);
+ mpz_sub_ui (val, val, 1);
+ mpz_neg (val, val);
+
+ /* NB_ITERS_LE holds the number of last iteration in
+ parametrical form. Subtract estimated number of last
+ iteration and assert that result is not positive. */
+ ppl_new_Coefficient_from_mpz_t (&coef, val);
+ ppl_Linear_Expression_add_to_inhomogeneous (nb_iters_le, coef);
+ ppl_delete_Coefficient (coef);
+ ppl_new_Constraint (&ub, nb_iters_le,
+ PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL);
+ ppl_Polyhedron_add_constraint (pol, ub);
+
+ /* Remove all but last GDIM dimensions from POL to obtain
+ only the constraints on the parameters. */
+ {
+ graphite_dim_t gdim = scop_nb_params (scop);
+ ppl_dimension_type *dims = XNEWVEC (ppl_dimension_type, dim - gdim);
+ graphite_dim_t i;
+
+ for (i = 0; i < dim - gdim; i++)
+ dims[i] = i;
+
+ ppl_Polyhedron_remove_space_dimensions (pol, dims, dim - gdim);
+ XDELETEVEC (dims);
+ }
+
+ /* Add the constraints on the parameters to the SCoP context. */
+ {
+ ppl_Pointset_Powerset_C_Polyhedron_t constraints_ps;
+
+ ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron
+ (&constraints_ps, pol);
+ ppl_Pointset_Powerset_C_Polyhedron_intersection_assign
+ (SCOP_CONTEXT (scop), constraints_ps);
+ ppl_delete_Pointset_Powerset_C_Polyhedron (constraints_ps);
+ }
+
+ ppl_delete_Polyhedron (pol);
+ ppl_delete_Linear_Expression (nb_iters_le);
+ ppl_delete_Constraint (ub);
+ mpz_clear (val);
+}
+