diff options
Diffstat (limited to 'gcc/gimple-walker.c')
-rw-r--r-- | gcc/gimple-walker.c | 25 |
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; } } |