static void print_scattering_function_1 (FILE *file, poly_bb_p pbb, int verbosity) { graphite_dim_t i; if (verbosity > 0) { fprintf (file, "# scattering bb_%d (\n", pbb_index (pbb)); fprintf (file, "# eq"); for (i = 0; i < pbb_nb_scattering_transform (pbb); i++) fprintf (file, " s%d", (int) i); for (i = 0; i < pbb_nb_local_vars (pbb); i++) fprintf (file, " lv%d", (int) i); for (i = 0; i < pbb_dim_iter_domain (pbb); i++) fprintf (file, " i%d", (int) i); for (i = 0; i < pbb_nb_params (pbb); i++) fprintf (file, " p%d", (int) i); fprintf (file, " cst\n"); } /* Number of disjunct components. Remove this when PBB_TRANSFORMED_SCATTERING will be a pointset_powerset. */ fprintf (file, "1\n"); ppl_print_polyhedron_matrix (file, PBB_TRANSFORMED_SCATTERING (pbb) ? PBB_TRANSFORMED_SCATTERING (pbb) : PBB_ORIGINAL_SCATTERING (pbb)); if (verbosity > 0) fprintf (file, "#)\n"); }
static bool graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2, poly_dr_p pdr1, poly_dr_p pdr2) { ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1); ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2); ppl_Polyhedron_t so1 = PBB_ORIGINAL_SCATTERING (pbb1); ppl_Polyhedron_t so2 = PBB_ORIGINAL_SCATTERING (pbb2); ppl_Pointset_Powerset_C_Polyhedron_t po; graphite_dim_t sdim1 = pdr_nb_subscripts (pdr1) + 1; graphite_dim_t sdim2 = pdr_nb_subscripts (pdr2) + 1; if (sdim1 != sdim2) return true; po = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2, true, true); if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (po)) return true; else { ppl_Polyhedron_t st1 = PBB_TRANSFORMED_SCATTERING (pbb1); ppl_Polyhedron_t st2 = PBB_TRANSFORMED_SCATTERING (pbb2); ppl_Pointset_Powerset_C_Polyhedron_t pt; graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1); graphite_dim_t otdim1 = pbb_nb_scattering_orig (pbb1); graphite_dim_t otdim2 = pbb_nb_scattering_orig (pbb2); graphite_dim_t ttdim1 = pbb_nb_scattering_transform (pbb1); graphite_dim_t ttdim2 = pbb_nb_scattering_transform (pbb2); if (dump_file && (dump_flags & TDF_DETAILS)) fprintf (dump_file, "\nloop carries dependency.\n"); pt = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, st1, st2, false, false); /* Extend PO and PT to have the same dimensions. */ ppl_insert_dimensions_pointset (po, otdim1, ttdim1); ppl_insert_dimensions_pointset (po, otdim1 + ttdim1 + ddim1 + otdim2, ttdim2); ppl_insert_dimensions_pointset (pt, 0, otdim1); ppl_insert_dimensions_pointset (pt, otdim1 + ttdim1 + ddim1, otdim2); ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (po, pt); return ppl_Pointset_Powerset_C_Polyhedron_is_empty (po); } }
void print_scattering_function (FILE *file, poly_bb_p pbb, int verbosity) { if (!PBB_TRANSFORMED (pbb)) return; if (PBB_TRANSFORMED_SCATTERING (pbb) || PBB_ORIGINAL_SCATTERING (pbb)) { if (verbosity > 0) fprintf (file, "# Scattering function is provided\n"); fprintf (file, "1\n"); } else { if (verbosity > 0) fprintf (file, "# Scattering function is not provided\n"); fprintf (file, "0\n"); return; } print_scattering_function_1 (file, pbb, verbosity); }
static void lst_scale (lst_p lst, lst_p stmt, mpz_t factor) { mpz_t x; ppl_Coefficient_t one; int outer_depth = lst_depth (lst); poly_bb_p pbb = LST_PBB (stmt); ppl_Polyhedron_t poly = PBB_TRANSFORMED_SCATTERING (pbb); ppl_dimension_type outer_dim = psct_dynamic_dim (pbb, outer_depth); ppl_Linear_Expression_t expr; ppl_dimension_type dim; mpz_init (x); mpz_set_si (x, 1); ppl_new_Coefficient (&one); ppl_assign_Coefficient_from_mpz_t (one, x); ppl_Polyhedron_space_dimension (poly, &dim); ppl_new_Linear_Expression_with_dimension (&expr, dim); /* outer_dim = factor * outer_dim. */ ppl_set_coef_gmp (expr, outer_dim, factor); ppl_Polyhedron_affine_image (poly, outer_dim, expr, one); ppl_delete_Linear_Expression (expr); mpz_clear (x); ppl_delete_Coefficient (one); }
static void lst_offset (lst_p stmt, mpz_t offset) { lst_p inner = LST_LOOP_FATHER (stmt); poly_bb_p pbb = LST_PBB (stmt); ppl_Polyhedron_t poly = PBB_TRANSFORMED_SCATTERING (pbb); int inner_depth = lst_depth (inner); ppl_dimension_type inner_dim = psct_dynamic_dim (pbb, inner_depth); ppl_Linear_Expression_t expr; ppl_dimension_type dim; ppl_Coefficient_t one; mpz_t x; mpz_init (x); mpz_set_si (x, 1); ppl_new_Coefficient (&one); ppl_assign_Coefficient_from_mpz_t (one, x); ppl_Polyhedron_space_dimension (poly, &dim); ppl_new_Linear_Expression_with_dimension (&expr, dim); ppl_set_coef (expr, inner_dim, 1); ppl_set_inhomogeneous_gmp (expr, offset); ppl_Polyhedron_affine_image (poly, inner_dim, expr, one); ppl_delete_Linear_Expression (expr); ppl_delete_Coefficient (one); }
static bool graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2, int level) { poly_bb_p pbb1 = PDR_PBB (pdr1); poly_bb_p pbb2 = PDR_PBB (pdr2); ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1); ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2); ppl_Polyhedron_t so1 = PBB_TRANSFORMED_SCATTERING (pbb1); ppl_Polyhedron_t so2 = PBB_TRANSFORMED_SCATTERING (pbb2); ppl_Pointset_Powerset_C_Polyhedron_t po; ppl_Pointset_Powerset_C_Polyhedron_t eqpp; graphite_dim_t sdim1 = pdr_nb_subscripts (pdr1) + 1; graphite_dim_t sdim2 = pdr_nb_subscripts (pdr2) + 1; graphite_dim_t tdim1 = pbb_nb_scattering_transform (pbb1); graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1); ppl_dimension_type dim; bool empty_p; if ((PDR_TYPE (pdr1) == PDR_READ && PDR_TYPE (pdr2) == PDR_READ) || !poly_drs_may_alias_p (pdr1, pdr2)) return false; if (sdim1 != sdim2) return true; po = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2, true, false); if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (po)) { ppl_delete_Pointset_Powerset_C_Polyhedron (po); return false; } ppl_Pointset_Powerset_C_Polyhedron_space_dimension (po, &dim); eqpp = build_pairwise_scheduling_inequality (dim, level, tdim1 + ddim1, 1); ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (eqpp, po); empty_p = ppl_Pointset_Powerset_C_Polyhedron_is_empty (eqpp); ppl_delete_Pointset_Powerset_C_Polyhedron (po); ppl_delete_Pointset_Powerset_C_Polyhedron (eqpp); return !empty_p; }
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 lst_project_loop (lst_p outer, lst_p inner, mpz_t stride) { int i; lst_p stmt; mpz_t x; ppl_Coefficient_t one; int outer_depth = lst_depth (outer); int inner_depth = lst_depth (inner); mpz_init (x); mpz_set_si (x, 1); ppl_new_Coefficient (&one); ppl_assign_Coefficient_from_mpz_t (one, x); FOR_EACH_VEC_ELT (lst_p, LST_SEQ (inner), i, stmt) { poly_bb_p pbb = LST_PBB (stmt); ppl_Polyhedron_t poly = PBB_TRANSFORMED_SCATTERING (pbb); ppl_dimension_type outer_dim = psct_dynamic_dim (pbb, outer_depth); ppl_dimension_type inner_dim = psct_dynamic_dim (pbb, inner_depth); ppl_Linear_Expression_t expr; ppl_dimension_type dim; ppl_dimension_type *ds; /* There should be no loops under INNER. */ gcc_assert (!LST_LOOP_P (stmt)); ppl_Polyhedron_space_dimension (poly, &dim); ppl_new_Linear_Expression_with_dimension (&expr, dim); /* outer_dim = outer_dim * stride + inner_dim. */ ppl_set_coef (expr, inner_dim, 1); ppl_set_coef_gmp (expr, outer_dim, stride); ppl_Polyhedron_affine_image (poly, outer_dim, expr, one); ppl_delete_Linear_Expression (expr); /* Project on inner_dim. */ ppl_new_Linear_Expression_with_dimension (&expr, dim - 1); ppl_Polyhedron_affine_image (poly, inner_dim, expr, one); ppl_delete_Linear_Expression (expr); /* Remove inner loop and the static schedule of its body. */ ds = XNEWVEC (ppl_dimension_type, 2); ds[0] = inner_dim; ds[1] = inner_dim + 1; ppl_Polyhedron_remove_space_dimensions (poly, ds, 2); PBB_NB_SCATTERING_TRANSFORM (pbb) -= 2; free (ds); }
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; }