aboutsummaryrefslogtreecommitdiff
path: root/gcc/graphite-dependences.c
diff options
context:
space:
mode:
authorSebastian Pop <sebastian.pop@amd.com>2009-11-25 04:55:53 +0000
committerSebastian Pop <sebastian.pop@amd.com>2009-11-25 04:55:53 +0000
commit46b28333d9b2231d92d7b3e2faf6740ed4f7d805 (patch)
tree691791191c1405beb47bca42a0c50bebbd5d5502 /gcc/graphite-dependences.c
parent3592fa0798e004032b08d888a6ea75ec549e09f7 (diff)
2009-10-06 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (reduction_dr_1): New. (reduction_dr_p): New. (graphite_legal_transform_dr): Call reduction_dr_p. (reduction_ddr): Renamed reduction_ddr_p. * graphite-poly.h (same_pdr_p): New. (number_of_write_pdrs): New. * graphite-sese-to-poly.c (nb_data_writes_in_bb): New. (split_reduction_stmt): Do not split reduction statements when there are no writes to memory. (translate_scalar_reduction_to_array_for_stmt): Insert the memory reduction statement just after the scalar reduction statement. * gcc.dg/graphite/interchange-10.c: Updated to differ from interchange-4.c. Un-XFAIL-ed. * gcc.dg/graphite/interchange-3.c: Un-XFAIL-ed. * gcc.dg/graphite/interchange-4.c: Un-XFAIL-ed. git-svn-id: https://gcc.gnu.org/svn/gcc/trunk@154564 138bc75d-0d04-0410-961f-82ee72b054a4
Diffstat (limited to 'gcc/graphite-dependences.c')
-rw-r--r--gcc/graphite-dependences.c46
1 files changed, 44 insertions, 2 deletions
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index 2e777b3508d..12b48f8bbbb 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -524,6 +524,45 @@ pddr_original_scattering (poly_bb_p pbb1, poly_bb_p pbb2,
return pddr;
}
+/* Return true when the data dependence relation between the data
+ references PDR1 belonging to PBB1 and PDR2 is part of a
+ reduction. */
+
+static inline bool
+reduction_dr_1 (poly_bb_p pbb1, poly_dr_p pdr1, poly_dr_p pdr2)
+{
+ int i;
+ poly_dr_p pdr;
+
+ /* PBB1 should be a reduction PBB. Reduction PBBs should have only
+ one write. */
+ gcc_assert (PBB_IS_REDUCTION (pbb1)
+ && number_of_write_pdrs (pbb1) == 1);
+
+ for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb1), i, pdr); i++)
+ if (PDR_TYPE (pdr) == PDR_WRITE)
+ break;
+
+ return same_pdr_p (pdr, pdr1) && same_pdr_p (pdr, pdr2);
+}
+
+/* Return true when the data dependence relation between the data
+ references PDR1 belonging to PBB1 and PDR2 belonging to PBB2 is
+ part of a reduction. */
+
+static inline bool
+reduction_dr_p (poly_bb_p pbb1, poly_bb_p pbb2,
+ poly_dr_p pdr1, poly_dr_p pdr2)
+{
+ if (PBB_IS_REDUCTION (pbb1))
+ return reduction_dr_1 (pbb1, pdr1, pdr2);
+
+ if (PBB_IS_REDUCTION (pbb2))
+ return reduction_dr_1 (pbb2, pdr2, pdr1);
+
+ return false;
+}
+
/* Returns true when the PBB_TRANSFORMED_SCATTERING functions of PBB1
and PBB2 respect the data dependences of PBB_ORIGINAL_SCATTERING
functions. */
@@ -542,6 +581,9 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1);
ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2);
+ if (reduction_dr_p (pbb1, pbb2, pdr1, pdr2))
+ return true;
+
pddr = pddr_original_scattering (pbb1, pbb2, pdr1, pdr2);
if (!pddr)
return true;
@@ -589,7 +631,7 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
part of a reduction. */
static inline bool
-reduction_ddr (poly_bb_p pbb1, poly_bb_p pbb2)
+reduction_ddr_p (poly_bb_p pbb1, poly_bb_p pbb2)
{
return pbb1 == pbb2 && PBB_IS_REDUCTION (pbb1);
}
@@ -609,7 +651,7 @@ graphite_legal_transform_bb (poly_bb_p pbb1, poly_bb_p pbb2)
if (!PBB_PDR_DUPLICATES_REMOVED (pbb2))
pbb_remove_duplicate_pdrs (pbb2);
- if (reduction_ddr (pbb1, pbb2))
+ if (reduction_ddr_p (pbb1, pbb2))
return true;
for (i = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb1), i, pdr1); i++)