summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>2009-08-28 20:27:56 +0000
committerspop <spop@138bc75d-0d04-0410-961f-82ee72b054a4>2009-08-28 20:27:56 +0000
commit0d6b5db285fd1408d1a0c512b1155b8fccb33f2a (patch)
treedf2d090c75d20d70405ace514e4c3a6184439f11
parent02df46c6eba553dd078478514ec27e03209277f0 (diff)
downloadgcc-0d6b5db285fd1408d1a0c512b1155b8fccb33f2a.tar.gz
2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr. (eq_poly_dr_pair_p): Renamed eq_poly_ddr_p. (hash_poly_dr_pair_p): Renamed hash_poly_ddr_p. (free_poly_ddr): New. (pddr_is_empty): New. (dependence_polyhedron_1): Now returns a poly_ddr_p. (dependence_polyhedron): Same. Remove useless gcc_assert. Remove fprintfs. (graphite_legal_transform_dr): Call pddr_is_empty and free_poly_ddr. (graphite_carried_dependence_level_k): Call pddr_is_empty. * graphite-dependences.h (enum poly_dependence_kind): New. (poly_dr_pair): Renamed poly_ddr. Added a field kind. (PDRP_SOURCE): Renamed PDDR_SOURCE. (PDRP_SINK): Renamed PDDR_SINK. (PDRP_DDP): Renamed PDDR_DDP. (PDDR_KIND): New. (free_poly_ddr): Declared. * graphite-poly.c (new_scop): Use the new hash function names. * graphite-poly.h (struct scop): Renamed field original_pdr_pairs into original_pddrs. (SCOP_ORIGINAL_PDR_PAIRS): Renamed SCOP_ORIGINAL_PDDRS. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@151181 138bc75d-0d04-0410-961f-82ee72b054a4
-rw-r--r--gcc/ChangeLog24
-rw-r--r--gcc/ChangeLog.graphite28
-rw-r--r--gcc/graphite-dependences.c142
-rw-r--r--gcc/graphite-dependences.h34
-rw-r--r--gcc/graphite-poly.c6
-rw-r--r--gcc/graphite-poly.h9
6 files changed, 160 insertions, 83 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog
index 0105250838e..09a8259678c 100644
--- a/gcc/ChangeLog
+++ b/gcc/ChangeLog
@@ -1,5 +1,29 @@
2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
+ * graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr.
+ (eq_poly_dr_pair_p): Renamed eq_poly_ddr_p.
+ (hash_poly_dr_pair_p): Renamed hash_poly_ddr_p.
+ (free_poly_ddr): New.
+ (pddr_is_empty): New.
+ (dependence_polyhedron_1): Now returns a poly_ddr_p.
+ (dependence_polyhedron): Same. Remove useless gcc_assert.
+ Remove fprintfs.
+ (graphite_legal_transform_dr): Call pddr_is_empty and free_poly_ddr.
+ (graphite_carried_dependence_level_k): Call pddr_is_empty.
+ * graphite-dependences.h (enum poly_dependence_kind): New.
+ (poly_dr_pair): Renamed poly_ddr. Added a field kind.
+ (PDRP_SOURCE): Renamed PDDR_SOURCE.
+ (PDRP_SINK): Renamed PDDR_SINK.
+ (PDRP_DDP): Renamed PDDR_DDP.
+ (PDDR_KIND): New.
+ (free_poly_ddr): Declared.
+ * graphite-poly.c (new_scop): Use the new hash function names.
+ * graphite-poly.h (struct scop): Renamed field original_pdr_pairs
+ into original_pddrs.
+ (SCOP_ORIGINAL_PDR_PAIRS): Renamed SCOP_ORIGINAL_PDDRS.
+
+2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
+
* cfgloopmanip.c (create_empty_loop_on_edge): Generate upper
bounds with LT_EXPR to make niter analysis more precise on code
generated by Graphite.
diff --git a/gcc/ChangeLog.graphite b/gcc/ChangeLog.graphite
index d7d1a6a56f3..f67bb3507ba 100644
--- a/gcc/ChangeLog.graphite
+++ b/gcc/ChangeLog.graphite
@@ -1,3 +1,31 @@
+2009-08-21 Sebastian Pop <sebastian.pop@amd.com>
+
+ * graphite-dependences.c (new_poly_dr_pair): Renamed new_poly_ddr.
+ (eq_poly_dr_pair_p): Renamed eq_poly_ddr_p.
+ (hash_poly_dr_pair_p): Renamed hash_poly_ddr_p.
+ (free_poly_ddr): New.
+ (pddr_is_empty): New.
+ (dependence_polyhedron_1): Now returns a poly_ddr_p.
+ (dependence_polyhedron): Same. Remove useless gcc_assert.
+ Remove fprintfs.
+ (graphite_legal_transform_dr): Call pddr_is_empty and free_poly_ddr.
+ (graphite_carried_dependence_level_k): Call pddr_is_empty.
+ * graphite-dependences.h (enum poly_dependence_kind): New.
+ (poly_dr_pair): Renamed poly_ddr. Added a field kind.
+ (PDRP_SOURCE): Renamed PDDR_SOURCE.
+ (PDRP_SINK): Renamed PDDR_SINK.
+ (PDRP_DDP): Renamed PDDR_DDP.
+ (PDDR_KIND): New.
+ (free_poly_ddr): Declared.
+ * graphite-poly.c (new_scop): Use the new hash function names.
+ * graphite-poly.h (struct scop): Renamed field original_pdr_pairs
+ into original_pddrs.
+ (SCOP_ORIGINAL_PDR_PAIRS): Renamed SCOP_ORIGINAL_PDDRS.
+
+2009-08-21 Sebastian Pop <sebastian.pop@amd.com>
+
+ * Merge from mainline (150764:150992).
+
2009-08-18 Sebastian Pop <sebastian.pop@amd.com>
* cfgloopmanip.c (create_empty_loop_on_edge): Generate upper
diff --git a/gcc/graphite-dependences.c b/gcc/graphite-dependences.c
index ccb32d69667..5d7b50b7c51 100644
--- a/gcc/graphite-dependences.c
+++ b/gcc/graphite-dependences.c
@@ -50,47 +50,73 @@ along with GCC; see the file COPYING3. If not see
#include "graphite-poly.h"
#include "graphite-dependences.h"
-/* Creates a new polyhedral data reference pair and
- returns it. Parameter SOURCE denotes a source data reference
- while parameter SINK denotes a sink data reference. Both
- SOURCE and SINK define a pair of references, thus they
- define an edge in DDG (Data Dependence Graph). */
-
-static poly_dr_pair_p
-new_poly_dr_pair (poly_dr_p source,
- poly_dr_p sink,
- ppl_Pointset_Powerset_C_Polyhedron_t ddp)
+/* Returns a new polyhedral Data Dependence Relation (DDR). SOURCE is
+ the source data reference, SINK is the sink data reference. SOURCE
+ and SINK define an edge in the Data Dependence Graph (DDG). */
+
+static poly_ddr_p
+new_poly_ddr (poly_dr_p source, poly_dr_p sink,
+ ppl_Pointset_Powerset_C_Polyhedron_t ddp)
{
- poly_dr_pair_p pdrpp;
+ poly_ddr_p pddr;
+
+ pddr = XNEW (struct poly_ddr);
+ PDDR_SOURCE (pddr) = source;
+ PDDR_SINK (pddr) = sink;
+ PDDR_DDP (pddr) = ddp;
+ PDDR_KIND (pddr) = unknown_dependence;
+
+ return pddr;
+}
- pdrpp = XNEW (struct poly_dr_pair);
- pdrpp->source = source;
- pdrpp->sink = sink;
- pdrpp->ddp = ddp;
+/* Free the poly_ddr_p P. */
- return pdrpp;
+void
+free_poly_ddr (void *p)
+{
+ poly_ddr_p pddr = (poly_ddr_p) p;
+ ppl_delete_Pointset_Powerset_C_Polyhedron (PDDR_DDP (pddr));
+ free (pddr);
}
-/* Comparison function for poly_dr_pair hash table. */
+/* Comparison function for poly_ddr hash table. */
int
-eq_poly_dr_pair_p (const void *pdrpp1, const void *pdrpp2)
+eq_poly_ddr_p (const void *pddr1, const void *pddr2)
{
- const struct poly_dr_pair *p1 = (const struct poly_dr_pair *) pdrpp1;
- const struct poly_dr_pair *p2 = (const struct poly_dr_pair *) pdrpp2;
+ const struct poly_ddr *p1 = (const struct poly_ddr *) pddr1;
+ const struct poly_ddr *p2 = (const struct poly_ddr *) pddr2;
- return (p1->source == p2->source
- && p1->sink == p2->sink);
+ return (PDDR_SOURCE (p1) == PDDR_SOURCE (p2)
+ && PDDR_SINK (p1) == PDDR_SINK (p2));
}
-/* Hash function for poly_dr_pair hashtable. */
+/* Hash function for poly_ddr hashtable. */
hashval_t
-hash_poly_dr_pair_p (const void *pdrpp)
+hash_poly_ddr_p (const void *pddr)
{
- const struct poly_dr_pair *p = (const struct poly_dr_pair *) pdrpp;
+ const struct poly_ddr *p = (const struct poly_ddr *) pddr;
+
+ return (hashval_t) ((long) PDDR_SOURCE (p) + (long) PDDR_SINK (p));
+}
+
+/* Returns true when PDDR has no dependence. */
- return (hashval_t) ((long) p->source + (long) p->sink);
+static bool
+pddr_is_empty (poly_ddr_p pddr)
+{
+ if (PDDR_KIND (pddr) != unknown_dependence)
+ return PDDR_KIND (pddr) == no_dependence ? true : false;
+
+ if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (PDDR_DDP (pddr)))
+ {
+ PDDR_KIND (pddr) = no_dependence;
+ return true;
+ }
+
+ PDDR_KIND (pddr) = has_dependence;
+ return false;
}
/* Returns a polyhedron of dimension DIM.
@@ -364,7 +390,7 @@ build_lexicographically_gt_constraint (ppl_Pointset_Powerset_C_Polyhedron_t *res
/* Build the dependence polyhedron for data references PDR1 and PDR2. */
-static ppl_Pointset_Powerset_C_Polyhedron_t
+static poly_ddr_p
dependence_polyhedron_1 (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_Pointset_Powerset_C_Polyhedron_t d1,
ppl_Pointset_Powerset_C_Polyhedron_t d2,
@@ -427,13 +453,14 @@ dependence_polyhedron_1 (poly_bb_p pbb1, poly_bb_p pbb2,
if (!ppl_Pointset_Powerset_C_Polyhedron_is_empty (res))
build_lexicographically_gt_constraint (&res, dim, MIN (tdim1, tdim2),
tdim1 + ddim1, direction);
- return res;
+
+ return new_poly_ddr (pdr1, pdr2, res);
}
/* Build the dependence polyhedron for data references PDR1 and PDR2.
If possible use already cached information. */
-static ppl_Pointset_Powerset_C_Polyhedron_t
+static poly_ddr_p
dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_Pointset_Powerset_C_Polyhedron_t d1,
ppl_Pointset_Powerset_C_Polyhedron_t d2,
@@ -442,38 +469,27 @@ dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2,
bool direction,
bool original_scattering_p)
{
- poly_dr_pair tmp;
PTR *x = NULL;
- ppl_Pointset_Powerset_C_Polyhedron_t res;
+ poly_ddr_p res;
if (original_scattering_p)
{
+ struct poly_ddr tmp;
+
tmp.source = pdr1;
tmp.sink = pdr2;
- x = htab_find_slot (SCOP_ORIGINAL_PDR_PAIRS (PBB_SCOP (pbb1)),
+ x = htab_find_slot (SCOP_ORIGINAL_PDDRS (PBB_SCOP (pbb1)),
&tmp, INSERT);
if (x && *x)
- {
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, "\nddp cache: hit.\n");
- return ((poly_dr_pair *)*x)->ddp;
- }
- else if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, "\nddp cache: miss.\n");
+ return (poly_ddr_p) *x;
}
res = dependence_polyhedron_1 (pbb1, pbb2, d1, d2, pdr1, pdr2,
s1, s2, direction, original_scattering_p);
if (original_scattering_p)
- {
- gcc_assert (x && *x == NULL);
- *x = new_poly_dr_pair (pdr1, pdr2, res);
-
- if (dump_file && (dump_flags & TDF_DETAILS))
- fprintf (dump_file, "\nddp cache: add element.\n");
- }
+ *x = res;
return res;
}
@@ -487,12 +503,12 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
poly_dr_p pdr1, poly_dr_p pdr2)
{
ppl_Polyhedron_t st1, st2;
- ppl_Pointset_Powerset_C_Polyhedron_t pt;
+ ppl_Pointset_Powerset_C_Polyhedron_t po, pt;
graphite_dim_t ddim1, otdim1, otdim2, ttdim1, ttdim2;
ppl_Pointset_Powerset_C_Polyhedron_t temp;
ppl_dimension_type pdim;
bool is_empty_p;
- ppl_Pointset_Powerset_C_Polyhedron_t po;
+ poly_ddr_p pddr;
ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1);
ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2);
@@ -504,12 +520,13 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
if (sdim1 != sdim2)
return true;
- po = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
- true, true);
-
- if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (po))
+ pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
+ true, true);
+ if (pddr_is_empty (pddr))
return true;
+ po = PDDR_DDP (pddr);
+
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file, "\nloop carries dependency.\n");
@@ -528,8 +545,9 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_new_Pointset_Powerset_C_Polyhedron_from_space_dimension (&temp, pdim, 0);
ppl_Pointset_Powerset_C_Polyhedron_intersection_assign (temp, po);
- pt = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, st1, st2,
- false, false);
+ pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, st1, st2,
+ false, false);
+ pt = PDDR_DDP (pddr);
/* Extend PO and PT to have the same dimensions. */
ppl_insert_dimensions_pointset (temp, otdim1, ttdim1);
@@ -541,7 +559,8 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
is_empty_p = ppl_Pointset_Powerset_C_Polyhedron_is_empty (temp);
ppl_delete_Pointset_Powerset_C_Polyhedron (temp);
- ppl_delete_Pointset_Powerset_C_Polyhedron (pt);
+ free_poly_ddr (pddr);
+
return is_empty_p;
}
@@ -646,8 +665,7 @@ poly_drs_may_alias_p (poly_dr_p pdr1, poly_dr_p pdr2)
}
/* Returns TRUE when the dependence polyhedron between PDR1 and
- PDR2 represents a loop carried dependence at level LEVEL. Otherwise
- return FALSE. */
+ PDR2 represents a loop carried dependence at level LEVEL. */
static bool
graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
@@ -667,6 +685,7 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1);
ppl_dimension_type dim;
bool empty_p;
+ poly_ddr_p pddr;
if ((PDR_TYPE (pdr1) == PDR_READ && PDR_TYPE (pdr2) == PDR_READ)
|| !poly_drs_may_alias_p (pdr1, pdr2))
@@ -675,14 +694,17 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
if (sdim1 != sdim2)
return true;
- po = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
- true, false);
- if (ppl_Pointset_Powerset_C_Polyhedron_is_empty (po))
+ pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
+ true, false);
+
+ if (pddr_is_empty (pddr))
{
ppl_delete_Pointset_Powerset_C_Polyhedron (po);
return false;
}
+ po = PDDR_DDP (pddr);
+
ppl_Pointset_Powerset_C_Polyhedron_space_dimension (po, &dim);
eqpp = build_pairwise_scheduling_inequality (dim, level, tdim1 + ddim1, 1);
diff --git a/gcc/graphite-dependences.h b/gcc/graphite-dependences.h
index ccf0b971b23..267d80ba9dd 100644
--- a/gcc/graphite-dependences.h
+++ b/gcc/graphite-dependences.h
@@ -24,27 +24,31 @@ along with GCC; see the file COPYING3. If not see
extern bool graphite_legal_transform (scop_p);
extern bool dependency_between_pbbs_p (poly_bb_p, poly_bb_p, int);
-typedef struct poly_dr_pair *poly_dr_pair_p;
+enum poly_dependence_kind {
+ unknown_dependence,
+ no_dependence,
+ has_dependence
+};
-typedef struct poly_dr_pair
+typedef struct poly_ddr
{
- /* Source polyhedral data reference of the dependence. */
- poly_dr_p source;
+ /* Source and sink data references of the dependence. */
+ poly_dr_p source, sink;
- /* Sink data reference of the dependence. */
- poly_dr_p sink;
-
- /* Data dependence polyhedron descibing dependence
- between SOURCE and SINK data references. */
+ /* Data dependence polyhedron. */
ppl_Pointset_Powerset_C_Polyhedron_t ddp;
-}poly_dr_pair;
+ enum poly_dependence_kind kind;
+
+} *poly_ddr_p;
-#define PDRP_SOURCE(PDRP) (PDR->source)
-#define PDRP_SINK(PDRP) (PDR->sink)
-#define PDRP_DDP(PDRP) (PDR->ddp)
+#define PDDR_SOURCE(PDDR) (PDDR->source)
+#define PDDR_SINK(PDDR) (PDDR->sink)
+#define PDDR_DDP(PDDR) (PDDR->ddp)
+#define PDDR_KIND(PDDR) (PDDR->kind)
-extern int eq_poly_dr_pair_p (const void *, const void *);
-extern hashval_t hash_poly_dr_pair_p (const void *);
+extern int eq_poly_ddr_p (const void *, const void *);
+extern hashval_t hash_poly_ddr_p (const void *);
+extern void free_poly_ddr (void *);
#endif
diff --git a/gcc/graphite-poly.c b/gcc/graphite-poly.c
index a5da8421eac..3bc50d48e7b 100644
--- a/gcc/graphite-poly.c
+++ b/gcc/graphite-poly.c
@@ -410,8 +410,8 @@ new_scop (void *region)
SCOP_CONTEXT (scop) = NULL;
scop_set_region (scop, region);
SCOP_BBS (scop) = VEC_alloc (poly_bb_p, heap, 3);
- SCOP_ORIGINAL_PDR_PAIRS (scop) = htab_create (10, hash_poly_dr_pair_p,
- eq_poly_dr_pair_p, free);
+ SCOP_ORIGINAL_PDDRS (scop) = htab_create (10, hash_poly_ddr_p,
+ eq_poly_ddr_p, free_poly_ddr);
return scop;
}
@@ -431,7 +431,7 @@ free_scop (scop_p scop)
if (SCOP_CONTEXT (scop))
ppl_delete_Pointset_Powerset_C_Polyhedron (SCOP_CONTEXT (scop));
- htab_delete (SCOP_ORIGINAL_PDR_PAIRS (scop));
+ htab_delete (SCOP_ORIGINAL_PDDRS (scop));
XDELETE (scop);
}
diff --git a/gcc/graphite-poly.h b/gcc/graphite-poly.h
index 4459315b8a2..793c36225ed 100644
--- a/gcc/graphite-poly.h
+++ b/gcc/graphite-poly.h
@@ -525,17 +525,16 @@ struct scop
c = 2a + b */
ppl_Pointset_Powerset_C_Polyhedron_t context;
- /* A hashtable of the original pairs of dependent data references.
- For each pair of dependent data references, the dependence
- polyhedron is stored also. */
- htab_t original_pdr_pairs;
+ /* A hashtable of the data dependence relations for the original
+ scattering. */
+ htab_t original_pddrs;
};
#define SCOP_BBS(S) (S->bbs)
#define SCOP_REGION(S) ((sese) S->region)
#define SCOP_DEP_GRAPH(S) (S->dep_graph)
#define SCOP_CONTEXT(S) (S->context)
-#define SCOP_ORIGINAL_PDR_PAIRS(S) (S->original_pdr_pairs)
+#define SCOP_ORIGINAL_PDDRS(S) (S->original_pddrs)
extern scop_p new_scop (void *);
extern void free_scop (scop_p);