]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/112281 - loop distribution and zero dependence distances
authorRichard Biener <rguenther@suse.de>
Tue, 14 Nov 2023 10:37:13 +0000 (11:37 +0100)
committerRichard Biener <rguenther@suse.de>
Tue, 14 Nov 2023 12:44:56 +0000 (13:44 +0100)
We currently distribute

  for (c = 2; c; c--)
    for (e = 0; e < 2; e++) {
      d[c] = b = d[c + 1];
      d[c + 1].a = 0;
    }

in a wrong way where the inner loop zero dependence distance should
make us preserve stmt execution order.  We fail to do so since we
only look for a fully zero distance vector rather than looking at
the innermost loop distance.  This is somewhat similar to PR87022
where we instead looked at the outermost loop distance and changed
this to what we do now.  The following switches us to look at the
innermost loop distance.

PR tree-optimization/112281
* tree-loop-distribution.cc (pg_add_dependence_edges):
Preserve stmt order when the innermost loop has exact
overlap.

* gcc.dg/torture/pr112281.c: New testcase.

gcc/testsuite/gcc.dg/torture/pr112281.c [new file with mode: 0644]
gcc/tree-loop-distribution.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr112281.c b/gcc/testsuite/gcc.dg/torture/pr112281.c
new file mode 100644 (file)
index 0000000..3f0a61a
--- /dev/null
@@ -0,0 +1,19 @@
+/* { dg-do run } */
+/* { dg-additional-options "-ftree-loop-distribution" } */
+
+struct {
+  int : 8;
+  int a;
+} b, d[4] = {{0}, {0}, {0}, {5}};
+int c, e;
+int main()
+{
+  for (c = 2; c; c--)
+    for (e = 0; e < 2; e++) {
+      d[c] = b = d[c + 1];
+      d[c + 1].a = 0;
+    }
+  if (b.a != 0)
+    __builtin_abort();
+  return 0;
+}
index 8abfa992070103d522620f11b1ae9ce3e054056d..8e92af61c57f6a6f1b123fb0cf3a37b197c297db 100644 (file)
@@ -2163,9 +2163,10 @@ loop_distribution::pg_add_dependence_edges (struct graph *rdg, int dir,
                 gcc.dg/tree-ssa/pr94969.c.  */
              if (DDR_NUM_DIST_VECTS (ddr) != 1)
                this_dir = 2;
-             /* If the overlap is exact preserve stmt order.  */
-             else if (lambda_vector_zerop (DDR_DIST_VECT (ddr, 0),
-                                           DDR_NB_LOOPS (ddr)))
+             /* If the dependence distance is zero in the innermost
+                loop preserve stmt order.  */
+             else if (DDR_DIST_VECT (ddr, 0)
+                        [DDR_LOOP_NEST (ddr).length () - 1] == 0)
                ;
              /* Else as the distance vector is lexicographic positive swap
                 the dependence direction.  */