Schedule reduction partition in the last.

If reduction partition's SCC is broken by runtime alias checks, force
a negative post order to it so that it will be scheduled in the last.

2020-07-09  Bin Cheng  <bin.cheng@linux.alibaba.com>

gcc/
	PR tree-optimization/95804
	* tree-loop-distribution.c (break_alias_scc_partitions): Force
	negative post order to reduction partition.

gcc/testsuite/
	PR tree-optimization/95804
	* gcc.dg/tree-ssa/pr95804.c: New test.
This commit is contained in:
Bin Cheng 2020-07-09 18:10:03 +08:00
parent 5acef69f9d
commit dd21b03900
2 changed files with 36 additions and 3 deletions

View File

@ -0,0 +1,18 @@
/* PR tree-optimization/95804 */
/* { dg-do compile } */
/* { dg-options "-O3" } */
int a, b, c, d, e, f;
void g() {
short *h = (short*)&d;
char *i = (char*)&b;
for (; e; e++) {
for (; f; f++) {
b = 3;
if ((c = 8) >= *i)
a = 5 ? *h : 0;
h = (short*)g;
}
i = (char*)&c;
}
}

View File

@ -2509,10 +2509,25 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
}
}
/* Restore the postorder information if it's corrupted in finding SCC
with alias dependence edges skipped. */
with alias dependence edges skipped. If reduction partition's SCC is
broken by runtime alias checks, we force a negative post order to it
making sure it will be scheduled in the last. */
if (num_sccs_no_alias > 0)
for (i = 0; i < pg->n_vertices; ++i)
pg->vertices[i].post = cbdata.vertices_post[i];
{
j = -1;
for (i = 0; i < pg->n_vertices; ++i)
{
pg->vertices[i].post = cbdata.vertices_post[i];
struct pg_vdata *data = (struct pg_vdata *)pg->vertices[i].data;
if (data->partition && partition_reduction_p (data->partition))
{
gcc_assert (j == -1);
j = i;
}
}
if (j >= 0)
pg->vertices[j].post = -1;
}
free (cbdata.vertices_component);
free (cbdata.vertices_post);