summaryrefslogtreecommitdiffstats
path: root/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
diff options
context:
space:
mode:
authorHeejin Ahn <aheejin@gmail.com>2019-02-26 04:08:49 +0000
committerHeejin Ahn <aheejin@gmail.com>2019-02-26 04:08:49 +0000
commitd2a56ac6612032e6e4446897747dc268b2b7a389 (patch)
tree3f02694f429518de1f80627bf59482b5f4a6367c /llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
parentf0d2733e5032d5238793610e51dfe62f799cc279 (diff)
downloadbcm5719-llvm-d2a56ac6612032e6e4446897747dc268b2b7a389.tar.gz
bcm5719-llvm-d2a56ac6612032e6e4446897747dc268b2b7a389.zip
[WebAssembly] Fix a bug deleting instruction in a ranged for loop
Summary: We shouldn't delete elements while iterating a ranged for loop. Reviewers: dschuff Subscribers: sbc100, jgravelle-google, sunfish, llvm-commits Tags: #llvm Differential Revision: https://reviews.llvm.org/D58519 llvm-svn: 354844
Diffstat (limited to 'llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp')
-rw-r--r--llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp8
1 files changed, 6 insertions, 2 deletions
diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
index 2962de47653..65958e00eb3 100644
--- a/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
+++ b/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp
@@ -222,18 +222,22 @@ bool WebAssemblyLateEHPrepare::addExceptionExtraction(MachineFunction &MF) {
const auto &TII = *MF.getSubtarget<WebAssemblySubtarget>().getInstrInfo();
auto *EHInfo = MF.getWasmEHFuncInfo();
SmallVector<MachineInstr *, 16> ExtractInstrs;
+ SmallVector<MachineInstr *, 8> ToDelete;
for (auto &MBB : MF) {
for (auto &MI : MBB) {
if (MI.getOpcode() == WebAssembly::EXTRACT_EXCEPTION_I32) {
if (MI.getOperand(0).isDead())
- MI.eraseFromParent();
+ ToDelete.push_back(&MI);
else
ExtractInstrs.push_back(&MI);
}
}
}
+ bool Changed = !ToDelete.empty() || !ExtractInstrs.empty();
+ for (auto *MI : ToDelete)
+ MI->eraseFromParent();
if (ExtractInstrs.empty())
- return false;
+ return Changed;
// Find terminate pads.
SmallSet<MachineBasicBlock *, 8> TerminatePads;
OpenPOWER on IntegriCloud