static ppl_Pointset_Powerset_C_Polyhedron_t build_pairwise_scheduling_inequality (graphite_dim_t dim, graphite_dim_t pos, graphite_dim_t offset, bool direction) { ppl_Pointset_Powerset_C_Polyhedron_t res; ppl_Polyhedron_t equalities; ppl_Constraint_t cstr; ppl_new_C_Polyhedron_from_space_dimension (&equalities, dim, 0); if (direction) cstr = build_pairwise_constraint (dim, pos, pos + offset, -1, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); else cstr = build_pairwise_constraint (dim, pos, pos + offset, 1, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL); ppl_Polyhedron_add_constraint (equalities, cstr); ppl_delete_Constraint (cstr); ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&res, equalities); ppl_delete_Polyhedron (equalities); return res; }
void open_hypercube(int dimension, ppl_Polyhedron_t ph) { int i; mpz_t z_one; mpz_t z_minus_one; ppl_Coefficient_t coeff_one; ppl_Coefficient_t coeff_minus_one; ppl_Linear_Expression_t le; ppl_Constraint_t c; ppl_Constraint_System_t cs; mpz_init_set_si(z_one, 1); mpz_init_set_si(z_minus_one, -1); ppl_new_Coefficient(&coeff_one); ppl_assign_Coefficient_from_mpz_t(coeff_one, z_one); ppl_new_Coefficient(&coeff_minus_one); ppl_assign_Coefficient_from_mpz_t(coeff_minus_one, z_minus_one); ppl_new_Linear_Expression_with_dimension(&le, dimension); ppl_new_Constraint_System(&cs); for (i = 0; i < dimension; ++i) { ppl_Linear_Expression_add_to_coefficient(le, i, coeff_one); /* Variable(i) > 0 */ ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_GREATER_THAN); ppl_Constraint_System_insert_Constraint(cs, c); ppl_delete_Constraint(c); /* Variable(i) < 1 */ ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_minus_one); ppl_new_Constraint(&c, le, PPL_CONSTRAINT_TYPE_LESS_THAN); ppl_Constraint_System_insert_Constraint(cs, c); ppl_delete_Constraint(c); /* Zero `le' */ ppl_Linear_Expression_add_to_coefficient(le, i, coeff_minus_one); ppl_Linear_Expression_add_to_inhomogeneous(le, coeff_one); } ppl_Polyhedron_add_constraints(ph, cs); ppl_delete_Constraint_System(cs); ppl_delete_Linear_Expression(le); ppl_delete_Coefficient(coeff_minus_one); ppl_delete_Coefficient(coeff_one); mpz_clear(z_minus_one); mpz_clear(z_one); }
static void new_Constraint_System_from_Cloog_Matrix (ppl_Constraint_System_t *pcs, CloogMatrix *matrix) { int i; ppl_new_Constraint_System (pcs); for (i = 0; i < matrix->NbRows; i++) { ppl_Constraint_t c = cloog_matrix_to_ppl_constraint (matrix, i); ppl_Constraint_System_insert_Constraint (*pcs, c); ppl_delete_Constraint (c); } }
static ppl_Pointset_Powerset_C_Polyhedron_t dr_equality_constraints (graphite_dim_t dim, graphite_dim_t pos, graphite_dim_t nb_subscripts) { ppl_Polyhedron_t subscript_equalities; ppl_Pointset_Powerset_C_Polyhedron_t res; Value v, v_op; graphite_dim_t i; value_init (v); value_init (v_op); value_set_si (v, 1); value_set_si (v_op, -1); ppl_new_C_Polyhedron_from_space_dimension (&subscript_equalities, dim, 0); for (i = 0; i < nb_subscripts; i++) { ppl_Linear_Expression_t expr; ppl_Constraint_t cstr; ppl_Coefficient_t coef; ppl_new_Coefficient (&coef); ppl_new_Linear_Expression_with_dimension (&expr, dim); ppl_assign_Coefficient_from_mpz_t (coef, v); ppl_Linear_Expression_add_to_coefficient (expr, pos + i, coef); ppl_assign_Coefficient_from_mpz_t (coef, v_op); ppl_Linear_Expression_add_to_coefficient (expr, pos + i + nb_subscripts, coef); ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL); ppl_Polyhedron_add_constraint (subscript_equalities, cstr); ppl_delete_Linear_Expression (expr); ppl_delete_Constraint (cstr); ppl_delete_Coefficient (coef); } ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&res, subscript_equalities); value_clear (v); value_clear (v_op); ppl_delete_Polyhedron (subscript_equalities); return res; }
static ppl_Pointset_Powerset_C_Polyhedron_t build_pairwise_scheduling_equality (graphite_dim_t dim, graphite_dim_t pos, graphite_dim_t offset) { ppl_Pointset_Powerset_C_Polyhedron_t res; ppl_Polyhedron_t equalities; ppl_Constraint_t cstr; ppl_new_C_Polyhedron_from_space_dimension (&equalities, dim, 0); cstr = build_pairwise_constraint (dim, pos, pos + offset, 0, PPL_CONSTRAINT_TYPE_EQUAL); ppl_Polyhedron_add_constraint (equalities, cstr); ppl_delete_Constraint (cstr); ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&res, equalities); ppl_delete_Polyhedron (equalities); return res; }
static void extend_scattering (poly_bb_p pbb, int max_scattering) { ppl_dimension_type nb_old_dims, nb_new_dims; int nb_added_dims, i; ppl_Coefficient_t coef; Value one; nb_added_dims = max_scattering - pbb_nb_scattering_transform (pbb); value_init (one); value_set_si (one, 1); ppl_new_Coefficient (&coef); ppl_assign_Coefficient_from_mpz_t (coef, one); gcc_assert (nb_added_dims >= 0); nb_old_dims = pbb_nb_scattering_transform (pbb) + pbb_dim_iter_domain (pbb) + scop_nb_params (PBB_SCOP (pbb)); nb_new_dims = nb_old_dims + nb_added_dims; ppl_insert_dimensions (PBB_TRANSFORMED_SCATTERING (pbb), pbb_nb_scattering_transform (pbb), nb_added_dims); PBB_NB_SCATTERING_TRANSFORM (pbb) += nb_added_dims; /* Add identity matrix for the added dimensions. */ for (i = max_scattering - nb_added_dims; i < max_scattering; i++) { ppl_Constraint_t cstr; ppl_Linear_Expression_t expr; ppl_new_Linear_Expression_with_dimension (&expr, nb_new_dims); ppl_Linear_Expression_add_to_coefficient (expr, i, coef); ppl_new_Constraint (&cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL); ppl_Polyhedron_add_constraint (PBB_TRANSFORMED_SCATTERING (pbb), cstr); ppl_delete_Constraint (cstr); ppl_delete_Linear_Expression (expr); } ppl_delete_Coefficient (coef); value_clear (one); }
static void add_constraints(ppl_Linear_Expression_t ppl_le, int type, mpq_t rational_lb, mpq_t rational_ub, mpz_t den_lcm, ppl_Constraint_System_t ppl_cs) { ppl_Constraint_t ppl_c; ppl_Linear_Expression_t ppl_le2; switch (type) { case GLP_FR: break; case GLP_LO: mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb)); mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb)); mpz_neg(tmp_z, tmp_z); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); if (verbosity >= 4) { ppl_io_fprint_Constraint(output_file, ppl_c); fprintf(output_file, "\n"); } ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c); ppl_delete_Constraint(ppl_c); break; case GLP_UP: mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub)); mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub)); mpz_neg(tmp_z, tmp_z); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL); if (verbosity >= 4) { ppl_io_fprint_Constraint(output_file, ppl_c); fprintf(output_file, "\n"); } ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c); ppl_delete_Constraint(ppl_c); break; case GLP_DB: ppl_new_Linear_Expression_from_Linear_Expression(&ppl_le2, ppl_le); mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb)); mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb)); mpz_neg(tmp_z, tmp_z); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); if (verbosity >= 4) { ppl_io_fprint_Constraint(output_file, ppl_c); fprintf(output_file, "\n"); } ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c); ppl_delete_Constraint(ppl_c); mpz_mul(tmp_z, den_lcm, mpq_numref(rational_ub)); mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_ub)); mpz_neg(tmp_z, tmp_z); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_inhomogeneous(ppl_le2, ppl_coeff); ppl_new_Constraint(&ppl_c, ppl_le2, PPL_CONSTRAINT_TYPE_LESS_OR_EQUAL); ppl_delete_Linear_Expression(ppl_le2); if (verbosity >= 4) { ppl_io_fprint_Constraint(output_file, ppl_c); fprintf(output_file, "\n"); } ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c); ppl_delete_Constraint(ppl_c); break; case GLP_FX: mpz_mul(tmp_z, den_lcm, mpq_numref(rational_lb)); mpz_divexact(tmp_z, tmp_z, mpq_denref(rational_lb)); mpz_neg(tmp_z, tmp_z); ppl_assign_Coefficient_from_mpz_t(ppl_coeff, tmp_z); ppl_Linear_Expression_add_to_inhomogeneous(ppl_le, ppl_coeff); ppl_new_Constraint(&ppl_c, ppl_le, PPL_CONSTRAINT_TYPE_EQUAL); if (verbosity >= 4) { ppl_io_fprint_Constraint(output_file, ppl_c); fprintf(output_file, "\n"); } ppl_Constraint_System_insert_Constraint(ppl_cs, ppl_c); ppl_delete_Constraint(ppl_c); break; default: fatal("internal error"); break; } }
ppl_Polyhedron_t ppl_strip_loop (ppl_Polyhedron_t ph, ppl_dimension_type loop, int stride) { ppl_const_Constraint_System_t pcs; ppl_Constraint_System_const_iterator_t cit, end; ppl_const_Constraint_t cstr; ppl_Linear_Expression_t expr; int v; ppl_dimension_type dim; ppl_Polyhedron_t res; ppl_Coefficient_t c; Value val; value_init (val); ppl_new_Coefficient (&c); ppl_Polyhedron_space_dimension (ph, &dim); ppl_Polyhedron_get_constraints (ph, &pcs); /* Start from a copy of the constraints. */ ppl_new_C_Polyhedron_from_space_dimension (&res, dim + 1, 0); ppl_Polyhedron_add_constraints (res, pcs); /* Add an empty dimension for the strip loop. */ ppl_insert_dimensions (res, loop, 1); /* Identify the constraints that define the lower and upper bounds of the strip-mined loop, and add them to the strip loop. */ { ppl_Polyhedron_t tmp; ppl_new_C_Polyhedron_from_space_dimension (&tmp, dim + 1, 0); ppl_new_Constraint_System_const_iterator (&cit); ppl_new_Constraint_System_const_iterator (&end); for (ppl_Constraint_System_begin (pcs, cit), ppl_Constraint_System_end (pcs, end); !ppl_Constraint_System_const_iterator_equal_test (cit, end); ppl_Constraint_System_const_iterator_increment (cit)) { ppl_Constraint_System_const_iterator_dereference (cit, &cstr); ppl_new_Linear_Expression_from_Constraint (&expr, cstr); ppl_Linear_Expression_coefficient (expr, loop, c); ppl_delete_Linear_Expression (expr); ppl_Coefficient_to_mpz_t (c, val); v = value_get_si (val); if (0 < v || v < 0) ppl_Polyhedron_add_constraint (tmp, cstr); } ppl_delete_Constraint_System_const_iterator (cit); ppl_delete_Constraint_System_const_iterator (end); ppl_insert_dimensions (tmp, loop + 1, 1); ppl_Polyhedron_get_constraints (tmp, &pcs); ppl_Polyhedron_add_constraints (res, pcs); ppl_delete_Polyhedron (tmp); } /* Lower bound of a tile starts at "stride * outer_iv". */ { ppl_Constraint_t new_cstr; ppl_new_Linear_Expression_with_dimension (&expr, dim + 1); ppl_set_coef (expr, loop + 1, 1); ppl_set_coef (expr, loop, -1 * stride); ppl_new_Constraint (&new_cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_delete_Linear_Expression (expr); ppl_Polyhedron_add_constraint (res, new_cstr); ppl_delete_Constraint (new_cstr); } /* Upper bound of a tile stops at "stride * outer_iv + stride - 1", or at the old upper bound that is not modified. */ { ppl_Constraint_t new_cstr; ppl_new_Linear_Expression_with_dimension (&expr, dim + 1); ppl_set_coef (expr, loop + 1, -1); ppl_set_coef (expr, loop, stride); ppl_set_inhomogeneous (expr, stride - 1); ppl_new_Constraint (&new_cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_delete_Linear_Expression (expr); ppl_Polyhedron_add_constraint (res, new_cstr); ppl_delete_Constraint (new_cstr); } value_clear (val); ppl_delete_Coefficient (c); return res; }
static bool pbb_strip_mine_time_depth (poly_bb_p pbb, int time_depth, int stride) { ppl_dimension_type iter, dim, strip; ppl_Polyhedron_t res = PBB_TRANSFORMED_SCATTERING (pbb); /* STRIP is the dimension that iterates with stride STRIDE. */ /* ITER is the dimension that enumerates single iterations inside one strip that has at most STRIDE iterations. */ strip = time_depth; iter = strip + 2; psct_add_scattering_dimension (pbb, strip); psct_add_scattering_dimension (pbb, strip + 1); ppl_Polyhedron_space_dimension (res, &dim); /* Lower bound of the striped loop. */ { ppl_Constraint_t new_cstr; ppl_Linear_Expression_t expr; ppl_new_Linear_Expression_with_dimension (&expr, dim); ppl_set_coef (expr, strip, -1 * stride); ppl_set_coef (expr, iter, 1); ppl_new_Constraint (&new_cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_delete_Linear_Expression (expr); ppl_Polyhedron_add_constraint (res, new_cstr); ppl_delete_Constraint (new_cstr); } /* Upper bound of the striped loop. */ { ppl_Constraint_t new_cstr; ppl_Linear_Expression_t expr; ppl_new_Linear_Expression_with_dimension (&expr, dim); ppl_set_coef (expr, strip, stride); ppl_set_coef (expr, iter, -1); ppl_set_inhomogeneous (expr, stride - 1); ppl_new_Constraint (&new_cstr, expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_delete_Linear_Expression (expr); ppl_Polyhedron_add_constraint (res, new_cstr); ppl_delete_Constraint (new_cstr); } /* Static scheduling for ITER level. This is mandatory to keep the 2d + 1 canonical scheduling format. */ { ppl_Constraint_t new_cstr; ppl_Linear_Expression_t expr; ppl_new_Linear_Expression_with_dimension (&expr, dim); ppl_set_coef (expr, strip + 1, 1); ppl_set_inhomogeneous (expr, 0); ppl_new_Constraint (&new_cstr, expr, PPL_CONSTRAINT_TYPE_EQUAL); ppl_delete_Linear_Expression (expr); ppl_Polyhedron_add_constraint (res, new_cstr); ppl_delete_Constraint (new_cstr); } return true; }