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 ppl_print_linear_expr (FILE *file, ppl_Linear_Expression_t le) { ppl_Constraint_t c; ppl_Polyhedron_t pol; ppl_dimension_type dim; ppl_Linear_Expression_space_dimension (le, &dim); ppl_new_C_Polyhedron_from_space_dimension (&pol, dim, 0); ppl_new_Constraint (&c, le, PPL_CONSTRAINT_TYPE_EQUAL); ppl_Polyhedron_add_constraint (pol, c); ppl_print_polyhedron_matrix (file, pol); }
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); }
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; }