Commit e4e9a591 by Bin Cheng

Update post order number for merged SCC.

Function loop_distribution::break_alias_scc_partitions needs to compute
SCC with runtime alias edges skipped.  As a result, partitions could be
re-assigned larger post order number than SCC's precedent partition and
distributed before the precedent one.  This fixes the issue by updating
the merged partition to the minimal post order in SCC.

gcc/
    PR tree-optimization/94125
    * tree-loop-distribution.c
    (loop_distribution::break_alias_scc_partitions): Update post order
    number for merged scc.

gcc/testsuite/
    PR tree-optimization/94125
    * gcc.dg/tree-ssa/pr94125.c: New test.
parent 5e5ce537
2020-03-16 Bin Cheng <bin.cheng@linux.alibaba.com>
PR tree-optimization/94125
* tree-loop-distribution.c
(loop_distribution::break_alias_scc_partitions): Update post order
number for merged scc.
2020-03-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89229
......
2020-03-16 Bin Cheng <bin.cheng@linux.alibaba.com>
PR tree-optimization/94125
* gcc.dg/tree-ssa/pr94125.c: New test.
2020-03-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89229
......
/* { dg-do run } */
/* { dg-options "-O3" } */
unsigned char b, f;
short d[1][8][1], *g = &d[0][3][0];
void __attribute__((noinline)) foo ()
{
int k[256] = { 0, 0, 0, 4, 0, 0 };
for (int c = 252; c >= 0; c--)
{
b = f;
*g = k[c + 3];
k[c + 1] = 0;
}
for (int i = 0; i < 8; i++)
if (d[0][i][0] != 0)
__builtin_abort ();
}
void __attribute__((noinline)) bar ()
{
int k[256] = { 0, 0, 0, 4, 0, 0 };
k[255] = 4;
for (int c = 0; c <=252; c++)
{
b = f;
*g = k[c + 3];
k[c + 1] = 0;
}
for (int i = 0; i < 8; i++)
if ((i == 3 && d[0][i][0] != 4) || (i != 3 && d[0][i][0] != 0))
__builtin_abort ();
}
int main ()
{
foo ();
bar ();
return 0;
}
......@@ -2489,14 +2489,11 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
if (cbdata.vertices_component[k] != i)
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;
}
/* 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);
......
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