Mercurial > hg > CbC > CbC_gcc
diff gcc/graphite-poly.h @ 63:b7f97abdc517 gcc-4.6-20100522
update gcc from gcc-4.5.0 to gcc-4.6
author | ryoma <e075725@ie.u-ryukyu.ac.jp> |
---|---|
date | Mon, 24 May 2010 12:47:05 +0900 |
parents | 77e2b8dfacca |
children | f6334be47118 |
line wrap: on
line diff
--- a/gcc/graphite-poly.h Fri Feb 12 23:41:23 2010 +0900 +++ b/gcc/graphite-poly.h Mon May 24 12:47:05 2010 +0900 @@ -1,5 +1,5 @@ /* Graphite polyhedral representation. - Copyright (C) 2009 Free Software Foundation, Inc. + Copyright (C) 2009, 2010 Free Software Foundation, Inc. Contributed by Sebastian Pop <sebastian.pop@amd.com> and Tobias Grosser <grosser@fim.uni-passau.de>. @@ -155,8 +155,8 @@ void new_poly_dr (poly_bb_p, int, ppl_Pointset_Powerset_C_Polyhedron_t, enum poly_dr_type, void *, graphite_dim_t); void free_poly_dr (poly_dr_p); -void debug_pdr (poly_dr_p); -void print_pdr (FILE *, poly_dr_p); +void debug_pdr (poly_dr_p, int); +void print_pdr (FILE *, poly_dr_p, int); static inline scop_p pdr_scop (poly_dr_p pdr); /* The dimension of the PDR_ACCESSES polyhedron of PDR. */ @@ -263,7 +263,9 @@ struct poly_scattering { - /* The scattering function containing the transformations. */ + /* The scattering function containing the transformations: the + layout of this polyhedron is: T|I|G with T the transform + scattering, I the iteration domain, G the context parameters. */ ppl_Polyhedron_t scattering; /* The number of local variables. */ @@ -277,11 +279,15 @@ struct poly_bb { + /* Pointer to a basic block or a statement in the compiler. */ void *black_box; + /* Pointer to the SCOP containing this PBB. */ scop_p scop; - /* The iteration domain of this bb. + /* The iteration domain of this bb. The layout of this polyhedron + is I|G with I the iteration domain, G the context parameters. + Example: for (i = a - 7*b + 8; i <= 3*a + 13*b + 20; i++) @@ -340,27 +346,29 @@ extern void free_poly_bb (poly_bb_p); extern void debug_loop_vec (poly_bb_p); extern void schedule_to_scattering (poly_bb_p, int); -extern void print_pbb_domain (FILE *, poly_bb_p); -extern void print_pbb (FILE *, poly_bb_p); -extern void print_scop_context (FILE *, scop_p); -extern void print_scop (FILE *, scop_p); -extern void debug_pbb_domain (poly_bb_p); -extern void debug_pbb (poly_bb_p); -extern void print_pdrs (FILE *, poly_bb_p); -extern void debug_pdrs (poly_bb_p); -extern void debug_scop_context (scop_p); -extern void debug_scop (scop_p); -extern void print_scop_params (FILE *, scop_p); -extern void debug_scop_params (scop_p); -extern void print_iteration_domain (FILE *, poly_bb_p); -extern void print_iteration_domains (FILE *, scop_p); -extern void debug_iteration_domain (poly_bb_p); -extern void debug_iteration_domains (scop_p); +extern void print_pbb_domain (FILE *, poly_bb_p, int); +extern void print_pbb (FILE *, poly_bb_p, int); +extern void print_scop_context (FILE *, scop_p, int); +extern void print_scop (FILE *, scop_p, int); +extern void print_cloog (FILE *, scop_p, int); +extern void debug_pbb_domain (poly_bb_p, int); +extern void debug_pbb (poly_bb_p, int); +extern void print_pdrs (FILE *, poly_bb_p, int); +extern void debug_pdrs (poly_bb_p, int); +extern void debug_scop_context (scop_p, int); +extern void debug_scop (scop_p, int); +extern void debug_cloog (scop_p, int); +extern void print_scop_params (FILE *, scop_p, int); +extern void debug_scop_params (scop_p, int); +extern void print_iteration_domain (FILE *, poly_bb_p, int); +extern void print_iteration_domains (FILE *, scop_p, int); +extern void debug_iteration_domain (poly_bb_p, int); +extern void debug_iteration_domains (scop_p, int); extern bool scop_do_interchange (scop_p); extern bool scop_do_strip_mine (scop_p); extern bool scop_do_block (scop_p); -extern void pbb_number_of_iterations (poly_bb_p, graphite_dim_t, Value); -extern void pbb_number_of_iterations_at_time (poly_bb_p, graphite_dim_t, Value); +extern void pbb_number_of_iterations (poly_bb_p, graphite_dim_t, mpz_t); +extern void pbb_number_of_iterations_at_time (poly_bb_p, graphite_dim_t, mpz_t); extern void pbb_remove_duplicate_pdrs (poly_bb_p); /* Return the number of write data references in PBB. */ @@ -379,12 +387,19 @@ return res; } +/* The basic block of the PBB. */ +static inline basic_block +pbb_bb (poly_bb_p pbb) +{ + return GBB_BB (PBB_BLACK_BOX (pbb)); +} + /* The index of the PBB. */ static inline int pbb_index (poly_bb_p pbb) { - return GBB_BB (PBB_BLACK_BOX (pbb))->index; + return pbb_bb (pbb)->index; } /* The loop of the PBB. */ @@ -632,6 +647,9 @@ /* A pointer to the loop that contains this node. */ lst_p loop_father; + /* The sum of all the memory strides for an LST loop. */ + mpz_t memory_strides; + /* Loop nodes contain a sequence SEQ of LST nodes, statements contain a pointer to their polyhedral representation PBB. */ union { @@ -644,6 +662,7 @@ #define LST_LOOP_FATHER(LST) ((LST)->loop_father) #define LST_PBB(LST) ((LST)->node.pbb) #define LST_SEQ(LST) ((LST)->node.seq) +#define LST_LOOP_MEMORY_STRIDES(LST) ((LST)->memory_strides) void scop_to_lst (scop_p); void print_lst (FILE *, lst_p, int); @@ -662,6 +681,8 @@ LST_LOOP_P (lst) = true; LST_SEQ (lst) = seq; LST_LOOP_FATHER (lst) = NULL; + mpz_init (LST_LOOP_MEMORY_STRIDES (lst)); + mpz_set_si (LST_LOOP_MEMORY_STRIDES (lst), -1); for (i = 0; VEC_iterate (lst_p, seq, i, l); i++) LST_LOOP_FATHER (l) = lst; @@ -698,6 +719,7 @@ for (i = 0; VEC_iterate (lst_p, LST_SEQ (lst), i, l); i++) free_lst (l); + mpz_clear (LST_LOOP_MEMORY_STRIDES (lst)); VEC_free (lst_p, heap, LST_SEQ (lst)); } @@ -1296,6 +1318,10 @@ /* A hashtable of the data dependence relations for the original scattering. */ htab_t original_pddrs; + + /* True when the scop has been converted to its polyhedral + representation. */ + bool poly_scop_p; }; #define SCOP_BBS(S) (S->bbs) @@ -1305,16 +1331,17 @@ #define SCOP_ORIGINAL_SCHEDULE(S) (S->original_schedule) #define SCOP_TRANSFORMED_SCHEDULE(S) (S->transformed_schedule) #define SCOP_SAVED_SCHEDULE(S) (S->saved_schedule) +#define POLY_SCOP_P(S) (S->poly_scop_p) extern scop_p new_scop (void *); extern void free_scop (scop_p); extern void free_scops (VEC (scop_p, heap) *); extern void print_generated_program (FILE *, scop_p); extern void debug_generated_program (scop_p); -extern void print_scattering_function (FILE *, poly_bb_p); -extern void print_scattering_functions (FILE *, scop_p); -extern void debug_scattering_function (poly_bb_p); -extern void debug_scattering_functions (scop_p); +extern void print_scattering_function (FILE *, poly_bb_p, int); +extern void print_scattering_functions (FILE *, scop_p, int); +extern void debug_scattering_function (poly_bb_p, int); +extern void debug_scattering_functions (scop_p, int); extern int scop_max_loop_depth (scop_p); extern int unify_scattering_dimensions (scop_p); extern bool apply_poly_transforms (scop_p); @@ -1453,4 +1480,49 @@ restore_lst_schedule (scop); } +/* For a given PBB, add to RES the scop context, the iteration domain, + the original scattering when ORIGINAL_P is true, otherwise add the + transformed scattering. */ + +static inline void +combine_context_id_scat (ppl_Pointset_Powerset_C_Polyhedron_t *res, + poly_bb_p pbb, bool original_p) +{ + ppl_Pointset_Powerset_C_Polyhedron_t context; + ppl_Pointset_Powerset_C_Polyhedron_t id; + + ppl_new_Pointset_Powerset_C_Polyhedron_from_C_Polyhedron + (res, original_p ? + PBB_ORIGINAL_SCATTERING (pbb) : PBB_TRANSFORMED_SCATTERING (pbb)); + + ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron + (&context, SCOP_CONTEXT (PBB_SCOP (pbb))); + + ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron + (&id, PBB_DOMAIN (pbb)); + + /* Extend the context and the iteration domain to the dimension of + the scattering: T|I|G. */ + { + ppl_dimension_type gdim, tdim, idim; + + ppl_Pointset_Powerset_C_Polyhedron_space_dimension (*res, &tdim); + ppl_Pointset_Powerset_C_Polyhedron_space_dimension (context, &gdim); + ppl_Pointset_Powerset_C_Polyhedron_space_dimension (id, &idim); + + if (tdim > gdim) + ppl_insert_dimensions_pointset (context, 0, tdim - gdim); + + if (tdim > idim) + ppl_insert_dimensions_pointset (id, 0, tdim - idim); + } + + /* Add the context and the iteration domain to the result. */ + ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (*res, context); + ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (*res, id); + + ppl_delete_Pointset_Powerset_C_Polyhedron (context); + ppl_delete_Pointset_Powerset_C_Polyhedron (id); +} + #endif