Schedule reduction partition in the last.
authorBin Cheng <bin.cheng@linux.alibaba.com>
Thu, 9 Jul 2020 10:10:03 +0000 (18:10 +0800)
committerBin Cheng <bin.cheng@linux.alibaba.com>
Thu, 9 Jul 2020 10:14:26 +0000 (18:14 +0800)
If reduction partition's SCC is broken by runtime alias checks, force
a negative post order to it so that it will be scheduled in the last.

2020-07-09  Bin Cheng  <bin.cheng@linux.alibaba.com>

gcc/
PR tree-optimization/95804
* tree-loop-distribution.c (break_alias_scc_partitions): Force
negative post order to reduction partition.

gcc/testsuite/
PR tree-optimization/95804
* gcc.dg/tree-ssa/pr95804.c: New test.

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

diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr95804.c b/gcc/testsuite/gcc.dg/tree-ssa/pr95804.c
new file mode 100644 (file)
index 0000000..83c0ab4
--- /dev/null
@@ -0,0 +1,18 @@
+/* PR tree-optimization/95804 */
+/* { dg-do compile } */
+/* { dg-options "-O3" } */
+
+int a, b, c, d, e, f;
+void g() {
+  short *h = (short*)&d;
+  char *i = (char*)&b;
+  for (; e; e++) {
+    for (; f; f++) {
+      b = 3;
+      if ((c = 8) >= *i)
+        a = 5 ? *h : 0;
+      h = (short*)g;
+    }
+    i = (char*)&c;
+  }
+}
index 9bc94e56a95aa84dced942efe275a7f07e31e851..888af48946f58121c0dfae46b3ff2895bbf1930d 100644 (file)
@@ -2509,10 +2509,25 @@ loop_distribution::break_alias_scc_partitions (struct graph *rdg,
            }
        }
       /* Restore the postorder information if it's corrupted in finding SCC
-        with alias dependence edges skipped.  */
+        with alias dependence edges skipped.  If reduction partition's SCC is
+        broken by runtime alias checks, we force a negative post order to it
+        making sure it will be scheduled in the last.  */
       if (num_sccs_no_alias > 0)
-       for (i = 0; i < pg->n_vertices; ++i)
-         pg->vertices[i].post = cbdata.vertices_post[i];
+       {
+         j = -1;
+         for (i = 0; i < pg->n_vertices; ++i)
+           {
+             pg->vertices[i].post = cbdata.vertices_post[i];
+             struct pg_vdata *data = (struct pg_vdata *)pg->vertices[i].data;
+             if (data->partition && partition_reduction_p (data->partition))
+               {
+                 gcc_assert (j == -1);
+                 j = i;
+               }
+           }
+         if (j >= 0)
+           pg->vertices[j].post = -1;
+       }
 
       free (cbdata.vertices_component);
       free (cbdata.vertices_post);