Commit b4ec1d31 by Bin Cheng Committed by Bin Cheng

re PR tree-optimization/82472 (ICE in generate_code_for_partition, at…

re PR tree-optimization/82472 (ICE in generate_code_for_partition, at tree-loop-distribution.c:1145)

	PR tree-optimization/82472
	* tree-loop-distribution.c (sort_partitions_by_post_order): Refine
	comment.
	(break_alias_scc_partitions): Update postorder number.

	gcc/testsuite
	* gcc.dg/tree-ssa/pr82472.c: New test.

From-SVN: r253641
parent 3a266bcd
2017-10-11 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/82472
* tree-loop-distribution.c (sort_partitions_by_post_order): Refine
comment.
(break_alias_scc_partitions): Update postorder number.
2017-10-11 Martin Liska <mliska@suse.cz> 2017-10-11 Martin Liska <mliska@suse.cz>
PR sanitizer/82490 PR sanitizer/82490
2017-10-11 Bin Cheng <bin.cheng@arm.com>
PR tree-optimization/82472
* gcc.dg/tree-ssa/pr82472.c: New test.
2017-10-11 Martin Liska <mliska@suse.cz> 2017-10-11 Martin Liska <mliska@suse.cz>
PR sanitizer/82490 PR sanitizer/82490
......
/* { dg-do compile } */
/* { dg-options "-O2 -ftree-loop-distribution" } */
long int xj;
int
cx (long int *ox, short int mk, char tf)
{
int si, f9;
char *p4 = &tf;
short int *rm = (tf != 0) ? (short int *)&f9 : &mk;
for (f9 = 0; f9 < 2; ++f9)
{
*rm = 0;
*p4 = *ox;
si = mk;
xj = 0;
while (p4 < (char *)rm)
++p4;
}
return si;
}
...@@ -1943,7 +1943,8 @@ build_partition_graph (struct graph *rdg, ...@@ -1943,7 +1943,8 @@ build_partition_graph (struct graph *rdg,
return pg; return pg;
} }
/* Sort partitions in PG by post order and store them in PARTITIONS. */ /* Sort partitions in PG in descending post order and store them in
PARTITIONS. */
static void static void
sort_partitions_by_post_order (struct graph *pg, sort_partitions_by_post_order (struct graph *pg,
...@@ -1952,7 +1953,7 @@ sort_partitions_by_post_order (struct graph *pg, ...@@ -1952,7 +1953,7 @@ sort_partitions_by_post_order (struct graph *pg,
int i; int i;
struct pg_vdata *data; struct pg_vdata *data;
/* Now order the remaining nodes in postorder. */ /* Now order the remaining nodes in descending postorder. */
qsort (pg->vertices, pg->n_vertices, sizeof (vertex), pgcmp); qsort (pg->vertices, pg->n_vertices, sizeof (vertex), pgcmp);
partitions->truncate (0); partitions->truncate (0);
for (i = 0; i < pg->n_vertices; ++i) for (i = 0; i < pg->n_vertices; ++i)
...@@ -2048,7 +2049,7 @@ break_alias_scc_partitions (struct graph *rdg, ...@@ -2048,7 +2049,7 @@ break_alias_scc_partitions (struct graph *rdg,
vec<struct partition *> *partitions, vec<struct partition *> *partitions,
vec<ddr_p> *alias_ddrs) vec<ddr_p> *alias_ddrs)
{ {
int i, j, num_sccs, num_sccs_no_alias; int i, j, k, num_sccs, num_sccs_no_alias;
/* Build partition dependence graph. */ /* Build partition dependence graph. */
graph *pg = build_partition_graph (rdg, partitions, false); graph *pg = build_partition_graph (rdg, partitions, false);
...@@ -2121,18 +2122,26 @@ break_alias_scc_partitions (struct graph *rdg, ...@@ -2121,18 +2122,26 @@ break_alias_scc_partitions (struct graph *rdg,
for (j = 0; partitions->iterate (j, &first); ++j) for (j = 0; partitions->iterate (j, &first); ++j)
if (cbdata.vertices_component[j] == i) if (cbdata.vertices_component[j] == i)
break; break;
for (++j; partitions->iterate (j, &partition); ++j) for (k = j + 1; partitions->iterate (k, &partition); ++k)
{ {
struct pg_vdata *data; struct pg_vdata *data;
if (cbdata.vertices_component[j] != i) if (cbdata.vertices_component[k] != i)
continue; continue;
/* Update postorder number so that merged reduction partition is
sorted after other partitions. */
if (!partition_reduction_p (first)
&& partition_reduction_p (partition))
{
gcc_assert (pg->vertices[k].post < pg->vertices[j].post);
pg->vertices[j].post = pg->vertices[k].post;
}
partition_merge_into (NULL, first, partition, FUSE_SAME_SCC); partition_merge_into (NULL, first, partition, FUSE_SAME_SCC);
(*partitions)[j] = NULL; (*partitions)[k] = NULL;
partition_free (partition); partition_free (partition);
data = (struct pg_vdata *)pg->vertices[j].data; data = (struct pg_vdata *)pg->vertices[k].data;
gcc_assert (data->id == j); gcc_assert (data->id == k);
data->partition = NULL; data->partition = NULL;
} }
} }
......
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