Update post order number for merged SCC.
authorBin Cheng <bin.cheng@linux.alibaba.com>
Mon, 16 Mar 2020 03:09:14 +0000 (11:09 +0800)
committerBin Cheng <bin.cheng@linux.alibaba.com>
Mon, 16 Mar 2020 03:11:42 +0000 (11:11 +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.

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.

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

index 6718f712b8b2bfe3e28aadec5636dbad05b5a9bb..53c9622afa2ef35608a7458d774fc29a1b121f72 100644 (file)
@@ -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
index f79f1c7c303bb38bd4974dd4906c18a8e2949d57..ab0406656d2b3f763053dd3458db6bd4ac52af7b 100644 (file)
@@ -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 (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 35d3821bb0789e3b800c8c12a58d498b7b3d1de7..4442321533286ed78c2743532456c51229d6288b 100644 (file)
@@ -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);