tree-optimization/97135 - fix dependence check in store-motion
authorRichard Biener <rguenther@suse.de>
Mon, 21 Sep 2020 12:04:25 +0000 (14:04 +0200)
committerRichard Biener <rguenther@suse.de>
Mon, 21 Sep 2020 12:06:36 +0000 (14:06 +0200)
The following fixes a dependence check where in the particular place
we cannot ignore self-dependences.

2020-09-21  Richard Biener  <rguenther@suse.de>

PR tree-optimization/97135
* tree-ssa-loop-im.c (sm_seq_push_down): Do not ignore
self-dependences.

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

gcc/testsuite/gcc.dg/torture/pr97135.c [new file with mode: 0644]
gcc/tree-ssa-loop-im.c

diff --git a/gcc/testsuite/gcc.dg/torture/pr97135.c b/gcc/testsuite/gcc.dg/torture/pr97135.c
new file mode 100644 (file)
index 0000000..223f4d0
--- /dev/null
@@ -0,0 +1,21 @@
+/* { dg-do run } */
+
+long long e, *d = &e;
+int a, b, c;
+
+int
+main ()
+{
+  for (; c <= 5; c++)
+    for (b = 0; b <= 5; b++)
+      {
+       for (a = 1; a <= 5; a++)
+         ;
+       *d = 0;
+       if (c)
+         break;
+      }
+  if (a != 6)
+    __builtin_abort ();
+  return 0;
+}
index f87c287d74210711ccc0fc8bb19b508824cc2ce8..139c7e76e6626cb8a9d242d63ecec0a4b3d6dba8 100644 (file)
@@ -2232,9 +2232,11 @@ sm_seq_push_down (vec<seq_entry> &seq, unsigned ptr, unsigned *at)
          || (against.second == sm_other && against.from != NULL_TREE))
        /* Found the tail of the sequence.  */
        break;
-      if (!refs_independent_p (memory_accesses.refs_list[new_cand.first],
-                              memory_accesses.refs_list[against.first],
-                              false))
+      /* We may not ignore self-dependences here.  */
+      if (new_cand.first == against.first
+         || !refs_independent_p (memory_accesses.refs_list[new_cand.first],
+                                 memory_accesses.refs_list[against.first],
+                                 false))
        /* ???  Prune new_cand from the list of refs to apply SM to.  */
        return false;
       std::swap (new_cand, against);