Commit 211694b6 by Sebastian Pop Committed by Sebastian Pop

graphite-dependences.c (graphite_legal_transform_bb): Call pbb_remove_duplicate_pdrs.

2009-08-28  Sebastian Pop  <sebastian.pop@amd.com>

	* graphite-dependences.c (graphite_legal_transform_bb): Call
	pbb_remove_duplicate_pdrs.
	* graphite-poly.c (can_collapse_pdr): Removed.
	(pdr_find_duplicate): Removed.
	(can_collapse_pdrs): New.
	(pbb_remove_duplicate_pdrs): New.
	(new_poly_dr): Do not look for duplicates.
	* graphite-poly.h (struct poly_bb): New field pdr_duplicates_removed.
	(PBB_PDR_DUPLICATES_REMOVED): New.
	(pbb_remove_duplicate_pdrs): Declared.

From-SVN: r151192
parent 7bd2a8a7
2009-08-28 Sebastian Pop <sebastian.pop@amd.com> 2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (graphite_legal_transform_bb): Call
pbb_remove_duplicate_pdrs.
* graphite-poly.c (can_collapse_pdr): Removed.
(pdr_find_duplicate): Removed.
(can_collapse_pdrs): New.
(pbb_remove_duplicate_pdrs): New.
(new_poly_dr): Do not look for duplicates.
* graphite-poly.h (struct poly_bb): New field pdr_duplicates_removed.
(PBB_PDR_DUPLICATES_REMOVED): New.
(pbb_remove_duplicate_pdrs): Declared.
2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* graphite-interchange.c (pbb_interchange_profitable_p): Adjust * graphite-interchange.c (pbb_interchange_profitable_p): Adjust
the strides by multiplying by PDR_NB_REFS. the strides by multiplying by PDR_NB_REFS.
* graphite-poly.c (can_collapse_pdr): New. * graphite-poly.c (can_collapse_pdr): New.
......
2009-08-25 Sebastian Pop <sebastian.pop@amd.com> 2009-08-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (graphite_legal_transform_bb): Call
pbb_remove_duplicate_pdrs.
* graphite-poly.c (can_collapse_pdr): Removed.
(pdr_find_duplicate): Removed.
(can_collapse_pdrs): New.
(pbb_remove_duplicate_pdrs): New.
(new_poly_dr): Do not look for duplicates.
* graphite-poly.h (struct poly_bb): New field pdr_duplicates_removed.
(PBB_PDR_DUPLICATES_REMOVED): New.
(pbb_remove_duplicate_pdrs): Declared.
2009-08-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-interchange.c (pbb_interchange_profitable_p): Adjust * graphite-interchange.c (pbb_interchange_profitable_p): Adjust
the strides by multiplying by PDR_NB_REFS. the strides by multiplying by PDR_NB_REFS.
* graphite-poly.c (can_collapse_pdr): New. * graphite-poly.c (can_collapse_pdr): New.
......
...@@ -589,6 +589,12 @@ graphite_legal_transform_bb (poly_bb_p pbb1, poly_bb_p pbb2) ...@@ -589,6 +589,12 @@ graphite_legal_transform_bb (poly_bb_p pbb1, poly_bb_p pbb2)
int i, j; int i, j;
poly_dr_p pdr1, pdr2; poly_dr_p pdr1, pdr2;
if (!PBB_PDR_DUPLICATES_REMOVED (pbb1))
pbb_remove_duplicate_pdrs (pbb1);
if (!PBB_PDR_DUPLICATES_REMOVED (pbb2))
pbb_remove_duplicate_pdrs (pbb2);
for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb1), i, pdr1); i++) for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb1), i, pdr1); i++)
for (j = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb2), j, pdr2); j++) for (j = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb2), j, pdr2); j++)
if (!graphite_legal_transform_dr (pbb1, pbb2, pdr1, pdr2)) if (!graphite_legal_transform_dr (pbb1, pbb2, pdr1, pdr2))
......
...@@ -261,51 +261,45 @@ apply_poly_transforms (scop_p scop) ...@@ -261,51 +261,45 @@ apply_poly_transforms (scop_p scop)
return transform_done; return transform_done;
} }
/* Returns true when PDR in the same PBB and is a duplicate of the /* Returns true when it PDR1 is a duplicate of PDR2: same PBB, and
data reference described by ACCESSES, TYPE, and NB_SUBSCRIPTS. */ their ACCESSES, TYPE, and NB_SUBSCRIPTS are the same. */
static inline bool static inline bool
can_collapse_pdr (poly_dr_p pdr, poly_bb_p pbb, can_collapse_pdrs (poly_dr_p pdr1, poly_dr_p pdr2)
ppl_Pointset_Powerset_C_Polyhedron_t accesses,
enum poly_dr_type type, graphite_dim_t nb_subscripts)
{ {
bool res = false; bool res;
ppl_Pointset_Powerset_C_Polyhedron_t af, diff; ppl_Pointset_Powerset_C_Polyhedron_t af1, af2, diff;
if (PDR_PBB (pdr) != pbb if (PDR_PBB (pdr1) != PDR_PBB (pdr2)
|| PDR_NB_SUBSCRIPTS (pdr) != nb_subscripts || PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2)
|| PDR_TYPE (pdr) != type) || PDR_TYPE (pdr1) != PDR_TYPE (pdr2))
return false; return false;
af1 = PDR_ACCESSES (pdr1);
af2 = PDR_ACCESSES (pdr2);
ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
(&diff, accesses); (&diff, af1);
af = PDR_ACCESSES (pdr); ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af2);
ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af);
if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff))
res = true;
res = ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff);
ppl_delete_Pointset_Powerset_C_Polyhedron (diff); ppl_delete_Pointset_Powerset_C_Polyhedron (diff);
return res; return res;
} }
/* Returns a duplicate of the data reference described by ACCESSES, /* Removes duplicated data references in PBB. */
TYPE, and NB_SUBSCRIPTS in the vector PBB_DRS (PBB). If there is
no duplicate, returns NULL. */
static inline poly_dr_p void
pdr_find_duplicate (poly_bb_p pbb, pbb_remove_duplicate_pdrs (poly_bb_p pbb)
ppl_Pointset_Powerset_C_Polyhedron_t accesses,
enum poly_dr_type type, graphite_dim_t nb_subscripts)
{ {
int i; int i, j;
poly_dr_p pdr; poly_dr_p pdr1, pdr2;
unsigned n = VEC_length (poly_dr_p, PBB_DRS (pbb));
for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb), i, pdr); i++) VEC (poly_dr_p, heap) *collapsed = VEC_alloc (poly_dr_p, heap, n);
if (can_collapse_pdr (pdr, pbb, accesses, type, nb_subscripts))
return pdr;
return NULL; for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb), i, pdr1); i++)
for (j = 0; VEC_iterate (poly_dr_p, collapsed, j, pdr2); j++)
if (!can_collapse_pdrs (pdr1, pdr2))
VEC_quick_push (poly_dr_p, collapsed, pdr1);
} }
/* Create a new polyhedral data reference and add it to PBB. It is /* Create a new polyhedral data reference and add it to PBB. It is
...@@ -318,16 +312,8 @@ new_poly_dr (poly_bb_p pbb, ...@@ -318,16 +312,8 @@ new_poly_dr (poly_bb_p pbb,
enum poly_dr_type type, void *cdr, graphite_dim_t nb_subscripts) enum poly_dr_type type, void *cdr, graphite_dim_t nb_subscripts)
{ {
static int id = 0; static int id = 0;
poly_dr_p pdr; poly_dr_p pdr = XNEW (struct poly_dr);
poly_dr_p same = pdr_find_duplicate (pbb, accesses, type, nb_subscripts);
if (same)
{
PDR_NB_REFS (same) += 1;
return;
}
pdr = XNEW (struct poly_dr);
PDR_ID (pdr) = id++; PDR_ID (pdr) = id++;
PDR_NB_REFS (pdr) = 1; PDR_NB_REFS (pdr) = 1;
PDR_PBB (pdr) = pbb; PDR_PBB (pdr) = pbb;
......
...@@ -298,6 +298,9 @@ struct poly_bb ...@@ -298,6 +298,9 @@ struct poly_bb
/* A copy of the transformed scattering. */ /* A copy of the transformed scattering. */
poly_scattering_p saved; poly_scattering_p saved;
/* True when the PDR duplicates have already been removed. */
bool pdr_duplicates_removed;
}; };
#define PBB_BLACK_BOX(PBB) ((gimple_bb_p) PBB->black_box) #define PBB_BLACK_BOX(PBB) ((gimple_bb_p) PBB->black_box)
...@@ -311,6 +314,7 @@ struct poly_bb ...@@ -311,6 +314,7 @@ struct poly_bb
#define PBB_SAVED(PBB) (PBB->saved) #define PBB_SAVED(PBB) (PBB->saved)
#define PBB_NB_LOCAL_VARIABLES(PBB) (PBB->transformed->nb_local_variables) #define PBB_NB_LOCAL_VARIABLES(PBB) (PBB->transformed->nb_local_variables)
#define PBB_NB_SCATTERING_TRANSFORM(PBB) (PBB->transformed->nb_scattering) #define PBB_NB_SCATTERING_TRANSFORM(PBB) (PBB->transformed->nb_scattering)
#define PBB_PDR_DUPLICATES_REMOVED(PBB) (PBB->pdr_duplicates_removed)
extern void new_poly_bb (scop_p, void *); extern void new_poly_bb (scop_p, void *);
extern void free_poly_bb (poly_bb_p); extern void free_poly_bb (poly_bb_p);
...@@ -336,6 +340,7 @@ extern bool scop_do_interchange (scop_p); ...@@ -336,6 +340,7 @@ extern bool scop_do_interchange (scop_p);
extern bool scop_do_strip_mine (scop_p); extern bool scop_do_strip_mine (scop_p);
extern void pbb_number_of_iterations (poly_bb_p, graphite_dim_t, Value); 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_at_time (poly_bb_p, graphite_dim_t, Value);
extern void pbb_remove_duplicate_pdrs (poly_bb_p);
/* The index of the PBB. */ /* The index of the PBB. */
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment