Commit 447dd906 by Richard Biener Committed by Richard Biener

tree-data-ref.h (build_rdg): Drop all parameters but loop.

2013-09-10  Richard Biener  <rguenther@suse.de>

	* tree-data-ref.h (build_rdg): Drop all parameters but loop.
	* tree-data-ref.c (create_rdg_vertices): Collect all data
	references, signal failure to the caller, use data-ref API.
	(build_rdg): Compute data references only once.  Maintain
	lifetime of data references and data dependences from within
	RDG.
	(free_rdg): Free dependence relations.
	* tree-loop-distribution.c (rdg_flag_uses): Drop weird code
	inventing extra dependences.
	(distribute_loop): Update for RDG API changes.

From-SVN: r202431
parent f14a7324
2013-09-10 Richard Biener <rguenther@suse.de>
* tree-data-ref.h (build_rdg): Drop all parameters but loop.
* tree-data-ref.c (create_rdg_vertices): Collect all data
references, signal failure to the caller, use data-ref API.
(build_rdg): Compute data references only once. Maintain
lifetime of data references and data dependences from within
RDG.
(free_rdg): Free dependence relations.
* tree-loop-distribution.c (rdg_flag_uses): Drop weird code
inventing extra dependences.
(distribute_loop): Update for RDG API changes.
2013-09-10 Kai Tietz <ktietz@redhat.com> 2013-09-10 Kai Tietz <ktietz@redhat.com>
* doc/invoke.texi (fms-extensions): Document changed * doc/invoke.texi (fms-extensions): Document changed
......
...@@ -5062,18 +5062,18 @@ create_rdg_edges (struct graph *rdg, vec<ddr_p> ddrs) ...@@ -5062,18 +5062,18 @@ create_rdg_edges (struct graph *rdg, vec<ddr_p> ddrs)
create_rdg_edges_for_scalar (rdg, DEF_FROM_PTR (def_p), i); create_rdg_edges_for_scalar (rdg, DEF_FROM_PTR (def_p), i);
} }
/* Build the vertices of the reduced dependence graph RDG. */ /* Build the vertices of the reduced dependence graph RDG. Return false
if that failed. */
static void static bool
create_rdg_vertices (struct graph *rdg, vec<gimple> stmts, loop_p loop) create_rdg_vertices (struct graph *rdg, vec<gimple> stmts, loop_p loop,
vec<data_reference_p> *datarefs)
{ {
int i, j; int i;
gimple stmt; gimple stmt;
FOR_EACH_VEC_ELT (stmts, i, stmt) FOR_EACH_VEC_ELT (stmts, i, stmt)
{ {
vec<data_ref_loc, va_stack> references;
data_ref_loc *ref;
struct vertex *v = &(rdg->vertices[i]); struct vertex *v = &(rdg->vertices[i]);
/* Record statement to vertex mapping. */ /* Record statement to vertex mapping. */
...@@ -5087,22 +5087,20 @@ create_rdg_vertices (struct graph *rdg, vec<gimple> stmts, loop_p loop) ...@@ -5087,22 +5087,20 @@ create_rdg_vertices (struct graph *rdg, vec<gimple> stmts, loop_p loop)
if (gimple_code (stmt) == GIMPLE_PHI) if (gimple_code (stmt) == GIMPLE_PHI)
continue; continue;
vec_stack_alloc (data_ref_loc, references, 2); unsigned drp = datarefs->length ();
get_references_in_stmt (stmt, &references); if (!find_data_references_in_stmt (loop, stmt, datarefs))
FOR_EACH_VEC_ELT (references, j, ref) return false;
for (unsigned j = drp; j < datarefs->length (); ++j)
{ {
data_reference_p dr; data_reference_p dr = (*datarefs)[j];
if (!ref->is_read) if (DR_IS_READ (dr))
RDGV_HAS_MEM_WRITE (v) = true;
else
RDGV_HAS_MEM_READS (v) = true; RDGV_HAS_MEM_READS (v) = true;
dr = create_data_ref (loop, loop_containing_stmt (stmt), else
*ref->pos, stmt, ref->is_read); RDGV_HAS_MEM_WRITE (v) = true;
if (dr) RDGV_DATAREFS (v).safe_push (dr);
RDGV_DATAREFS (v).safe_push (dr);
} }
references.release ();
} }
return true;
} }
/* Initialize STMTS with all the statements of LOOP. When /* Initialize STMTS with all the statements of LOOP. When
...@@ -5168,25 +5166,46 @@ build_empty_rdg (int n_stmts) ...@@ -5168,25 +5166,46 @@ build_empty_rdg (int n_stmts)
scalar dependence. */ scalar dependence. */
struct graph * struct graph *
build_rdg (struct loop *loop, build_rdg (struct loop *loop)
vec<loop_p> *loop_nest,
vec<ddr_p> *dependence_relations,
vec<data_reference_p> *datarefs)
{ {
struct graph *rdg = NULL; struct graph *rdg;
vec<loop_p> loop_nest;
vec<gimple> stmts;
vec<data_reference_p> datarefs;
vec<ddr_p> dependence_relations;
if (compute_data_dependences_for_loop (loop, false, loop_nest, datarefs, loop_nest.create (3);
dependence_relations) if (!find_loop_nest (loop, &loop_nest))
&& known_dependences_p (*dependence_relations)) {
loop_nest.release ();
return NULL;
}
stmts.create (10);
stmts_from_loop (loop, &stmts);
rdg = build_empty_rdg (stmts.length ());
datarefs.create (10);
if (!create_rdg_vertices (rdg, stmts, loop, &datarefs))
{ {
vec<gimple> stmts;
stmts.create (10);
stmts_from_loop (loop, &stmts);
rdg = build_empty_rdg (stmts.length ());
create_rdg_vertices (rdg, stmts, loop);
create_rdg_edges (rdg, *dependence_relations);
stmts.release (); stmts.release ();
free_rdg (rdg);
return NULL;
}
stmts.release ();
dependence_relations.create (100);
if (!compute_all_dependences (datarefs, &dependence_relations, loop_nest,
false)
|| !known_dependences_p (dependence_relations))
{
loop_nest.release ();
datarefs.release ();
dependence_relations.release ();
free_rdg (rdg);
return NULL;
} }
loop_nest.release ();
create_rdg_edges (rdg, dependence_relations);
dependence_relations.release ();
return rdg; return rdg;
} }
...@@ -5204,11 +5223,17 @@ free_rdg (struct graph *rdg) ...@@ -5204,11 +5223,17 @@ free_rdg (struct graph *rdg)
struct graph_edge *e; struct graph_edge *e;
for (e = v->succ; e; e = e->succ_next) for (e = v->succ; e; e = e->succ_next)
free (e->data); {
free_dependence_relation (RDGE_RELATION (e));
free (e->data);
}
gimple_set_uid (RDGV_STMT (v), -1); if (v->data)
free_data_refs (RDGV_DATAREFS (v)); {
free (v->data); gimple_set_uid (RDGV_STMT (v), -1);
free_data_refs (RDGV_DATAREFS (v));
free (v->data);
}
} }
free_graph (rdg); free_graph (rdg);
......
...@@ -585,11 +585,7 @@ typedef struct rdg_edge ...@@ -585,11 +585,7 @@ typedef struct rdg_edge
#define RDGE_LEVEL(E) ((struct rdg_edge *) ((E)->data))->level #define RDGE_LEVEL(E) ((struct rdg_edge *) ((E)->data))->level
#define RDGE_RELATION(E) ((struct rdg_edge *) ((E)->data))->relation #define RDGE_RELATION(E) ((struct rdg_edge *) ((E)->data))->relation
struct graph *build_rdg (struct loop *, struct graph *build_rdg (struct loop *);
vec<loop_p> *,
vec<ddr_p> *,
vec<data_reference_p> *);
struct graph *build_empty_rdg (int);
void free_rdg (struct graph *); void free_rdg (struct graph *);
/* Return the index of the variable VAR in the LOOP_NEST array. */ /* Return the index of the variable VAR in the LOOP_NEST array. */
......
...@@ -635,7 +635,6 @@ static void ...@@ -635,7 +635,6 @@ static void
rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops, rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops,
bitmap processed) bitmap processed)
{ {
use_operand_p use_p;
struct vertex *x = &(rdg->vertices[u]); struct vertex *x = &(rdg->vertices[u]);
gimple stmt = RDGV_STMT (x); gimple stmt = RDGV_STMT (x);
struct graph_edge *anti_dep = has_anti_or_output_dependence (x); struct graph_edge *anti_dep = has_anti_or_output_dependence (x);
...@@ -652,26 +651,6 @@ rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops, ...@@ -652,26 +651,6 @@ rdg_flag_uses (struct graph *rdg, int u, partition_t partition, bitmap loops,
processed); processed);
} }
if (gimple_code (stmt) != GIMPLE_PHI)
{
if ((use_p = gimple_vuse_op (stmt)) != NULL_USE_OPERAND_P)
{
tree use = USE_FROM_PTR (use_p);
if (TREE_CODE (use) == SSA_NAME
&& !SSA_NAME_IS_DEFAULT_DEF (use))
{
gimple def_stmt = SSA_NAME_DEF_STMT (use);
int v = rdg_vertex_for_stmt (rdg, def_stmt);
if (v >= 0
&& !already_processed_vertex_p (processed, v))
rdg_flag_vertex_and_dependent (rdg, v, partition, loops,
processed);
}
}
}
if (is_gimple_assign (stmt) && has_upstream_mem_writes (u)) if (is_gimple_assign (stmt) && has_upstream_mem_writes (u))
{ {
tree op0 = gimple_assign_lhs (stmt); tree op0 = gimple_assign_lhs (stmt);
...@@ -1438,15 +1417,8 @@ distribute_loop (struct loop *loop, vec<gimple> stmts) ...@@ -1438,15 +1417,8 @@ distribute_loop (struct loop *loop, vec<gimple> stmts)
gimple s; gimple s;
unsigned i; unsigned i;
vec<int> vertices; vec<int> vertices;
vec<ddr_p> dependence_relations;
vec<data_reference_p> datarefs;
vec<loop_p> loop_nest;
datarefs.create (10);
dependence_relations.create (100);
loop_nest.create (3);
rdg = build_rdg (loop, &loop_nest, &dependence_relations, &datarefs);
rdg = build_rdg (loop);
if (!rdg) if (!rdg)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
...@@ -1454,9 +1426,6 @@ distribute_loop (struct loop *loop, vec<gimple> stmts) ...@@ -1454,9 +1426,6 @@ distribute_loop (struct loop *loop, vec<gimple> stmts)
"FIXME: Loop %d not distributed: failed to build the RDG.\n", "FIXME: Loop %d not distributed: failed to build the RDG.\n",
loop->num); loop->num);
free_dependence_relations (dependence_relations);
free_data_refs (datarefs);
loop_nest.release ();
return res; return res;
} }
...@@ -1482,9 +1451,6 @@ distribute_loop (struct loop *loop, vec<gimple> stmts) ...@@ -1482,9 +1451,6 @@ distribute_loop (struct loop *loop, vec<gimple> stmts)
res = ldist_gen (loop, rdg, vertices); res = ldist_gen (loop, rdg, vertices);
vertices.release (); vertices.release ();
free_rdg (rdg); free_rdg (rdg);
free_dependence_relations (dependence_relations);
free_data_refs (datarefs);
loop_nest.release ();
return res; return res;
} }
......
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