aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite-poly.c
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2009-08-28 20:41:53 +0000
committerSebastian Pop <spop@gcc.gnu.org>2009-08-28 20:41:53 +0000
commit211694b6da983c8370217ee81022713bee6827d5 (patch)
tree7e9d86aa332086434ad6d20dd863d14f5dae54cf /gcc/graphite-poly.c
parent7bd2a8a7ef778f7425121974cea4204a11c24388 (diff)
downloadgcc-211694b6da983c8370217ee81022713bee6827d5.zip
gcc-211694b6da983c8370217ee81022713bee6827d5.tar.gz
gcc-211694b6da983c8370217ee81022713bee6827d5.tar.bz2
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
Diffstat (limited to 'gcc/graphite-poly.c')
-rw-r--r--gcc/graphite-poly.c64
1 files changed, 25 insertions, 39 deletions
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index 3e005d4..535912a 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -261,51 +261,45 @@ apply_poly_transforms (scop_p scop)
return transform_done;
}
-/* Returns true when PDR in the same PBB and is a duplicate of the
- data reference described by ACCESSES, TYPE, and NB_SUBSCRIPTS. */
+/* Returns true when it PDR1 is a duplicate of PDR2: same PBB, and
+ their ACCESSES, TYPE, and NB_SUBSCRIPTS are the same. */
static inline bool
-can_collapse_pdr (poly_dr_p pdr, poly_bb_p pbb,
- ppl_Pointset_Powerset_C_Polyhedron_t accesses,
- enum poly_dr_type type, graphite_dim_t nb_subscripts)
+can_collapse_pdrs (poly_dr_p pdr1, poly_dr_p pdr2)
{
- bool res = false;
- ppl_Pointset_Powerset_C_Polyhedron_t af, diff;
+ bool res;
+ ppl_Pointset_Powerset_C_Polyhedron_t af1, af2, diff;
- if (PDR_PBB (pdr) != pbb
- || PDR_NB_SUBSCRIPTS (pdr) != nb_subscripts
- || PDR_TYPE (pdr) != type)
+ if (PDR_PBB (pdr1) != PDR_PBB (pdr2)
+ || PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2)
+ || PDR_TYPE (pdr1) != PDR_TYPE (pdr2))
return false;
+ af1 = PDR_ACCESSES (pdr1);
+ af2 = PDR_ACCESSES (pdr2);
ppl_new_Pointset_Powerset_C_Polyhedron_from_Pointset_Powerset_C_Polyhedron
- (&diff, accesses);
- af = PDR_ACCESSES (pdr);
- ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af);
-
- if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff))
- res = true;
+ (&diff, af1);
+ ppl_Pointset_Powerset_C_Polyhedron_difference_assign (diff, af2);
+ res = ppl_Pointset_Powerset_C_Polyhedron_is_empty (diff);
ppl_delete_Pointset_Powerset_C_Polyhedron (diff);
return res;
}
-/* Returns a duplicate of the data reference described by ACCESSES,
- TYPE, and NB_SUBSCRIPTS in the vector PBB_DRS (PBB). If there is
- no duplicate, returns NULL. */
+/* Removes duplicated data references in PBB. */
-static inline poly_dr_p
-pdr_find_duplicate (poly_bb_p pbb,
- ppl_Pointset_Powerset_C_Polyhedron_t accesses,
- enum poly_dr_type type, graphite_dim_t nb_subscripts)
+void
+pbb_remove_duplicate_pdrs (poly_bb_p pbb)
{
- int i;
- poly_dr_p pdr;
-
- for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb), i, pdr); i++)
- if (can_collapse_pdr (pdr, pbb, accesses, type, nb_subscripts))
- return pdr;
+ int i, j;
+ poly_dr_p pdr1, pdr2;
+ unsigned n = VEC_length (poly_dr_p, PBB_DRS (pbb));
+ VEC (poly_dr_p, heap) *collapsed = VEC_alloc (poly_dr_p, heap, n);
- 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
@@ -318,16 +312,8 @@ new_poly_dr (poly_bb_p pbb,
enum poly_dr_type type, void *cdr, graphite_dim_t nb_subscripts)
{
static int id = 0;
- poly_dr_p pdr;
- poly_dr_p same = pdr_find_duplicate (pbb, accesses, type, nb_subscripts);
-
- if (same)
- {
- PDR_NB_REFS (same) += 1;
- return;
- }
+ poly_dr_p pdr = XNEW (struct poly_dr);
- pdr = XNEW (struct poly_dr);
PDR_ID (pdr) = id++;
PDR_NB_REFS (pdr) = 1;
PDR_PBB (pdr) = pbb;