diff options
Diffstat (limited to 'gcc/graphite-poly.h')
-rw-r--r-- | gcc/graphite-poly.h | 124 |
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 |