diff options
author | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-11-25 04:55:53 +0000 |
---|---|---|
committer | spop <spop@138bc75d-0d04-0410-961f-82ee72b054a4> | 2009-11-25 04:55:53 +0000 |
commit | f007fe9730d912ef3185d08f3835d5e4680f2331 (patch) | |
tree | 691791191c1405beb47bca42a0c50bebbd5d5502 /gcc/graphite-dependences.c | |
parent | 4d0382bc1a3eb50c7d7964e0a3f639728d61e94d (diff) | |
download | gcc-f007fe9730d912ef3185d08f3835d5e4680f2331.tar.gz |
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: svn+ssh://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.c | 46 |
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++) |