Add missing unit dependence vector in data dependence analysis
authorBin Cheng <bin.cheng@linux.alibaba.com>
Wed, 13 May 2020 03:37:47 +0000 (11:37 +0800)
committerBin Cheng <bin.cheng@linux.alibaba.com>
Wed, 13 May 2020 03:37:47 +0000 (11:37 +0800)
Current data dependence analysis misses unit distant vector if DRs in
DDR have the same invariant access functions.  This adds the vector as
the constant access function case.

2020-05-13  Bin Cheng  <bin.cheng@linux.alibaba.com>
PR tree-optimization/94969

gcc/
    * tree-data-dependence.c (constant_access_functions): Rename to...
    (invariant_access_functions): ...this.  Add parameter.  Check for
    invariant access function, rather than constant.
    (build_classic_dist_vector): Call above function.
    * tree-loop-distribution.c (pg_add_dependence_edges): Add comment.

gcc/testsuite/
    * gcc.dg/tree-ssa/pr94969.c: New test.

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

index a7c8adecb9d10b3a85b7ed7b3b6ebe63da50eb0c..4234a72432c6f1c45a55b48e7b1104f7f878b798 100644 (file)
@@ -1,3 +1,12 @@
+2020-05-13  Bin Cheng  <bin.cheng@linux.alibaba.com>
+
+       PR tree-optimization/94969
+       * tree-data-dependence.c (constant_access_functions): Rename to...
+       (invariant_access_functions): ...this.  Add parameter.  Check for
+       invariant access function, rather than constant.
+       (build_classic_dist_vector): Call above function.
+       * tree-loop-distribution.c (pg_add_dependence_edges): Add comment.
+
 2020-05-13  Hongtao Liu  <hongtao.liu@intel.com>
 
        PR target/94118
index 9ad48bad03178787e3d98a77aac26fc774d73d4b..5a4215bbe46e2d84539fb3d5924978c5586b6304 100644 (file)
@@ -1,3 +1,8 @@
+2020-05-13  Bin Cheng  <bin.cheng@linux.alibaba.com>
+
+       PR tree-optimization/94969
+       * gcc.dg/tree-ssa/pr94969.c: New test.
+
 2020-05-12  Craig Blackmore  <craig.blackmore@embecosm.com>
 
        * gcc.target/riscv/shorten-memrefs-1.c: New test.
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c b/gcc/testsuite/gcc.dg/tree-ssa/pr94969.c
new file mode 100644 (file)
index 0000000..056b015
--- /dev/null
@@ -0,0 +1,28 @@
+/* PR tree-optimization/52267 */
+/* { dg-do run } */
+/* { dg-options "-O3 -fdump-tree-ldist-details" } */
+
+int a = 0, b = 0, c = 0;
+struct S {
+  signed m : 7;
+  signed e : 2;
+};
+struct S f[2] = {{0, 0}, {0, 0}};
+struct S g = {0, 0};
+
+void __attribute__((noinline))
+k()
+{
+  for (; c <= 1; c++) {
+    f[b] = g;
+    f[b].e ^= 1;
+  }
+}
+int main()
+{
+  k();
+  if (f[b].e != 1)
+    __builtin_abort ();
+}
+
+/* { dg-final { scan-tree-dump-not "ldist" "Loop 1 distributed: split to 3 loops"} } */
index 851225e117176b33dbcd5448f02569103df2d572..5505ba46778501b25862c064798e3cecc8212477 100644 (file)
@@ -4821,17 +4821,19 @@ build_classic_dist_vector_1 (struct data_dependence_relation *ddr,
   return true;
 }
 
-/* Return true when the DDR contains only constant access functions.  */
+/* Return true when the DDR contains only invariant access functions wrto. loop
+   number LNUM.  */
 
 static bool
-constant_access_functions (const struct data_dependence_relation *ddr)
+invariant_access_functions (const struct data_dependence_relation *ddr,
+                           int lnum)
 {
   unsigned i;
   subscript *sub;
 
   FOR_EACH_VEC_ELT (DDR_SUBSCRIPTS (ddr), i, sub)
-    if (!evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 0))
-       || !evolution_function_is_constant_p (SUB_ACCESS_FN (sub, 1)))
+    if (!evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 0), lnum)
+       || !evolution_function_is_invariant_p (SUB_ACCESS_FN (sub, 1), lnum))
       return false;
 
   return true;
@@ -5030,7 +5032,7 @@ build_classic_dist_vector (struct data_dependence_relation *ddr,
       dist_v = lambda_vector_new (DDR_NB_LOOPS (ddr));
       save_dist_v (ddr, dist_v);
 
-      if (constant_access_functions (ddr))
+      if (invariant_access_functions (ddr, loop_nest->num))
        add_distance_for_zero_overlaps (ddr);
 
       if (DDR_NB_LOOPS (ddr) > 1)
index 4442321533286ed78c2743532456c51229d6288b..b122c3964a093d33ce2657588186dfb79e04d7b2 100644 (file)
@@ -2080,7 +2080,8 @@ loop_distribution::pg_add_dependence_edges (struct graph *rdg, int dir,
                this_dir = -this_dir;
 
              /* Known dependences can still be unordered througout the
-                iteration space, see gcc.dg/tree-ssa/ldist-16.c.  */
+                iteration space, see gcc.dg/tree-ssa/ldist-16.c and
+                gcc.dg/tree-ssa/pr94969.c.  */
              if (DDR_NUM_DIST_VECTS (ddr) != 1)
                this_dir = 2;
              /* If the overlap is exact preserve stmt order.  */