tree-optimization/112281 - loop distribution and zero dependence distances

Message ID 20231114115933.833533857342@sourceware.org
State Accepted
Headers
Series tree-optimization/112281 - loop distribution and zero dependence distances |

Checks

Context Check Description
snail/gcc-patch-check success Github commit url

Commit Message

Richard Biener Nov. 14, 2023, 11:59 a.m. UTC
  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.

Bootstrapped and tested on x86_64-unknown-linux-gnu.  I'm
double-checking because of the very high number of FAILs currently.

Richard.

	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 | 19 +++++++++++++++++++
 gcc/tree-loop-distribution.cc           |  7 ++++---
 2 files changed, 23 insertions(+), 3 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr112281.c
  

Patch

diff --git a/gcc/testsuite/gcc.dg/torture/pr112281.c b/gcc/testsuite/gcc.dg/torture/pr112281.c
new file mode 100644
index 00000000000..3f0a61a9376
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr112281.c
@@ -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;
+}
diff --git a/gcc/tree-loop-distribution.cc b/gcc/tree-loop-distribution.cc
index 8abfa992070..8e92af61c57 100644
--- a/gcc/tree-loop-distribution.cc
+++ b/gcc/tree-loop-distribution.cc
@@ -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.  */