Index: llvm/trunk/include/llvm/CodeGen/WasmEHFuncInfo.h =================================================================== --- llvm/trunk/include/llvm/CodeGen/WasmEHFuncInfo.h +++ llvm/trunk/include/llvm/CodeGen/WasmEHFuncInfo.h @@ -28,10 +28,6 @@ // When there is an entry , if an exception is not caught by A, it // should next unwind to the EH pad B. DenseMap EHPadUnwindMap; - // For entry , A is a BB with an instruction that may throw - // (invoke/cleanupret in LLVM IR, call/rethrow in the backend) and B is an EH - // pad that A unwinds to. - DenseMap ThrowUnwindMap; // Helper functions const BasicBlock *getEHPadUnwindDest(const BasicBlock *BB) const { @@ -40,18 +36,9 @@ void setEHPadUnwindDest(const BasicBlock *BB, const BasicBlock *Dest) { EHPadUnwindMap[BB] = Dest; } - const BasicBlock *getThrowUnwindDest(BasicBlock *BB) const { - return ThrowUnwindMap.lookup(BB).get(); - } - void setThrowUnwindDest(const BasicBlock *BB, const BasicBlock *Dest) { - ThrowUnwindMap[BB] = Dest; - } bool hasEHPadUnwindDest(const BasicBlock *BB) const { return EHPadUnwindMap.count(BB); } - bool hasThrowUnwindDest(const BasicBlock *BB) const { - return ThrowUnwindMap.count(BB); - } MachineBasicBlock *getEHPadUnwindDest(MachineBasicBlock *MBB) const { return EHPadUnwindMap.lookup(MBB).get(); @@ -59,18 +46,9 @@ void setEHPadUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) { EHPadUnwindMap[MBB] = Dest; } - MachineBasicBlock *getThrowUnwindDest(MachineBasicBlock *MBB) const { - return ThrowUnwindMap.lookup(MBB).get(); - } - void setThrowUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) { - ThrowUnwindMap[MBB] = Dest; - } bool hasEHPadUnwindDest(MachineBasicBlock *MBB) const { return EHPadUnwindMap.count(MBB); } - bool hasThrowUnwindDest(MachineBasicBlock *MBB) const { - return ThrowUnwindMap.count(MBB); - } }; // Analyze the IR in the given function to build WasmEHFuncInfo. Index: llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -321,13 +321,6 @@ NewMap[MBBMap[Src]] = MBBMap[Dst]; } EHInfo.EHPadUnwindMap = std::move(NewMap); - NewMap.clear(); - for (auto &KV : EHInfo.ThrowUnwindMap) { - const auto *Src = KV.first.get(); - const auto *Dst = KV.second.get(); - NewMap[MBBMap[Src]] = MBBMap[Dst]; - } - EHInfo.ThrowUnwindMap = std::move(NewMap); } } Index: llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp =================================================================== --- llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ llvm/trunk/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1684,6 +1684,8 @@ if (IsWasmCXX) { findWasmUnwindDestinations(FuncInfo, EHPadBB, Prob, UnwindDests); + assert(UnwindDests.size() <= 1 && + "There should be at most one unwind destination for wasm"); return; } Index: llvm/trunk/lib/CodeGen/WasmEHPrepare.cpp =================================================================== --- llvm/trunk/lib/CodeGen/WasmEHPrepare.cpp +++ llvm/trunk/lib/CodeGen/WasmEHPrepare.cpp @@ -376,22 +376,4 @@ EHInfo.setEHPadUnwindDest(&BB, UnwindBB); } } - - // Record the unwind destination for invoke and cleanupret instructions. - for (const auto &BB : *F) { - const Instruction *TI = BB.getTerminator(); - BasicBlock *UnwindBB = nullptr; - if (const auto *Invoke = dyn_cast(TI)) - UnwindBB = Invoke->getUnwindDest(); - else if (const auto *CleanupRet = dyn_cast(TI)) - UnwindBB = CleanupRet->getUnwindDest(); - if (!UnwindBB) - continue; - const Instruction *UnwindPad = UnwindBB->getFirstNonPHI(); - if (const auto *CatchSwitch = dyn_cast(UnwindPad)) - // Currently there should be only one handler per a catchswitch. - EHInfo.setThrowUnwindDest(&BB, *CatchSwitch->handlers().begin()); - else // cleanuppad - EHInfo.setThrowUnwindDest(&BB, UnwindBB); - } } Index: llvm/trunk/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp =================================================================== --- llvm/trunk/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp +++ llvm/trunk/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp @@ -330,7 +330,7 @@ } else { BuildMI(ElseMBB, DL, TII.get(WebAssembly::RETHROW)); if (EHInfo->hasEHPadUnwindDest(EHPad)) - EHInfo->setThrowUnwindDest(ElseMBB, EHInfo->getEHPadUnwindDest(EHPad)); + ElseMBB->addSuccessor(EHInfo->getEHPadUnwindDest(EHPad)); } } Index: llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll =================================================================== --- llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll +++ llvm/trunk/test/CodeGen/WebAssembly/cfg-stackify-eh.ll @@ -105,7 +105,7 @@ ; CHECK: i32.call $drop=, __cxa_begin_catch ; CHECK: try ; CHECK: call foo -; CHECK: br 2 # 2: down to label10 +; CHECK: br 2 # 2: down to label9 ; CHECK: catch ; CHECK: call __cxa_end_catch ; CHECK: rethrow # down to catch3 @@ -116,7 +116,7 @@ ; CHECK: catch {{.*}} # catch3: ; CHECK: call __cxa_end_catch ; CHECK: rethrow # to caller -; CHECK: end_try # label10: +; CHECK: end_try # label9: ; CHECK: call __cxa_end_catch ; CHECK: br 2 # 2: down to label6 ; CHECK: end_try