diff options
author | Alon Zakai <alonzakai@gmail.com> | 2016-04-23 18:10:05 -0700 |
---|---|---|
committer | Alon Zakai <alonzakai@gmail.com> | 2016-04-24 09:10:13 -0700 |
commit | 759bafb906ba3addc5ab470ca41455ef452f30ab (patch) | |
tree | 661114a8789425d08437182369f1d9782de40f9e /src | |
parent | 2cc2b8288f0179b8e506d420dd27fada5652e0c3 (diff) | |
download | binaryen-759bafb906ba3addc5ab470ca41455ef452f30ab.tar.gz binaryen-759bafb906ba3addc5ab470ca41455ef452f30ab.tar.bz2 binaryen-759bafb906ba3addc5ab470ca41455ef452f30ab.zip |
vacuum dead code after unconditional brs
Diffstat (limited to 'src')
-rw-r--r-- | src/passes/Vacuum.cpp | 17 |
1 files changed, 14 insertions, 3 deletions
diff --git a/src/passes/Vacuum.cpp b/src/passes/Vacuum.cpp index 863d78f14..ed868f2f9 100644 --- a/src/passes/Vacuum.cpp +++ b/src/passes/Vacuum.cpp @@ -32,14 +32,25 @@ struct Vacuum : public WalkerPass<PostWalker<Vacuum, Visitor<Vacuum>>> { int skip = 0; auto& list = curr->list; size_t size = list.size(); + bool needResize = false; for (size_t z = 0; z < size; z++) { if (list[z]->is<Nop>()) { skip++; - } else if (skip > 0) { - list[z - skip] = list[z]; + needResize = true; + } else { + if (skip > 0) { + list[z - skip] = list[z]; + } + // if this is an unconditional br, the rest is dead code + Break* br = list[z - skip]->dynCast<Break>(); + if (br && !br->condition) { + list.resize(z - skip + 1); + needResize = false; + break; + } } } - if (skip > 0) { + if (needResize) { list.resize(size - skip); } if (!curr->name.is()) { |