aboutsummaryrefslogtreecommitdiff
path: root/gcc/tree-loop-distribution.c
diff options
context:
space:
mode:
authorBin Cheng <bin.cheng@linux.alibaba.com>2020-06-20 15:42:12 +0800
committerBin Cheng <bin.cheng@linux.alibaba.com>2020-06-20 15:42:12 +0800
commit2c0069fafb53ccb7a45a6815025dfcbd2882a36e (patch)
tree774ce084e4cba18c67ba523b91a6242b4f2ff6f3 /gcc/tree-loop-distribution.c
parente37658dffdb5d4707e316180a0d5d5caee843744 (diff)
downloadgcc-2c0069fafb53ccb7a45a6815025dfcbd2882a36e.zip
gcc-2c0069fafb53ccb7a45a6815025dfcbd2882a36e.tar.gz
gcc-2c0069fafb53ccb7a45a6815025dfcbd2882a36e.tar.bz2
Record and restore postorder information in breaking alias sccs.
gcc/ PR tree-optimization/95638 * tree-loop-distribution.c (pg_edge_callback_data): New field. (loop_distribution::break_alias_scc_partitions): Record and restore postorder information. Fix memory leak. gcc/testsuite/ PR tree-optimization/95638 * g++.dg/tree-ssa/pr95638.C: New test.
Diffstat (limited to 'gcc/tree-loop-distribution.c')
-rw-r--r--gcc/tree-loop-distribution.c23
1 files changed, 17 insertions, 6 deletions
diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c
index b122c39..9bc94e5 100644
--- a/gcc/tree-loop-distribution.c
+++ b/gcc/tree-loop-distribution.c
@@ -2145,6 +2145,8 @@ struct pg_edge_callback_data
bitmap sccs_to_merge;
/* Array constains component information for all vertices. */
int *vertices_component;
+ /* Array constains postorder information for all vertices. */
+ int *vertices_post;
/* Vector to record all data dependence relations which are needed
to break strong connected components by runtime alias checks. */
vec<ddr_p> *alias_ddrs;
@@ -2401,7 +2403,7 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
vec<struct partition *> *partitions,
vec<ddr_p> *alias_ddrs)
{
- int i, j, k, num_sccs, num_sccs_no_alias;
+ int i, j, k, num_sccs, num_sccs_no_alias = 0;
/* Build partition dependence graph. */
graph *pg = build_partition_graph (rdg, partitions, false);
@@ -2452,6 +2454,7 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
cbdata.sccs_to_merge = sccs_to_merge;
cbdata.alias_ddrs = alias_ddrs;
cbdata.vertices_component = XNEWVEC (int, pg->n_vertices);
+ cbdata.vertices_post = XNEWVEC (int, pg->n_vertices);
/* Record the component information which will be corrupted by next
graph scc finding call. */
for (i = 0; i < pg->n_vertices; ++i)
@@ -2460,6 +2463,11 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
/* Collect data dependences for runtime alias checks to break SCCs. */
if (bitmap_count_bits (sccs_to_merge) != (unsigned) num_sccs)
{
+ /* Record the postorder information which will be corrupted by next
+ graph SCC finding call. */
+ for (i = 0; i < pg->n_vertices; ++i)
+ cbdata.vertices_post[i] = pg->vertices[i].post;
+
/* Run SCC finding algorithm again, with alias dependence edges
skipped. This is to topologically sort partitions according to
compilation time known dependence. Note the topological order
@@ -2490,11 +2498,6 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
if (cbdata.vertices_component[k] != i)
continue;
- /* Update to the minimal postordeer number of vertices in scc so
- that merged partition is sorted correctly against others. */
- if (pg->vertices[j].post > pg->vertices[k].post)
- pg->vertices[j].post = pg->vertices[k].post;
-
partition_merge_into (NULL, first, partition, FUSE_SAME_SCC);
(*partitions)[k] = NULL;
partition_free (partition);
@@ -2505,6 +2508,14 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
first->type = PTYPE_SEQUENTIAL;
}
}
+ /* Restore the postorder information if it's corrupted in finding SCC
+ with alias dependence edges skipped. */
+ if (num_sccs_no_alias > 0)
+ for (i = 0; i < pg->n_vertices; ++i)
+ pg->vertices[i].post = cbdata.vertices_post[i];
+
+ free (cbdata.vertices_component);
+ free (cbdata.vertices_post);
}
sort_partitions_by_post_order (pg, partitions);