diff options
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 7 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/tree-ssa/pr94125.c | 41 | ||||
-rw-r--r-- | gcc/tree-loop-distribution.c | 13 |
4 files changed, 58 insertions, 8 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 6718f71..53c9622 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,10 @@ +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 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index f79f1c7..ab04066 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +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 diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94125.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94125.c new file mode 100644 index 0000000..c339e51 --- /dev/null +++ b/gcc/testsuite/gcc.dg/tree-ssa/pr94125.c @@ -0,0 +1,41 @@ +/* { 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; +} diff --git a/gcc/tree-loop-distribution.c b/gcc/tree-loop-distribution.c index 35d3821..4442321 100644 --- a/gcc/tree-loop-distribution.c +++ b/gcc/tree-loop-distribution.c @@ -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); |