]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/116380 - bogus SSA update with loop distribution
authorRichard Biener <rguenther@suse.de>
Wed, 21 Aug 2024 11:56:40 +0000 (13:56 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Wed, 21 Aug 2024 12:47:53 +0000 (14:47 +0200)
When updating LC PHIs after copying loops we have to handle defs
defined outside of the loop appropriately (by not setting them to
NULL ...).  This mimics how we handle this in the SSA updating
code of the vectorizer.

PR tree-optimization/116380
* tree-loop-distribution.cc (copy_loop_before): Handle
out-of-loop defs appropriately.

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

gcc/testsuite/gcc.dg/torture/pr116380.c [new file with mode: 0644]
gcc/tree-loop-distribution.cc

diff --git a/gcc/testsuite/gcc.dg/torture/pr116380.c b/gcc/testsuite/gcc.dg/torture/pr116380.c
new file mode 100644 (file)
index 0000000..5ffd994
--- /dev/null
@@ -0,0 +1,16 @@
+/* { dg-do compile } */
+/* { dg-additional-options "-fno-tree-scev-cprop" } */
+
+int a[3], d[3], c;
+int f(int e, int b)
+{
+  for (; e < 3; e++)
+    {
+      a[0] = 0;
+      if (b)
+       c = b;
+      d[e] = 0;
+      a[e] = 0;
+    }
+  return e;
+}
index f87393ee94d662f3988b274b12a6e2da4a4ab479..10f261a8769bcfcc83612cafcb976da9a25ba799 100644 (file)
@@ -980,6 +980,9 @@ copy_loop_before (class loop *loop, bool redirect_lc_phi_defs)
          if (TREE_CODE (USE_FROM_PTR (use_p)) == SSA_NAME)
            {
              tree new_def = get_current_def (USE_FROM_PTR (use_p));
+             if (!new_def)
+               /* Something defined outside of the loop.  */
+               continue;
              SET_USE (use_p, new_def);
            }
        }