Signed-off-by: Sebastian Pop <seb...@gmail.com> --- gcc/graphite-poly.c | 12 ++++- gcc/graphite-poly.h | 6 ++ gcc/graphite-sese-to-poly.c | 122 ++++++++++++++++++++++++++++++------------ 3 files changed, 104 insertions(+), 36 deletions(-)
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c index fd2703b..ce0649b 100644 --- a/gcc/graphite-poly.c +++ b/gcc/graphite-poly.c @@ -880,6 +880,7 @@ new_poly_bb (scop_p scop, void *black_box) poly_bb_p pbb = XNEW (struct poly_bb); PBB_DOMAIN (pbb) = NULL; + pbb->domain = NULL; PBB_SCOP (pbb) = scop; pbb_set_black_box (pbb, black_box); PBB_TRANSFORMED (pbb) = NULL; @@ -901,7 +902,10 @@ free_poly_bb (poly_bb_p pbb) int i; poly_dr_p pdr; - ppl_delete_Pointset_Powerset_C_Polyhedron (PBB_DOMAIN (pbb)); + if (PBB_DOMAIN (pbb)) + ppl_delete_Pointset_Powerset_C_Polyhedron (PBB_DOMAIN (pbb)); + + isl_set_free (pbb->domain); if (PBB_TRANSFORMED (pbb)) poly_scattering_free (PBB_TRANSFORMED (pbb)); @@ -1096,6 +1100,12 @@ print_pbb_domain (FILE *file, poly_bb_p pbb, int verbosity) graphite_dim_t i; gimple_bb_p gbb = PBB_BLACK_BOX (pbb); + { + isl_printer *pp = isl_printer_to_file (PBB_SCOP (pbb)->ctx, file); + pp = isl_printer_print_set (pp, pbb->domain); + isl_printer_free (pp); + } + if (!PBB_DOMAIN (pbb)) return; diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h index bb8771d..3483ef0 100644 --- a/gcc/graphite-poly.h +++ b/gcc/graphite-poly.h @@ -502,6 +502,12 @@ pbb_dim_iter_domain (const struct poly_bb *pbb) { scop_p scop = PBB_SCOP (pbb); ppl_dimension_type dim; + isl_dim *d = isl_set_get_dim (pbb->domain); + graphite_dim_t res = isl_dim_size (d, isl_dim_set); + + isl_dim_free (d); + if (0) + return res; ppl_Pointset_Powerset_C_Polyhedron_space_dimension (PBB_DOMAIN (pbb), &dim); return dim - scop_nb_params (scop); diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c index 69392a9..75355e9 100644 --- a/gcc/graphite-sese-to-poly.c +++ b/gcc/graphite-sese-to-poly.c @@ -658,20 +658,6 @@ isl_id_for_ssa_name (scop_p s, tree e) return id; } -/* Return an ISL identifier from the loop L. */ - -static isl_id * -isl_id_for_loop (scop_p s, loop_p l) -{ - isl_id *id; - char name[50]; - - snprintf (name, sizeof (name), "L_%d", l ? l->num : -1); - id = isl_id_alloc (s->ctx, name, l); - - return id; -} - /* Extract an affine expression from the ssa_name E. */ static isl_pw_aff * @@ -1182,10 +1168,6 @@ find_scop_parameters (scop_p scop) dim = isl_dim_set_dim_id (dim, isl_dim_param, i, isl_id_for_ssa_name (scop, e)); - for (i = 0; i < nbl; i++) - dim = isl_dim_set_dim_id (dim, isl_dim_set, i, - isl_id_for_loop (scop, get_loop (i))); - scop->context = isl_set_universe (dim); } } @@ -1263,7 +1245,8 @@ add_upper_bounds_from_estimated_nit (scop_p scop, double_int nit, static void build_loop_iteration_domains (scop_p scop, struct loop *loop, ppl_Polyhedron_t outer_ph, int nb, - ppl_Pointset_Powerset_C_Polyhedron_t *domains) + ppl_Pointset_Powerset_C_Polyhedron_t *domains, + isl_set *outer, isl_set **doms) { int i; ppl_Polyhedron_t ph; @@ -1271,6 +1254,15 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, ppl_dimension_type dim = nb + 1 + scop_nb_params (scop); sese region = SCOP_REGION (scop); + isl_set *inner = isl_set_copy (outer); + isl_dim *dimension = isl_set_get_dim (scop->context); + int pos = loop->num; + isl_int v; + mpz_t g; + + mpz_init (g); + isl_int_init (v); + { ppl_const_Constraint_System_t pcs; ppl_dimension_type *map @@ -1301,8 +1293,17 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, ppl_delete_Linear_Expression (lb_expr); ppl_Polyhedron_add_constraint (ph, lb); ppl_delete_Constraint (lb); + + { + isl_constraint *c = isl_inequality_alloc (isl_dim_copy (dimension)); + + isl_int_set_si (v, 1); + isl_constraint_set_coefficient (c, isl_dim_set, pos, v); + inner = isl_set_add_constraint (inner, c); + } } + /* loop_i <= cst_nb_iters */ if (TREE_CODE (nb_iters) == INTEGER_CST) { ppl_Constraint_t ub; @@ -1310,14 +1311,26 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, ppl_new_Linear_Expression_with_dimension (&ub_expr, dim); - /* loop_i <= cst_nb_iters */ ppl_set_coef (ub_expr, nb, -1); ppl_set_inhomogeneous_tree (ub_expr, nb_iters); ppl_new_Constraint (&ub, ub_expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (ph, ub); ppl_delete_Linear_Expression (ub_expr); ppl_delete_Constraint (ub); + + { + isl_constraint *c = isl_inequality_alloc (isl_dim_copy (dimension)); + + isl_int_set_si (v, -1); + isl_constraint_set_coefficient (c, isl_dim_set, pos, v); + tree_int_to_gmp (nb_iters, g); + isl_int_set_gmp (v, g); + isl_constraint_set_constant (c, v); + inner = isl_set_add_constraint (inner, c); + } } + + /* loop_i <= expr_nb_iters */ else if (!chrec_contains_undetermined (nb_iters)) { mpz_t one; @@ -1337,6 +1350,15 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, scop->context = isl_set_intersect (scop->context, isl_pw_aff_nonneg_set (isl_pw_aff_copy (aff))); + { + isl_local_space *ls = isl_local_space_from_dim (isl_dim_copy (dimension)); + isl_aff *al = isl_aff_set_coefficient_si + (isl_aff_zero (ls), isl_dim_set, pos, 1); + isl_set *le = isl_pw_aff_le_set (isl_pw_aff_from_aff (al), + isl_pw_aff_copy (aff)); + inner = isl_set_intersect (inner, le); + } + if (max_stmt_executions (loop, true, &nit)) { add_upper_bounds_from_estimated_nit (scop, nit, dim, ub_expr); @@ -1361,7 +1383,6 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, } } - /* loop_i <= expr_nb_iters */ ppl_set_coef (ub_expr, nb, -1); ppl_new_Constraint (&ub, ub_expr, PPL_CONSTRAINT_TYPE_GREATER_OR_EQUAL); ppl_Polyhedron_add_constraint (ph, ub); @@ -1372,17 +1393,27 @@ build_loop_iteration_domains (scop_p scop, struct loop *loop, gcc_unreachable (); if (loop->inner && loop_in_sese_p (loop->inner, region)) - build_loop_iteration_domains (scop, loop->inner, ph, nb + 1, domains); + build_loop_iteration_domains (scop, loop->inner, ph, nb + 1, domains, + isl_set_copy (inner), doms); if (nb != 0 && loop->next && loop_in_sese_p (loop->next, region)) - build_loop_iteration_domains (scop, loop->next, outer_ph, nb, domains); + build_loop_iteration_domains (scop, loop->next, outer_ph, nb, domains, + isl_set_copy (outer), doms); ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron (&domains[loop->num], ph); - ppl_delete_Polyhedron (ph); + + gcc_assert (doms[loop->num] == NULL); + doms[loop->num] = isl_set_copy (inner); + + isl_set_free (inner); + isl_set_free (outer); + isl_dim_free (dimension); + isl_int_clear (v); + mpz_clear (g); } /* Returns a linear expression for tree T evaluated in PBB. */ @@ -1812,31 +1843,50 @@ build_scop_iteration_domain (scop_p scop) int nb_loops = number_of_loops (); ppl_Pointset_Powerset_C_Polyhedron_t *domains = XNEWVEC (ppl_Pointset_Powerset_C_Polyhedron_t, nb_loops); + isl_set **doms = XNEWVEC (isl_set *, nb_loops); for (i = 0; i < nb_loops; i++) - domains[i] = NULL; + { + domains[i] = NULL; + doms[i] = NULL; + } ppl_new_C_Polyhedron_from_space_dimension (&ph, scop_nb_params (scop), 0); FOR_EACH_VEC_ELT (loop_p, SESE_LOOP_NEST (region), i, loop) if (!loop_in_sese_p (loop_outer (loop), region)) - build_loop_iteration_domains (scop, loop, ph, 0, domains); + build_loop_iteration_domains (scop, loop, ph, 0, domains, + isl_set_copy (scop->context), doms); FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb) - if (domains[gbb_loop (PBB_BLACK_BOX (pbb))->num]) - ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron - (&PBB_DOMAIN (pbb), (ppl_const_Pointset_Powerset_C_Polyhedron_t) - domains[gbb_loop (PBB_BLACK_BOX (pbb))->num]); - else - ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron - (&PBB_DOMAIN (pbb), ph); + { + if (domains[gbb_loop (PBB_BLACK_BOX (pbb))->num]) + ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron + (&PBB_DOMAIN (pbb), (ppl_const_Pointset_Powerset_C_Polyhedron_t) + domains[gbb_loop (PBB_BLACK_BOX (pbb))->num]); + else + ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron + (&PBB_DOMAIN (pbb), ph); + + if (doms[gbb_loop (PBB_BLACK_BOX (pbb))->num]) + pbb->domain = isl_set_copy (doms[gbb_loop (PBB_BLACK_BOX (pbb))->num]); + else + pbb->domain = isl_set_copy (scop->context); + } for (i = 0; i < nb_loops; i++) - if (domains[i]) - ppl_delete_Pointset_Powerset_C_Polyhedron (domains[i]); + { + if (domains[i]) + ppl_delete_Pointset_Powerset_C_Polyhedron (domains[i]); + + if (doms[i]) + isl_set_free (doms[i]); + } ppl_delete_Polyhedron (ph); free (domains); + + free (doms); } /* Add a constrain to the ACCESSES polyhedron for the alias set of @@ -2461,6 +2511,8 @@ new_pbb_from_pbb (scop_p scop, poly_bb_p pbb, basic_block bb) ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron (&PBB_DOMAIN (pbb1), PBB_DOMAIN (pbb)); + pbb1->domain = isl_set_copy (pbb->domain); + GBB_PBB (gbb1) = pbb1; GBB_CONDITIONS (gbb1) = VEC_copy (gimple, heap, GBB_CONDITIONS (gbb)); GBB_CONDITION_CASES (gbb1) = VEC_copy (gimple, heap, GBB_CONDITION_CASES (gbb)); -- 1.7.4.1