summaryrefslogtreecommitdiff
path: root/gcc/graphite-poly.h
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/graphite-poly.h')
-rw-r--r--gcc/graphite-poly.h124
1 files changed, 110 insertions, 14 deletions
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
index 83d5fca212b..28fca705832 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -227,6 +227,20 @@ pdr_parameter_dim (poly_dr_p pdr, graphite_dim_t param)
return pbb_dim_iter_domain (pbb) + param;
}
+typedef struct poly_scattering *poly_scattering_p;
+
+struct poly_scattering
+{
+ /* The scattering function containing the transformations. */
+ ppl_Polyhedron_t scattering;
+
+ /* The number of local variables. */
+ int nb_local_variables;
+
+ /* The number of scattering dimensions. */
+ int nb_scattering;
+};
+
/* POLY_BB represents a blackbox in the polyhedral model. */
struct poly_bb
@@ -260,28 +274,27 @@ struct poly_bb
/* The data references we access. */
VEC (poly_dr_p, heap) *drs;
- /* The scattering function containing the transformations. */
- ppl_Polyhedron_t transformed_scattering;
-
+ /* The original scattering. */
+ poly_scattering_p original;
- /* The original scattering function. */
- ppl_Polyhedron_t original_scattering;
-
- /* The number of local variables. */
- int nb_local_variables;
+ /* The transformed scattering. */
+ poly_scattering_p transformed;
- /* The number of scattering dimensions in the TRANSFORMED scattering. */
- int nb_scattering_transform;
+ /* A copy of the transformed scattering. */
+ poly_scattering_p saved;
};
#define PBB_BLACK_BOX(PBB) ((gimple_bb_p) PBB->black_box)
#define PBB_SCOP(PBB) (PBB->scop)
#define PBB_DOMAIN(PBB) (PBB->domain)
#define PBB_DRS(PBB) (PBB->drs)
-#define PBB_TRANSFORMED_SCATTERING(PBB) (PBB->transformed_scattering)
-#define PBB_ORIGINAL_SCATTERING(PBB) (PBB->original_scattering)
-#define PBB_NB_LOCAL_VARIABLES(PBB) (PBB->nb_local_variables)
-#define PBB_NB_SCATTERING_TRANSFORM(PBB) (PBB->nb_scattering_transform)
+#define PBB_ORIGINAL(PBB) (PBB->original)
+#define PBB_ORIGINAL_SCATTERING(PBB) (PBB->original->scattering)
+#define PBB_TRANSFORMED(PBB) (PBB->transformed)
+#define PBB_TRANSFORMED_SCATTERING(PBB) (PBB->transformed->scattering)
+#define PBB_SAVED(PBB) (PBB->saved)
+#define PBB_NB_LOCAL_VARIABLES(PBB) (PBB->transformed->nb_local_variables)
+#define PBB_NB_SCATTERING_TRANSFORM(PBB) (PBB->transformed->nb_scattering)
extern void new_poly_bb (scop_p, void *);
extern void free_poly_bb (poly_bb_p);
@@ -578,4 +591,87 @@ scop_set_nb_params (scop_p scop, graphite_dim_t nb_params)
scop->nb_params = nb_params;
}
+/* Allocates a new empty poly_scattering structure. */
+
+static inline poly_scattering_p
+poly_scattering_new (void)
+{
+ poly_scattering_p res = XNEW (struct poly_scattering);
+
+ res->scattering = NULL;
+ res->nb_local_variables = 0;
+ res->nb_scattering = 0;
+ return res;
+}
+
+/* Free a poly_scattering structure. */
+
+static inline void
+poly_scattering_free (poly_scattering_p s)
+{
+ ppl_delete_Polyhedron (s->scattering);
+ free (s);
+}
+
+/* Copies S and return a new scattering. */
+
+static inline poly_scattering_p
+poly_scattering_copy (poly_scattering_p s)
+{
+ poly_scattering_p res = poly_scattering_new ();
+
+ ppl_new_C_Polyhedron_from_C_Polyhedron (&(res->scattering), s->scattering);
+ res->nb_local_variables = s->nb_local_variables;
+ res->nb_scattering = s->nb_scattering;
+ return res;
+}
+
+/* Saves the transformed scattering of PBB. */
+
+static inline void
+store_scattering_pbb (poly_bb_p pbb)
+{
+ gcc_assert (PBB_TRANSFORMED (pbb));
+
+ if (PBB_SAVED (pbb))
+ poly_scattering_free (PBB_SAVED (pbb));
+
+ PBB_SAVED (pbb) = poly_scattering_copy (PBB_TRANSFORMED (pbb));
+}
+
+/* Saves the scattering for all the pbbs in the SCOP. */
+
+static inline void
+store_scattering (scop_p scop)
+{
+ int i;
+ poly_bb_p pbb;
+
+ for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb); i++)
+ store_scattering_pbb (pbb);
+}
+
+/* Restores the scattering of PBB. */
+
+static inline void
+restore_scattering_pbb (poly_bb_p pbb)
+{
+ gcc_assert (PBB_SAVED (pbb));
+
+ poly_scattering_free (PBB_TRANSFORMED (pbb));
+ PBB_TRANSFORMED (pbb) = poly_scattering_copy (PBB_SAVED (pbb));
+}
+
+/* Restores the scattering for all the pbbs in the SCOP. */
+
+static inline void
+restore_scattering (scop_p scop)
+{
+ int i;
+ poly_bb_p pbb;
+
+ for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb); i++)
+ restore_scattering_pbb (pbb);
+}
+
#endif