Commit afae0207 by Sebastian Pop Committed by Sebastian Pop

graphite-dependences.c (pddr_original_scattering): New.

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

	* graphite-dependences.c (pddr_original_scattering): New.
	(graphite_legal_transform_dr): Call pddr_original_scattering.
	(dot_deps_1): New.
	(dot_deps): New.
	* graphite-dependences.h (dot_deps): Declared.
	* graphite-poly.c (new_poly_dr): Initialize PDR_ID.
	(print_pdr): Print PDR_ID.
	* graphite-poly.h (struct poly_dr): Add field id.
	(PDR_ID): New.
	(pbb_index): New.
	* graphite-scop-detection.c (dot_all_scops_1): Cleanup comment.

From-SVN: r151183
parent f8e0bb8b
2009-08-28 Sebastian Pop <sebastian.pop@amd.com> 2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (pddr_original_scattering): New.
(graphite_legal_transform_dr): Call pddr_original_scattering.
(dot_deps_1): New.
(dot_deps): New.
* graphite-dependences.h (dot_deps): Declared.
* graphite-poly.c (new_poly_dr): Initialize PDR_ID.
(print_pdr): Print PDR_ID.
* graphite-poly.h (struct poly_dr): Add field id.
(PDR_ID): New.
(pbb_index): New.
* graphite-scop-detection.c (dot_all_scops_1): Cleanup comment.
2009-08-28 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (graphite_carried_dependence_level_k): Do * graphite-dependences.c (graphite_carried_dependence_level_k): Do
not delete the original dependence relation. not delete the original dependence relation.
......
2009-08-25 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (pddr_original_scattering): New.
(graphite_legal_transform_dr): Call pddr_original_scattering.
(dot_deps_1): New.
(dot_deps): New.
* graphite-dependences.h (dot_deps): Declared.
* graphite-poly.c (new_poly_dr): Initialize PDR_ID.
(print_pdr): Print PDR_ID.
* graphite-poly.h (struct poly_dr): Add field id.
(PDR_ID): New.
(pbb_index): New.
* graphite-scop-detection.c (dot_all_scops_1): Cleanup comment.
2009-08-22 Sebastian Pop <sebastian.pop@amd.com> 2009-08-22 Sebastian Pop <sebastian.pop@amd.com>
* graphite-dependences.c (graphite_carried_dependence_level_k): Do * graphite-dependences.c (graphite_carried_dependence_level_k): Do
......
...@@ -494,6 +494,30 @@ dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -494,6 +494,30 @@ dependence_polyhedron (poly_bb_p pbb1, poly_bb_p pbb2,
return res; return res;
} }
/* Returns the PDDR corresponding to the original schedule, or NULL if
the dependence relation is empty. */
static poly_ddr_p
pddr_original_scattering (poly_bb_p pbb1, poly_bb_p pbb2,
poly_dr_p pdr1, poly_dr_p pdr2)
{
poly_ddr_p pddr;
ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1);
ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2);
ppl_Polyhedron_t so1 = PBB_ORIGINAL_SCATTERING (pbb1);
ppl_Polyhedron_t so2 = PBB_ORIGINAL_SCATTERING (pbb2);
if (PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2))
return NULL;
pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
true, true);
if (pddr_is_empty (pddr))
return NULL;
return pddr;
}
/* Returns true when the PBB_TRANSFORMED_SCATTERING functions of PBB1 /* Returns true when the PBB_TRANSFORMED_SCATTERING functions of PBB1
and PBB2 respect the data dependences of PBB_ORIGINAL_SCATTERING and PBB2 respect the data dependences of PBB_ORIGINAL_SCATTERING
functions. */ functions. */
...@@ -509,20 +533,11 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2, ...@@ -509,20 +533,11 @@ graphite_legal_transform_dr (poly_bb_p pbb1, poly_bb_p pbb2,
ppl_dimension_type pdim; ppl_dimension_type pdim;
bool is_empty_p; bool is_empty_p;
poly_ddr_p pddr; poly_ddr_p pddr;
ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1); ppl_Pointset_Powerset_C_Polyhedron_t d1 = PBB_DOMAIN (pbb1);
ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2); ppl_Pointset_Powerset_C_Polyhedron_t d2 = PBB_DOMAIN (pbb2);
ppl_Polyhedron_t so1 = PBB_ORIGINAL_SCATTERING (pbb1);
ppl_Polyhedron_t so2 = PBB_ORIGINAL_SCATTERING (pbb2);
graphite_dim_t sdim1 = PDR_NB_SUBSCRIPTS (pdr1) + 1;
graphite_dim_t sdim2 = PDR_NB_SUBSCRIPTS (pdr2) + 1;
if (sdim1 != sdim2) pddr = pddr_original_scattering (pbb1, pbb2, pdr1, pdr2);
return true; if (!pddr)
pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
true, true);
if (pddr_is_empty (pddr))
return true; return true;
po = PDDR_DDP (pddr); po = PDDR_DDP (pddr);
...@@ -679,8 +694,6 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2, ...@@ -679,8 +694,6 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
ppl_Polyhedron_t so2 = PBB_TRANSFORMED_SCATTERING (pbb2); ppl_Polyhedron_t so2 = PBB_TRANSFORMED_SCATTERING (pbb2);
ppl_Pointset_Powerset_C_Polyhedron_t po; ppl_Pointset_Powerset_C_Polyhedron_t po;
ppl_Pointset_Powerset_C_Polyhedron_t eqpp; ppl_Pointset_Powerset_C_Polyhedron_t eqpp;
graphite_dim_t sdim1 = PDR_NB_SUBSCRIPTS (pdr1) + 1;
graphite_dim_t sdim2 = PDR_NB_SUBSCRIPTS (pdr2) + 1;
graphite_dim_t tdim1 = pbb_nb_scattering_transform (pbb1); graphite_dim_t tdim1 = pbb_nb_scattering_transform (pbb1);
graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1); graphite_dim_t ddim1 = pbb_dim_iter_domain (pbb1);
ppl_dimension_type dim; ppl_dimension_type dim;
...@@ -691,7 +704,7 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2, ...@@ -691,7 +704,7 @@ graphite_carried_dependence_level_k (poly_dr_p pdr1, poly_dr_p pdr2,
|| !poly_drs_may_alias_p (pdr1, pdr2)) || !poly_drs_may_alias_p (pdr1, pdr2))
return false; return false;
if (sdim1 != sdim2) if (PDR_NB_SUBSCRIPTS (pdr1) != PDR_NB_SUBSCRIPTS (pdr2))
return true; return true;
pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2, pddr = dependence_polyhedron (pbb1, pbb2, d1, d2, pdr1, pdr2, so1, so2,
...@@ -733,4 +746,50 @@ dependency_between_pbbs_p (poly_bb_p pbb1, poly_bb_p pbb2, int level) ...@@ -733,4 +746,50 @@ dependency_between_pbbs_p (poly_bb_p pbb1, poly_bb_p pbb2, int level)
return false; return false;
} }
/* Pretty print to FILE all the data dependences of SCoP in DOT
format. */
static void
dot_deps_1 (FILE *file, scop_p scop)
{
int i, j, k, l;
poly_bb_p pbb1, pbb2;
poly_dr_p pdr1, pdr2;
fputs ("digraph all {\n", file);
for (i = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), i, pbb1); i++)
for (j = 0; VEC_iterate (poly_bb_p, SCOP_BBS (scop), j, pbb2); j++)
for (k = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb1), k, pdr1); k++)
for (l = 0; VEC_iterate (poly_dr_p, PBB_DRS (pbb2), l, pdr2); l++)
if (pddr_original_scattering (pbb1, pbb2, pdr1, pdr2))
fprintf (file, "S%d_D%d -> S%d_D%d\n",
pbb_index (pbb1), PDR_ID (pdr1),
pbb_index (pbb2), PDR_ID (pdr2));
fputs ("}\n\n", file);
}
/* Display all the data dependences in SCoP using dotty. */
void
dot_deps (scop_p scop)
{
/* When debugging, enable the following code. This cannot be used
in production compilers because it calls "system". */
#if 1
int x;
FILE *stream = fopen ("/tmp/scopdeps.dot", "w");
gcc_assert (stream);
dot_deps_1 (stream, scop);
fclose (stream);
x = system ("dotty /tmp/scopdeps.dot");
#else
dot_deps_1 (stderr, scop);
#endif
}
#endif #endif
...@@ -50,5 +50,6 @@ typedef struct poly_ddr ...@@ -50,5 +50,6 @@ typedef struct poly_ddr
extern int eq_poly_ddr_p (const void *, const void *); extern int eq_poly_ddr_p (const void *, const void *);
extern hashval_t hash_poly_ddr_p (const void *); extern hashval_t hash_poly_ddr_p (const void *);
extern void free_poly_ddr (void *); extern void free_poly_ddr (void *);
extern void dot_deps (scop_p);
#endif #endif
...@@ -273,7 +273,9 @@ new_poly_dr (poly_bb_p pbb, ...@@ -273,7 +273,9 @@ new_poly_dr (poly_bb_p pbb,
enum POLY_DR_TYPE type, void *cdr, int nb_subscripts) enum POLY_DR_TYPE type, void *cdr, int nb_subscripts)
{ {
poly_dr_p pdr = XNEW (struct poly_dr); poly_dr_p pdr = XNEW (struct poly_dr);
static int id = 0;
PDR_ID (pdr) = id++;
PDR_PBB (pdr) = pbb; PDR_PBB (pdr) = pbb;
PDR_ACCESSES (pdr) = accesses; PDR_ACCESSES (pdr) = accesses;
PDR_TYPE (pdr) = type; PDR_TYPE (pdr) = type;
...@@ -361,7 +363,7 @@ print_pdr_access_layout (FILE *file, poly_dr_p pdr) ...@@ -361,7 +363,7 @@ print_pdr_access_layout (FILE *file, poly_dr_p pdr)
void void
print_pdr (FILE *file, poly_dr_p pdr) print_pdr (FILE *file, poly_dr_p pdr)
{ {
fprintf (file, "pdr ("); fprintf (file, "pdr_%d (", PDR_ID (pdr));
switch (PDR_TYPE (pdr)) switch (PDR_TYPE (pdr))
{ {
......
...@@ -53,6 +53,9 @@ enum POLY_DR_TYPE ...@@ -53,6 +53,9 @@ enum POLY_DR_TYPE
struct poly_dr struct poly_dr
{ {
/* An identifier for this PDR. */
int id;
/* A pointer to compiler's data reference description. */ /* A pointer to compiler's data reference description. */
void *compiler_dr; void *compiler_dr;
...@@ -130,9 +133,10 @@ struct poly_dr ...@@ -130,9 +133,10 @@ struct poly_dr
ppl_Pointset_Powerset_C_Polyhedron_t accesses; ppl_Pointset_Powerset_C_Polyhedron_t accesses;
/* The number of subscripts. */ /* The number of subscripts. */
graphite_dim_t nb_subscripts; graphite_dim_t nb_subscripts;
}; };
#define PDR_ID(PDR) (PDR->id)
#define PDR_CDR(PDR) (PDR->compiler_dr) #define PDR_CDR(PDR) (PDR->compiler_dr)
#define PDR_PBB(PDR) (PDR->pbb) #define PDR_PBB(PDR) (PDR->pbb)
#define PDR_TYPE(PDR) (PDR->type) #define PDR_TYPE(PDR) (PDR->type)
...@@ -304,9 +308,18 @@ extern bool scop_do_interchange (scop_p); ...@@ -304,9 +308,18 @@ 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);
/* The index of the PBB. */
static inline int
pbb_index (poly_bb_p pbb)
{
return GBB_BB (PBB_BLACK_BOX (pbb))->index;
}
/* The scop that contains the PDR. */ /* The scop that contains the PDR. */
static inline scop_p pdr_scop (poly_dr_p pdr) static inline scop_p
pdr_scop (poly_dr_p pdr)
{ {
return PBB_SCOP (PDR_PBB (pdr)); return PBB_SCOP (PDR_PBB (pdr));
} }
......
...@@ -1445,12 +1445,15 @@ build_scops (VEC (scop_p, heap) **scops) ...@@ -1445,12 +1445,15 @@ build_scops (VEC (scop_p, heap) **scops)
VEC_length (scop_p, *scops)); VEC_length (scop_p, *scops));
} }
/* Pretty print all SCoPs in DOT format and mark them with different colors. /* Pretty print to FILE all the SCoPs in DOT format and mark them with
If there are not enough colors, paint later SCoPs gray. different colors. If there are not enough colors, paint the
remaining SCoPs in gray.
Special nodes: Special nodes:
- "*" after the node number: entry of a SCoP, - "*" after the node number denotes the entry of a SCoP,
- "#" after the node number: exit of a SCoP, - "#" after the node number denotes the exit of a SCoP,
- "()" entry or exit not part of SCoP. */ - "()" around the node number denotes the entry or the
exit nodes of the SCOP. These are not part of SCoP. */
static void static void
dot_all_scops_1 (FILE *file, VEC (scop_p, heap) *scops) dot_all_scops_1 (FILE *file, VEC (scop_p, heap) *scops)
......
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