summaryrefslogtreecommitdiff
path: root/gcc/gimple-walker.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/gimple-walker.c')
-rw-r--r--gcc/gimple-walker.c25
1 files changed, 25 insertions, 0 deletions
diff --git a/gcc/gimple-walker.c b/gcc/gimple-walker.c
index c9dd51fb810..abf0cfff0cb 100644
--- a/gcc/gimple-walker.c
+++ b/gcc/gimple-walker.c
@@ -163,10 +163,35 @@ void
GimpleWalker::_walk(basic_block bb)
{
gcc_assert(bb);
+ bool first = true;
for (auto gsi = gsi_start_bb(bb); !gsi_end_p(gsi); gsi_next(&gsi))
{
gimple *stmt = gsi_stmt(gsi);
walk(stmt);
+
+ if (_deleted && !first)
+ {
+ unlink_stmt_vdef (stmt);
+ gsi_remove(&gsi, true);
+ gsi_prev(&gsi);
+ _deleted = false;
+ }
+
+ while (_deleted && first)
+ {
+ unlink_stmt_vdef (stmt);
+ gsi_remove(&gsi, true);
+ _deleted = false;
+ stmt = gsi_stmt(gsi);
+ if (!stmt) break; // we might have deleted and was end of basic block?
+ walk(stmt);
+ if (gsi_end_p(gsi)) break;
+ }
+
+ if (_deleted && gsi_end_p (gsi)) break;
+
+ first = false;
+ _deleted = false;
}
}