Commit 9fafb14a by Bin Cheng Committed by Bin Cheng

tree-loop-distribution.c (params.h): Include header file.

	* tree-loop-distribution.c (params.h): Include header file.
	(MAX_DATAREFS_NUM, DR_INDEX): New macro.
	(datarefs_vec): New global var.
	(create_rdg_vertices): Use datarefs_vec directly.
	(free_rdg): Don't free data references.
	(build_rdg): Update use.  Don't free data references.
	(distribute_loop): Compute global variable for data references.
	Bail out if there are too many data references.

From-SVN: r249988
parent 4084ea5f
2017-07-05 Bin Cheng <bin.cheng@arm.com> 2017-07-05 Bin Cheng <bin.cheng@arm.com>
* tree-loop-distribution.c (params.h): Include header file.
(MAX_DATAREFS_NUM, DR_INDEX): New macro.
(datarefs_vec): New global var.
(create_rdg_vertices): Use datarefs_vec directly.
(free_rdg): Don't free data references.
(build_rdg): Update use. Don't free data references.
(distribute_loop): Compute global variable for data references.
Bail out if there are too many data references.
2017-07-05 Bin Cheng <bin.cheng@arm.com>
* tree-loop-distribution.c (loop_nest): New global var. * tree-loop-distribution.c (loop_nest): New global var.
(build_rdg): Use loop directly, rather than loop nest. (build_rdg): Use loop directly, rather than loop nest.
(pg_add_dependence_edges): Remove loop nest parameter. Use global (pg_add_dependence_edges): Remove loop nest parameter. Use global
......
...@@ -63,12 +63,22 @@ along with GCC; see the file COPYING3. If not see ...@@ -63,12 +63,22 @@ along with GCC; see the file COPYING3. If not see
#include "tree-ssa.h" #include "tree-ssa.h"
#include "cfgloop.h" #include "cfgloop.h"
#include "tree-scalar-evolution.h" #include "tree-scalar-evolution.h"
#include "params.h"
#include "tree-vectorizer.h" #include "tree-vectorizer.h"
#define MAX_DATAREFS_NUM \
((unsigned) PARAM_VALUE (PARAM_LOOP_MAX_DATAREFS_FOR_DATADEPS))
/* The loop (nest) to be distributed. */ /* The loop (nest) to be distributed. */
static vec<loop_p> loop_nest; static vec<loop_p> loop_nest;
/* Vector of data references in the loop to be distributed. */
static vec<data_reference_p> datarefs_vec;
/* Store index of data reference in aux field. */
#define DR_INDEX(dr) ((uintptr_t) (dr)->aux)
/* A Reduced Dependence Graph (RDG) vertex representing a statement. */ /* A Reduced Dependence Graph (RDG) vertex representing a statement. */
struct rdg_vertex struct rdg_vertex
{ {
...@@ -339,8 +349,7 @@ create_rdg_cd_edges (struct graph *rdg, control_dependences *cd, loop_p loop) ...@@ -339,8 +349,7 @@ create_rdg_cd_edges (struct graph *rdg, control_dependences *cd, loop_p loop)
if that failed. */ if that failed. */
static bool 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; int i;
gimple *stmt; gimple *stmt;
...@@ -360,12 +369,12 @@ create_rdg_vertices (struct graph *rdg, vec<gimple *> stmts, loop_p loop, ...@@ -360,12 +369,12 @@ 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;
unsigned drp = datarefs->length (); unsigned drp = datarefs_vec.length ();
if (!find_data_references_in_stmt (loop, stmt, datarefs)) if (!find_data_references_in_stmt (loop, stmt, &datarefs_vec))
return false; return false;
for (unsigned j = drp; j < datarefs->length (); ++j) for (unsigned j = drp; j < datarefs_vec.length (); ++j)
{ {
data_reference_p dr = (*datarefs)[j]; data_reference_p dr = datarefs_vec[j];
if (DR_IS_READ (dr)) if (DR_IS_READ (dr))
RDGV_HAS_MEM_READS (v) = true; RDGV_HAS_MEM_READS (v) = true;
else else
...@@ -449,7 +458,7 @@ free_rdg (struct graph *rdg) ...@@ -449,7 +458,7 @@ free_rdg (struct graph *rdg)
if (v->data) if (v->data)
{ {
gimple_set_uid (RDGV_STMT (v), -1); gimple_set_uid (RDGV_STMT (v), -1);
free_data_refs (RDGV_DATAREFS (v)); (RDGV_DATAREFS (v)).release ();
free (v->data); free (v->data);
} }
} }
...@@ -459,22 +468,20 @@ free_rdg (struct graph *rdg) ...@@ -459,22 +468,20 @@ free_rdg (struct graph *rdg)
/* Build the Reduced Dependence Graph (RDG) with one vertex per statement of /* Build the Reduced Dependence Graph (RDG) with one vertex per statement of
LOOP, and one edge per flow dependence or control dependence from control LOOP, and one edge per flow dependence or control dependence from control
dependence CD. */ dependence CD. During visiting each statement, data references are also
collected and recorded in global data DATAREFS_VEC. */
static struct graph * static struct graph *
build_rdg (struct loop *loop, control_dependences *cd) build_rdg (struct loop *loop, control_dependences *cd)
{ {
struct graph *rdg; struct graph *rdg;
vec<data_reference_p> datarefs;
/* Create the RDG vertices from the stmts of the loop nest. */ /* Create the RDG vertices from the stmts of the loop nest. */
auto_vec<gimple *, 10> stmts; auto_vec<gimple *, 10> stmts;
stmts_from_loop (loop, &stmts); stmts_from_loop (loop, &stmts);
rdg = new_graph (stmts.length ()); rdg = new_graph (stmts.length ());
datarefs.create (10); if (!create_rdg_vertices (rdg, stmts, loop))
if (!create_rdg_vertices (rdg, stmts, loop, &datarefs))
{ {
datarefs.release ();
free_rdg (rdg); free_rdg (rdg);
return NULL; return NULL;
} }
...@@ -484,8 +491,6 @@ build_rdg (struct loop *loop, control_dependences *cd) ...@@ -484,8 +491,6 @@ build_rdg (struct loop *loop, control_dependences *cd)
if (cd) if (cd)
create_rdg_cd_edges (rdg, cd, loop); create_rdg_cd_edges (rdg, cd, loop);
datarefs.release ();
return rdg; return rdg;
} }
...@@ -1518,6 +1523,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1518,6 +1523,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
return 0; return 0;
} }
datarefs_vec.create (20);
rdg = build_rdg (loop, cd); rdg = build_rdg (loop, cd);
if (!rdg) if (!rdg)
{ {
...@@ -1527,9 +1533,27 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1527,9 +1533,27 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
loop->num); loop->num);
loop_nest.release (); loop_nest.release ();
free_data_refs (datarefs_vec);
return 0;
}
if (datarefs_vec.length () > MAX_DATAREFS_NUM)
{
if (dump_file && (dump_flags & TDF_DETAILS))
fprintf (dump_file,
"Loop %d not distributed: too many memory references.\n",
loop->num);
free_rdg (rdg);
loop_nest.release ();
free_data_refs (datarefs_vec);
return 0; return 0;
} }
data_reference_p dref;
for (i = 0; datarefs_vec.iterate (i, &dref); ++i)
dref->aux = (void *) (uintptr_t) i;
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
dump_rdg (dump_file, rdg); dump_rdg (dump_file, rdg);
...@@ -1735,6 +1759,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1735,6 +1759,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
ldist_done: ldist_done:
loop_nest.release (); loop_nest.release ();
free_data_refs (datarefs_vec);
FOR_EACH_VEC_ELT (partitions, i, partition) FOR_EACH_VEC_ELT (partitions, i, partition)
partition_free (partition); partition_free (partition);
......
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