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.
Bootstrapped and tested on x86_64-unknown-linux-gnu, pushed. 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 | 20 ++++++++++++++++++++ gcc/tree-ssa-loop-im.cc | 2 ++ 2 files changed, 22 insertions(+) create mode 100644 gcc/testsuite/gcc.dg/torture/pr116079.c diff --git a/gcc/testsuite/gcc.dg/torture/pr116079.c b/gcc/testsuite/gcc.dg/torture/pr116079.c new file mode 100644 index 00000000000..e9120969d91 --- /dev/null +++ b/gcc/testsuite/gcc.dg/torture/pr116079.c @@ -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; + } + } + } +} diff --git a/gcc/tree-ssa-loop-im.cc b/gcc/tree-ssa-loop-im.cc index c53efbb8d59..ccc56dc42f6 100644 --- a/gcc/tree-ssa-loop-im.cc +++ b/gcc/tree-ssa-loop-im.cc @@ -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); } -- 2.43.0