On Thu, Aug 11, 2011 at 05:44:37PM -0500, Sebastian Pop wrote: > > Signed-off-by: Sebastian Pop <seb...@gmail.com> > --- > gcc/graphite-clast-to-gimple.c | 55 ++++++-- > gcc/graphite-cloog-util.c | 1 + > gcc/graphite-poly.c | 8 + > gcc/graphite-poly.h | 3 + > gcc/graphite-sese-to-poly.c | 301 > +++++++++++++++++++++++++++++++++++++++- > gcc/graphite.c | 4 + > 6 files changed, 356 insertions(+), 16 deletions(-) > > diff --git a/gcc/graphite-clast-to-gimple.c b/gcc/graphite-clast-to-gimple.c > index bb0f4c8..9a9effa 100644 > --- a/gcc/graphite-clast-to-gimple.c > +++ b/gcc/graphite-clast-to-gimple.c > @@ -24,6 +24,11 @@ along with GCC; see the file COPYING3. If not see > #include <isl/set.h> > #include <isl/map.h> > #include <isl/union_map.h> > +#include <isl/list.h> > +#include <isl/constraint.h> > +#include <isl/div.h> > +#include <isl/ilp.h> > +#include <isl/aff.h> > #include <cloog/cloog.h> > #include <cloog/isl/domain.h> > #endif > @@ -768,16 +773,19 @@ graphite_create_new_guard (edge entry_edge, struct > clast_guard *stmt, > static void > compute_bounds_for_param (scop_p scop, int param, mpz_t low, mpz_t up) > { > - ppl_Linear_Expression_t le; > - > - /* Prepare the linear expression corresponding to the parameter that > - we want to maximize/minimize. */ > - ppl_new_Linear_Expression_with_dimension (&le, scop_nb_params (scop)); > - ppl_set_coef (le, param, 1); > - > - ppl_max_for_le_pointset (SCOP_CONTEXT (scop), le, up); > - ppl_min_for_le_pointset (SCOP_CONTEXT (scop), le, low); > - ppl_delete_Linear_Expression (le); > + isl_int v; > + isl_aff *aff = isl_aff_zero > + (isl_local_space_from_dim (isl_set_get_dim (scop->context))); > + > + aff = isl_aff_add_coefficient_si (aff, isl_dim_param, param, 1); > + > + isl_int_init (v); > + isl_set_min (scop->context, aff, &v); > + isl_int_get_gmp (v, low); > + isl_set_max (scop->context, aff, &v); > + isl_int_get_gmp (v, up); > + isl_int_clear (v); > + isl_aff_free (aff); > } > > /* Compute the lower bound LOW and upper bound UP for the induction > @@ -1357,7 +1365,6 @@ build_cloog_union_domain (scop_p scop) > { > int i; > poly_bb_p pbb; > - > CloogUnionDomain *union_domain = > cloog_union_domain_alloc (scop_nb_params (scop)); > > @@ -1460,8 +1467,30 @@ generate_cloog_input (scop_p scop, htab_t params_index) > union_domain = add_names_to_union_domain (scop, union_domain, > nb_scattering_dims, > params_index); > - context = new_Cloog_Domain_from_ppl_Pointset_Powerset > - (SCOP_CONTEXT (scop), scop_nb_params (scop), cloog_state); > + > + if (1) > + { > + /* For now remove the isl_id's from the context before > + translating to CLooG: this code will be removed when the > + domain will also contain isl_id's. */ > + isl_set *ct = isl_set_project_out (isl_set_copy (scop->context), > + isl_dim_set, 0, number_of_loops ()); > + isl_printer *p = isl_printer_to_str (scop->ctx); > + char *str; > + > + p = isl_printer_set_output_format (p, ISL_FORMAT_EXT_POLYLIB); > + p = isl_printer_print_set (p, ct); > + isl_set_free (ct); > + > + str = isl_printer_get_str (p); > + ct = isl_set_read_from_str (scop->ctx, str, > + scop_nb_params (scop)); > + free (str); > + isl_printer_free (p); > + context = cloog_domain_from_isl_set (ct); > + } > + else > + context = cloog_domain_from_isl_set (isl_set_copy (scop->context)); > > cloog_input = cloog_input_alloc (context, union_domain); > > diff --git a/gcc/graphite-cloog-util.c b/gcc/graphite-cloog-util.c > index 82a49a1..6086864 100644 > --- a/gcc/graphite-cloog-util.c > +++ b/gcc/graphite-cloog-util.c > @@ -25,6 +25,7 @@ along with GCC; see the file COPYING3. If not see > #include <isl/set.h> > #include <isl/map.h> > #include <isl/union_map.h> > +#include <isl/aff.h> > #include <cloog/cloog.h> > #include <cloog/isl/domain.h> > #endif > diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c > index af40d20..fd2703b 100644 > --- a/gcc/graphite-poly.c > +++ b/gcc/graphite-poly.c > @@ -1012,6 +1012,7 @@ new_scop (void *region) > scop_p scop = XNEW (struct scop); > > SCOP_CONTEXT (scop) = NULL; > + scop->context = NULL; > scop_set_region (scop, region); > SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3); > SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p, > @@ -1040,6 +1041,7 @@ free_scop (scop_p scop) > if (SCOP_CONTEXT (scop)) > ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop)); > > + isl_set_free (scop->context); > htab_delete (SCOP_ORIGINAL_PDDRS (scop)); > free_lst (SCOP_ORIGINAL_SCHEDULE (scop)); > free_lst (SCOP_TRANSFORMED_SCHEDULE (scop)); > @@ -1401,6 +1403,12 @@ print_scop_context (FILE *file, scop_p scop, int > verbosity) > else > fprintf (file, "0 %d\n", (int) scop_nb_params (scop) + 2); > > + if (scop->context) > + { > + isl_printer *p = isl_printer_to_file (scop->ctx, file); > + isl_printer_print_set (p, scop->context); > + } > + > if (verbosity > 0) > fprintf (file, "# )\n"); > } > diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h > index 72e9530..bb8771d 100644 > --- a/gcc/graphite-poly.h > +++ b/gcc/graphite-poly.h > @@ -1409,6 +1409,9 @@ struct scop > ppl_Pointset_Powerset_C_Polyhedron_t _context; > isl_set *context; > > + /* The context used internally by ISL. */ > + isl_ctx *ctx; > + > /* A hashtable of the data dependence relations for the original > scattering. */ > htab_t original_pddrs; > diff --git a/gcc/graphite-sese-to-poly.c b/gcc/graphite-sese-to-poly.c > index b7efe41..69392a9 100644 > --- a/gcc/graphite-sese-to-poly.c > +++ b/gcc/graphite-sese-to-poly.c > @@ -24,6 +24,8 @@ along with GCC; see the file COPYING3. If not see > #include <isl/set.h> > #include <isl/map.h> > #include <isl/union_map.h> > +#include <isl/constraint.h> > +#include <isl/aff.h> > #include <cloog/cloog.h> > #include <cloog/cloog.h> > #include <cloog/isl/domain.h> > @@ -595,6 +597,216 @@ build_scop_scattering (scop_p scop) > ppl_delete_Linear_Expression (static_schedule); > } > > +static isl_pw_aff *extract_affine (scop_p, tree); > + > +/* Extract an affine expression from the chain of recurrence E. */ > + > +static isl_pw_aff * > +extract_affine_chrec (scop_p s, tree e) > +{ > + isl_pw_aff *lhs = extract_affine (s, CHREC_LEFT (e)); > + isl_pw_aff *rhs = extract_affine (s, CHREC_RIGHT (e)); > + isl_dim *dim = isl_dim_set_alloc (s->ctx, 0, number_of_loops ()); > + isl_local_space *ls = isl_local_space_from_dim (dim); > + isl_aff *loop = isl_aff_set_coefficient_si > + (isl_aff_zero (ls), isl_dim_set, CHREC_VARIABLE (e), 1); > + isl_pw_aff *l = isl_pw_aff_from_aff (loop); > + > + /* Before multiplying, make sure that the result is affine. */ > + gcc_assert (isl_pw_aff_is_cst (rhs) > + || isl_pw_aff_is_cst (l)); > + > + return isl_pw_aff_add (lhs, isl_pw_aff_mul (rhs, l)); > +} > + > +/* Extract an affine expression from the mult_expr E. */ > + > +static isl_pw_aff * > +extract_affine_mul (scop_p s, tree e) > +{ > + isl_pw_aff *lhs = extract_affine (s, TREE_OPERAND (e, 0)); > + isl_pw_aff *rhs = extract_affine (s, TREE_OPERAND (e, 1)); > + > + if (!isl_pw_aff_is_cst (lhs) > + && !isl_pw_aff_is_cst (rhs)) > + { > + isl_pw_aff_free (lhs); > + isl_pw_aff_free (rhs); > + return NULL; > + } > + > + return isl_pw_aff_mul (lhs, rhs); > +} > + > +/* Return an ISL identifier from the name of the ssa_name E. */ > + > +static isl_id * > +isl_id_for_ssa_name (scop_p s, tree e) > +{ > + const char *name = get_name (e); > + isl_id *id; > + > + if (name) > + id = isl_id_alloc (s->ctx, name, e); > + else > + { > + char name1[50]; > + snprintf (name1, sizeof (name1), "P_%d", SSA_NAME_VERSION (e)); > + id = isl_id_alloc (s->ctx, name1, 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 * > +extract_affine_name (scop_p s, tree e) > +{ > + isl_aff *aff; > + isl_set *dom; > + isl_dim *dim = isl_dim_set_alloc (s->ctx, 1, number_of_loops ()); > + > + dim = isl_dim_set_dim_id (dim, isl_dim_param, 0, isl_id_for_ssa_name (s, > e)); > + dom = isl_set_universe (isl_dim_copy (dim)); > + aff = isl_aff_zero (isl_local_space_from_dim (dim)); > + aff = isl_aff_add_coefficient_si (aff, isl_dim_param, 0, 1); > + return isl_pw_aff_alloc (dom, aff); > +} > + > +/* Extract an affine expression from the gmp constant G. */ > + > +static isl_pw_aff * > +extract_affine_gmp (scop_p s, mpz_t g) > +{ > + isl_dim *dim = isl_dim_set_alloc (s->ctx, 0, number_of_loops ()); > + isl_local_space *ls = isl_local_space_from_dim (isl_dim_copy (dim)); > + isl_aff *aff = isl_aff_zero (ls); > + isl_set *dom = isl_set_universe (dim); > + isl_int v; > + > + isl_int_init (v); > + isl_int_set_gmp (v, g); > + aff = isl_aff_add_constant (aff, v); > + isl_int_clear (v); > + > + return isl_pw_aff_alloc (dom, aff); > +} > + > +/* Extract an affine expression from the integer_cst E. */ > + > +static isl_pw_aff * > +extract_affine_int (scop_p s, tree e) > +{ > + isl_pw_aff *res; > + mpz_t g; > + > + mpz_init (g); > + tree_int_to_gmp (e, g); > + res = extract_affine_gmp (s, g); > + mpz_clear (g); > + > + return res; > +} > + > +/* Compute pwaff mod 2^width. */ > + > +static isl_pw_aff * > +wrap (isl_pw_aff *pwaff, unsigned width) > +{ > + isl_int mod; > + > + isl_int_init (mod); > + isl_int_set_si (mod, 1); > + isl_int_mul_2exp (mod, mod, width); > + > + pwaff = isl_pw_aff_mod (pwaff, mod); > + > + isl_int_clear (mod); > + > + return pwaff; > +} > + > +/* Extract an affine expression from the tree E in the scop S. */ > + > +static isl_pw_aff * > +extract_affine (scop_p s, tree e) > +{ > + isl_pw_aff *lhs, *rhs, *res; > + tree type; > + > + if (e == chrec_dont_know) > + return NULL; > + > + switch (TREE_CODE (e)) > + { > + case POLYNOMIAL_CHREC: > + res = extract_affine_chrec (s, e); > + break; > + > + case MULT_EXPR: > + res = extract_affine_mul (s, e); > + break; > + > + case PLUS_EXPR: > + case POINTER_PLUS_EXPR: > + lhs = extract_affine (s, TREE_OPERAND (e, 0)); > + rhs = extract_affine (s, TREE_OPERAND (e, 1)); > + res = isl_pw_aff_add (lhs, rhs); > + break; > + > + case MINUS_EXPR: > + lhs = extract_affine (s, TREE_OPERAND (e, 0)); > + rhs = extract_affine (s, TREE_OPERAND (e, 1)); > + res = isl_pw_aff_sub (lhs, rhs); > + break; > + > + case NEGATE_EXPR: > + case BIT_NOT_EXPR: > + lhs = extract_affine (s, TREE_OPERAND (e, 0)); > + rhs = extract_affine (s, integer_minus_one_node); > + res = isl_pw_aff_mul (lhs, rhs); > + break; > + > + case SSA_NAME: > + res = extract_affine_name (s, e); > + break; > + > + case INTEGER_CST: > + res = extract_affine_int (s, e); > + break; > + > + CASE_CONVERT: > + case NON_LVALUE_EXPR: > + res = extract_affine (s, TREE_OPERAND (e, 0)); > + break; > + > + default: > + gcc_unreachable (); > + break; > + } > + > + type = TREE_TYPE (e); > + if (TYPE_UNSIGNED (type)) > + res = wrap (res, TYPE_PRECISION (type)); > + > + return res; > +} > + > /* Add the value K to the dimension D of the linear expression EXPR. */ > > static void > @@ -931,6 +1143,7 @@ find_scop_parameters (scop_p scop) > sese region = SCOP_REGION (scop); > struct loop *loop; > mpz_t one; > + int nbp; > > mpz_init (one); > mpz_set_si (one, 1); > @@ -953,11 +1166,28 @@ find_scop_parameters (scop_p scop) > FOR_EACH_VEC_ELT (poly_bb_p, SCOP_BBS (scop), i, pbb) > find_params_in_bb (region, PBB_BLACK_BOX (pbb)); > > - scop_set_nb_params (scop, sese_nb_params (region)); > + nbp = sese_nb_params (region); > + scop_set_nb_params (scop, nbp); > SESE_ADD_PARAMS (region) = false; > > ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension > - (&SCOP_CONTEXT (scop), scop_nb_params (scop), 0); > + (&SCOP_CONTEXT (scop), nbp, 0); > + > + { > + tree e; > + unsigned nbl = number_of_loops (); > + isl_dim *dim = isl_dim_set_alloc (scop->ctx, nbp, nbl); > + > + FOR_EACH_VEC_ELT (tree, SESE_PARAMS (region), i, e) > + 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); > + } > } > > /* Insert in the SCOP context constraints from the estimation of the > @@ -1094,6 +1324,7 @@ build_loop_iteration_domains (scop_p scop, struct loop > *loop, > ppl_Constraint_t ub; > ppl_Linear_Expression_t ub_expr; > double_int nit; > + isl_pw_aff *aff; > > mpz_init (one); > mpz_set_si (one, 1); > @@ -1102,8 +1333,33 @@ build_loop_iteration_domains (scop_p scop, struct loop > *loop, > scan_tree_for_params (SCOP_REGION (scop), nb_iters, ub_expr, one); > mpz_clear (one); > > + aff = extract_affine (scop, nb_iters); > + scop->context = isl_set_intersect > + (scop->context, isl_pw_aff_nonneg_set (isl_pw_aff_copy (aff))); > + > if (max_stmt_executions (loop, true, &nit)) > - add_upper_bounds_from_estimated_nit (scop, nit, dim, ub_expr); > + { > + add_upper_bounds_from_estimated_nit (scop, nit, dim, ub_expr); > + > + { > + /* Insert in the context the constraints from the > + estimation of the number of iterations NIT and the > + symbolic number of iterations (involving parameter > + names) NB_ITERS. First, build the affine expression > + "NIT - NB_ITERS" and then say that it is positive, > + i.e., NIT approximates NB_ITERS: "NIT >= NB_ITERS". */ > + isl_pw_aff *approx; > + mpz_t g; > + isl_set *x; > + > + mpz_init (g); > + mpz_set_double_int (g, nit, false); > + approx = extract_affine_gmp (scop, g); > + mpz_clear (g); > + x = isl_pw_aff_ge_set (approx, aff); > + scop->context = isl_set_intersect (scop->context, x); > + } > + } > > /* loop_i <= expr_nb_iters */ > ppl_set_coef (ub_expr, nb, -1); > @@ -1463,6 +1719,26 @@ add_param_constraints (scop_p scop, ppl_Polyhedron_t > context, graphite_dim_t p) > ppl_Polyhedron_add_constraint (context, cstr); > ppl_delete_Linear_Expression (le); > ppl_delete_Constraint (cstr); > + > + { > + isl_dim *dim = isl_set_get_dim (scop->context); > + isl_constraint *c = isl_inequality_alloc (dim); > + mpz_t g; > + isl_int v; > + > + mpz_init (g); > + isl_int_init (v); > + tree_int_to_gmp (lb, g); > + isl_int_set_gmp (v, g); > + isl_int_neg (v, v); > + mpz_clear (g); > + isl_constraint_set_constant (c, v); > + isl_int_set_si (v, 1); > + isl_constraint_set_coefficient (c, isl_dim_param, p, v); > + isl_int_clear (v); > + > + scop->context = isl_set_add_constraint (scop->context, c); > + } > } > > if (ub) > @@ -1474,6 +1750,25 @@ add_param_constraints (scop_p scop, ppl_Polyhedron_t > context, graphite_dim_t p) > ppl_Polyhedron_add_constraint (context, cstr); > ppl_delete_Linear_Expression (le); > ppl_delete_Constraint (cstr); > + > + { > + isl_dim *dim = isl_set_get_dim (scop->context); > + isl_constraint *c = isl_inequality_alloc (dim); > + mpz_t g; > + isl_int v; > + > + mpz_init (g); > + isl_int_init (v); > + tree_int_to_gmp (ub, g); > + isl_int_set_gmp (v, g); > + mpz_clear (g); > + isl_constraint_set_constant (c, v); > + isl_int_set_si (v, -1); > + isl_constraint_set_coefficient (c, isl_dim_param, p, v); > + isl_int_clear (v); > + > + scop->context = isl_set_add_constraint (scop->context, c); > + } > } > } > > diff --git a/gcc/graphite.c b/gcc/graphite.c > index 8f6d8a1..b2cf7c6 100644 > --- a/gcc/graphite.c > +++ b/gcc/graphite.c > @@ -260,10 +260,12 @@ graphite_transform_loops (void) > bool need_cfg_cleanup_p = false; > VEC (scop_p, heap) *scops = NULL; > htab_t bb_pbb_mapping; > + isl_ctx *ctx; > > if (!graphite_initialize ()) > return; > > + ctx = isl_ctx_alloc (); > build_scops (&scops); > > if (dump_file && (dump_flags & TDF_DETAILS)) > @@ -277,6 +279,7 @@ graphite_transform_loops (void) > FOR_EACH_VEC_ELT (scop_p, scops, i, scop) > if (dbg_cnt (graphite_scop)) > { > + scop->ctx = ctx; > build_poly_scop (scop); > > if (POLY_SCOP_P (scop) > @@ -288,6 +291,7 @@ graphite_transform_loops (void) > htab_delete (bb_pbb_mapping); > free_scops (scops); > graphite_finalize (need_cfg_cleanup_p); > + isl_ctx_free (ctx); > } > > #else /* If Cloog is not available: #ifndef HAVE_cloog. */ > -- > 1.7.4.1
Sebastian, This patch falls to compile under clang3.0svn with the error... ../../gcc-4.7-20110811/gcc/graphite-sese-to-poly.c:643:8: error: unknown type name 'isl_id' static isl_id * ^ ../../gcc-4.7-20110811/gcc/graphite-sese-to-poly.c:647:3: error: use of undeclared identifier 'isl_id' isl_id *id; Did you omit some of the patch? Jack