+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
 
+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.
 
--- /dev/null
+/* 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"} } */
 
   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;
       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)
 
                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.  */