Commit 4084ea5f by Bin Cheng Committed by Bin Cheng

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.
	(pg_add_dependence_edges): Remove loop nest parameter.  Use global
	variable directly.
	(distribute_loop): Compute global variable loop nest.  Update use.

From-SVN: r249987
parent 821dbeef
2017-07-05 Bin Cheng <bin.cheng@arm.com> 2017-07-05 Bin Cheng <bin.cheng@arm.com>
* tree-loop-distribution.c (loop_nest): New global var.
(build_rdg): Use loop directly, rather than loop nest.
(pg_add_dependence_edges): Remove loop nest parameter. Use global
variable directly.
(distribute_loop): Compute global variable loop nest. Update use.
2017-07-05 Bin Cheng <bin.cheng@arm.com>
* tree-loop-distribution.c (enum fuse_type, fuse_message): New. * tree-loop-distribution.c (enum fuse_type, fuse_message): New.
(partition_merge_into): New parameter. Dump reason for fusion. (partition_merge_into): New parameter. Dump reason for fusion.
(distribute_loop): Update use of partition_merge_into. (distribute_loop): Update use of partition_merge_into.
......
...@@ -66,6 +66,9 @@ along with GCC; see the file COPYING3. If not see ...@@ -66,6 +66,9 @@ along with GCC; see the file COPYING3. If not see
#include "tree-vectorizer.h" #include "tree-vectorizer.h"
/* The loop (nest) to be distributed. */
static vec<loop_p> loop_nest;
/* A Reduced Dependence Graph (RDG) vertex representing a statement. */ /* A Reduced Dependence Graph (RDG) vertex representing a statement. */
struct rdg_vertex struct rdg_vertex
{ {
...@@ -454,22 +457,22 @@ free_rdg (struct graph *rdg) ...@@ -454,22 +457,22 @@ free_rdg (struct graph *rdg)
free_graph (rdg); free_graph (rdg);
} }
/* Build the Reduced Dependence Graph (RDG) with one vertex per /* Build the Reduced Dependence Graph (RDG) with one vertex per statement of
statement of the loop nest LOOP_NEST, and one edge per data dependence or LOOP, and one edge per flow dependence or control dependence from control
scalar dependence. */ dependence CD. */
static struct graph * static struct graph *
build_rdg (vec<loop_p> loop_nest, control_dependences *cd) build_rdg (struct loop *loop, control_dependences *cd)
{ {
struct graph *rdg; struct graph *rdg;
vec<data_reference_p> datarefs; 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_nest[0], &stmts); stmts_from_loop (loop, &stmts);
rdg = new_graph (stmts.length ()); rdg = new_graph (stmts.length ());
datarefs.create (10); datarefs.create (10);
if (!create_rdg_vertices (rdg, stmts, loop_nest[0], &datarefs)) if (!create_rdg_vertices (rdg, stmts, loop, &datarefs))
{ {
datarefs.release (); datarefs.release ();
free_rdg (rdg); free_rdg (rdg);
...@@ -479,7 +482,7 @@ build_rdg (vec<loop_p> loop_nest, control_dependences *cd) ...@@ -479,7 +482,7 @@ build_rdg (vec<loop_p> loop_nest, control_dependences *cd)
create_rdg_flow_edges (rdg); create_rdg_flow_edges (rdg);
if (cd) if (cd)
create_rdg_cd_edges (rdg, cd, loop_nest[0]); create_rdg_cd_edges (rdg, cd, loop);
datarefs.release (); datarefs.release ();
...@@ -1418,7 +1421,7 @@ partition_contains_all_rw (struct graph *rdg, ...@@ -1418,7 +1421,7 @@ partition_contains_all_rw (struct graph *rdg,
and DRS2 and modify and return DIR according to that. */ and DRS2 and modify and return DIR according to that. */
static int static int
pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir, pg_add_dependence_edges (struct graph *rdg, int dir,
vec<data_reference_p> drs1, vec<data_reference_p> drs1,
vec<data_reference_p> drs2) vec<data_reference_p> drs2)
{ {
...@@ -1439,8 +1442,8 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir, ...@@ -1439,8 +1442,8 @@ pg_add_dependence_edges (struct graph *rdg, vec<loop_p> loops, int dir,
std::swap (dr1, dr2); std::swap (dr1, dr2);
this_dir = -this_dir; this_dir = -this_dir;
} }
ddr = initialize_data_dependence_relation (dr1, dr2, loops); ddr = initialize_data_dependence_relation (dr1, dr2, loop_nest);
compute_affine_dependence (ddr, loops[0]); compute_affine_dependence (ddr, loop_nest[0]);
if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know) if (DDR_ARE_DEPENDENT (ddr) == chrec_dont_know)
this_dir = 2; this_dir = 2;
else if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE) else if (DDR_ARE_DEPENDENT (ddr) == NULL_TREE)
...@@ -1508,11 +1511,14 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1508,11 +1511,14 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
*destroy_p = false; *destroy_p = false;
*nb_calls = 0; *nb_calls = 0;
auto_vec<loop_p, 3> loop_nest; loop_nest.create (0);
if (!find_loop_nest (loop, &loop_nest)) if (!find_loop_nest (loop, &loop_nest))
{
loop_nest.release ();
return 0; return 0;
}
rdg = build_rdg (loop_nest, cd); rdg = build_rdg (loop, cd);
if (!rdg) if (!rdg)
{ {
if (dump_file && (dump_flags & TDF_DETAILS)) if (dump_file && (dump_flags & TDF_DETAILS))
...@@ -1520,6 +1526,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1520,6 +1526,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
"Loop %d not distributed: failed to build the RDG.\n", "Loop %d not distributed: failed to build the RDG.\n",
loop->num); loop->num);
loop_nest.release ();
return 0; return 0;
} }
...@@ -1643,15 +1650,15 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1643,15 +1650,15 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
/* dependence direction - 0 is no dependence, -1 is back, /* dependence direction - 0 is no dependence, -1 is back,
1 is forth, 2 is both (we can stop then, merging will occur). */ 1 is forth, 2 is both (we can stop then, merging will occur). */
int dir = 0; int dir = 0;
dir = pg_add_dependence_edges (rdg, loop_nest, dir, dir = pg_add_dependence_edges (rdg, dir,
PGDATA(i)->writes, PGDATA(i)->writes,
PGDATA(j)->reads); PGDATA(j)->reads);
if (dir != 2) if (dir != 2)
dir = pg_add_dependence_edges (rdg, loop_nest, dir, dir = pg_add_dependence_edges (rdg, dir,
PGDATA(i)->reads, PGDATA(i)->reads,
PGDATA(j)->writes); PGDATA(j)->writes);
if (dir != 2) if (dir != 2)
dir = pg_add_dependence_edges (rdg, loop_nest, dir, dir = pg_add_dependence_edges (rdg, dir,
PGDATA(i)->writes, PGDATA(i)->writes,
PGDATA(j)->writes); PGDATA(j)->writes);
if (dir == 1 || dir == 2) if (dir == 1 || dir == 2)
...@@ -1727,6 +1734,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts, ...@@ -1727,6 +1734,7 @@ distribute_loop (struct loop *loop, vec<gimple *> stmts,
} }
ldist_done: ldist_done:
loop_nest.release ();
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