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> 2020-03-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89229 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> 2020-03-15 H.J. Lu <hongjiu.lu@intel.com>
PR target/89229 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, ...@@ -2489,14 +2489,11 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
if (cbdata.vertices_component[k] != i) if (cbdata.vertices_component[k] != i)
continue; continue;
/* Update postorder number so that merged reduction partition is /* Update to the minimal postordeer number of vertices in scc so
sorted after other partitions. */ that merged partition is sorted correctly against others. */
if (!partition_reduction_p (first) if (pg->vertices[j].post > pg->vertices[k].post)
&& partition_reduction_p (partition)) pg->vertices[j].post = pg->vertices[k].post;
{
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)[k] = NULL; (*partitions)[k] = NULL;
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