]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
backport PR94125: Update post order number for merged SCC.
authorBin Cheng <bin.cheng@linux.alibaba.com>
Tue, 24 Mar 2020 09:40:21 +0000 (17:40 +0800)
committerBin Cheng <bin.cheng@linux.alibaba.com>
Tue, 24 Mar 2020 09:40:21 +0000 (17:40 +0800)
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.

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

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

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/pr94125.c [new file with mode: 0644]
gcc/tree-loop-distribution.c

index 836833778da56c4ff384b3442195c68d30c149af..1d29aab40a5cdcc8fbff1801cb88c2c014973b5d 100644 (file)
@@ -1,3 +1,13 @@
+2020-03-24  Bin Cheng  <bin.cheng@linux.alibaba.com>
+
+       Backport from mainline
+       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-23  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        Backport from mainline
index 7483f2f85d2860610682bbe3c9c11ec1209d1098..0c2bf3567d693e92378adbbbf6841f1c3321c68b 100644 (file)
@@ -1,3 +1,11 @@
+2020-03-24  Bin Cheng  <bin.cheng@linux.alibaba.com>
+
+       Backport from mainline
+       2020-03-16  Bin Cheng  <bin.cheng@linux.alibaba.com>
+
+       PR tree-optimization/94125
+       * gcc.dg/tree-ssa/pr94125.c: New test.
+
 2020-03-23  Will Schmidt  <will_schmidt@vnet.ibm.com>
 
        Backport from mainline
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94125.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94125.c
new file mode 100644 (file)
index 0000000..c339e51
--- /dev/null
@@ -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;
+}
index c07ac0d228c1d96cba6217a3972d457ba688b817..3e9b220ffb73fcb643847db045f82aac9738f68e 100644 (file)
@@ -2364,14 +2364,11 @@ 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);