]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
tree-optimization/116079 - store motion and clobbers
authorRichard Biener <rguenther@suse.de>
Thu, 25 Jul 2024 06:58:42 +0000 (08:58 +0200)
committerRichard Biener <rguenth@gcc.gnu.org>
Thu, 25 Jul 2024 10:44:57 +0000 (12:44 +0200)
When we move a store out of an inner loop and remove a clobber in
the process, analysis of the inner loop can run into the clobber
via the meta-data and crash when accessing its basic-block.  The
following avoids this by clearing the VDEF which is how it identifies
already processed stores.

PR tree-optimization/116079
* tree-ssa-loop-im.cc (hoist_memory_references): Clear
VDEF of elided clobbers.

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

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

diff --git a/gcc/testsuite/gcc.dg/torture/pr116079.c b/gcc/testsuite/gcc.dg/torture/pr116079.c
new file mode 100644 (file)
index 0000000..e912096
--- /dev/null
@@ -0,0 +1,20 @@
+/* { dg-do compile } */
+
+char g_132;
+int g_701, g_1189, func_24___trans_tmp_15, func_24_l_2691;
+long func_24___trans_tmp_9;
+int *func_24_l_2684;
+void func_24() {
+  for (; g_1189;) {
+    g_132 = 0;
+    for (; g_132 < 6; ++g_132) {
+      func_24___trans_tmp_9 = *func_24_l_2684 = func_24_l_2691;
+      g_701 = 4;
+      for (; g_701; g_701 -= 1) {
+        int l_2748[4];
+        int si2 = l_2748[3];
+        func_24___trans_tmp_15 = si2;
+      }
+    }
+  }
+}
index c53efbb8d5978b00d3cf095bfec2f15a640cfb57..ccc56dc42f6182fb7e9349c189e781c19a641f0d 100644 (file)
@@ -2880,6 +2880,7 @@ hoist_memory_references (class loop *loop, bitmap mem_refs,
          gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
          unlink_stmt_vdef (stmt);
          release_defs (stmt);
+         gimple_set_vdef (stmt, NULL_TREE);
          gsi_remove (&gsi, true);
        }
 
@@ -3062,6 +3063,7 @@ hoist_memory_references (class loop *loop, bitmap mem_refs,
       gimple_stmt_iterator gsi = gsi_for_stmt (stmt);
       unlink_stmt_vdef (stmt);
       release_defs (stmt);
+      gimple_set_vdef (stmt, NULL_TREE);
       gsi_remove (&gsi, true);
     }