This fixes recording of distance vectors in case the DDR has just
constant equal indexes.  In that case we expect distance vectors
with zero distances to be recorded which is what was done when
any distance was computed for affine indexes.

Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed.

2021-06-11  Richard Biener  <rguent...@suse.de>

        PR middle-end/101009
        * tree-data-ref.c (build_classic_dist_vector_1): Make sure
        to set *init_b to true when we encounter a constant equal
        index pair.
        (compute_affine_dependence): Also dump the actual DR_REF.

        * gcc.dg/torture/pr101009.c: New testcase.
---
 gcc/testsuite/gcc.dg/torture/pr101009.c | 17 +++++++++++++++++
 gcc/tree-data-ref.c                     | 10 ++++++++--
 2 files changed, 25 insertions(+), 2 deletions(-)
 create mode 100644 gcc/testsuite/gcc.dg/torture/pr101009.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr101009.c 
b/gcc/testsuite/gcc.dg/torture/pr101009.c
new file mode 100644
index 00000000000..2bbed1dfc2c
--- /dev/null
+++ b/gcc/testsuite/gcc.dg/torture/pr101009.c
@@ -0,0 +1,17 @@
+/* { dg-do run } */
+/* { dg-additional-options "-fno-tree-sra -fno-tree-pre 
-ftree-loop-distribution" } */
+
+struct a {
+  unsigned b;
+  unsigned c;
+} e, *f = &e;
+int d = 1;
+int main() {
+  for (; d; d--) {
+    struct a g[] = {{2, 1}, {2, 1}};
+    *f = g[1];
+  }
+  if (e.c != 1)
+    __builtin_abort ();
+  return 0;
+}
diff --git a/gcc/tree-data-ref.c b/gcc/tree-data-ref.c
index b1f64684840..b37c234aea8 100644
--- a/gcc/tree-data-ref.c
+++ b/gcc/tree-data-ref.c
@@ -5121,6 +5121,8 @@ build_classic_dist_vector_1 (struct 
data_dependence_relation *ddr,
          non_affine_dependence_relation (ddr);
          return false;
        }
+      else
+       *init_b = true;
     }
 
   return true;
@@ -5616,9 +5618,13 @@ compute_affine_dependence (struct 
data_dependence_relation *ddr,
   if (dump_file && (dump_flags & TDF_DETAILS))
     {
       fprintf (dump_file, "(compute_affine_dependence\n");
-      fprintf (dump_file, "  stmt_a: ");
+      fprintf (dump_file, "  ref_a: ");
+      print_generic_expr (dump_file, DR_REF (dra));
+      fprintf (dump_file, ", stmt_a: ");
       print_gimple_stmt (dump_file, DR_STMT (dra), 0, TDF_SLIM);
-      fprintf (dump_file, "  stmt_b: ");
+      fprintf (dump_file, "  ref_b: ");
+      print_generic_expr (dump_file, DR_REF (drb));
+      fprintf (dump_file, ", stmt_b: ");
       print_gimple_stmt (dump_file, DR_STMT (drb), 0, TDF_SLIM);
     }
 
-- 
2.26.2

Reply via email to