diff options
-rw-r--r-- | llvm/include/llvm/CodeGen/WasmEHFuncInfo.h | 22 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp | 7 | ||||
-rw-r--r-- | llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp | 2 | ||||
-rw-r--r-- | llvm/lib/CodeGen/WasmEHPrepare.cpp | 18 | ||||
-rw-r--r-- | llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp | 2 | ||||
-rw-r--r-- | llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll | 4 |
6 files changed, 5 insertions, 50 deletions
diff --git a/llvm/include/llvm/CodeGen/WasmEHFuncInfo.h b/llvm/include/llvm/CodeGen/WasmEHFuncInfo.h index aaca8474349..887a1467b3e 100644 --- a/llvm/include/llvm/CodeGen/WasmEHFuncInfo.h +++ b/llvm/include/llvm/CodeGen/WasmEHFuncInfo.h @@ -28,10 +28,6 @@ struct WasmEHFuncInfo { // When there is an entry <A, B>, if an exception is not caught by A, it // should next unwind to the EH pad B. DenseMap<BBOrMBB, BBOrMBB> EHPadUnwindMap; - // For entry <A, B>, 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<BBOrMBB, BBOrMBB> ThrowUnwindMap; // Helper functions const BasicBlock *getEHPadUnwindDest(const BasicBlock *BB) const { @@ -40,18 +36,9 @@ struct WasmEHFuncInfo { void setEHPadUnwindDest(const BasicBlock *BB, const BasicBlock *Dest) { EHPadUnwindMap[BB] = Dest; } - const BasicBlock *getThrowUnwindDest(BasicBlock *BB) const { - return ThrowUnwindMap.lookup(BB).get<const BasicBlock *>(); - } - 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<MachineBasicBlock *>(); @@ -59,18 +46,9 @@ struct WasmEHFuncInfo { void setEHPadUnwindDest(MachineBasicBlock *MBB, MachineBasicBlock *Dest) { EHPadUnwindMap[MBB] = Dest; } - MachineBasicBlock *getThrowUnwindDest(MachineBasicBlock *MBB) const { - return ThrowUnwindMap.lookup(MBB).get<MachineBasicBlock *>(); - } - 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. diff --git a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp index de4252aebdf..ee2ca90e5d9 100644 --- a/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/FunctionLoweringInfo.cpp @@ -321,13 +321,6 @@ void FunctionLoweringInfo::set(const Function &fn, MachineFunction &mf, NewMap[MBBMap[Src]] = MBBMap[Dst]; } EHInfo.EHPadUnwindMap = std::move(NewMap); - NewMap.clear(); - for (auto &KV : EHInfo.ThrowUnwindMap) { - const auto *Src = KV.first.get<const BasicBlock *>(); - const auto *Dst = KV.second.get<const BasicBlock *>(); - NewMap[MBBMap[Src]] = MBBMap[Dst]; - } - EHInfo.ThrowUnwindMap = std::move(NewMap); } } diff --git a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp index f57b86835d2..33921a2c56d 100644 --- a/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp +++ b/llvm/lib/CodeGen/SelectionDAG/SelectionDAGBuilder.cpp @@ -1684,6 +1684,8 @@ static void findUnwindDestinations( if (IsWasmCXX) { findWasmUnwindDestinations(FuncInfo, EHPadBB, Prob, UnwindDests); + assert(UnwindDests.size() <= 1 && + "There should be at most one unwind destination for wasm"); return; } diff --git a/llvm/lib/CodeGen/WasmEHPrepare.cpp b/llvm/lib/CodeGen/WasmEHPrepare.cpp index e9986f566c3..a58da13d9b0 100644 --- a/llvm/lib/CodeGen/WasmEHPrepare.cpp +++ b/llvm/lib/CodeGen/WasmEHPrepare.cpp @@ -376,22 +376,4 @@ void llvm::calculateWasmEHInfo(const Function *F, WasmEHFuncInfo &EHInfo) { 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<InvokeInst>(TI)) - UnwindBB = Invoke->getUnwindDest(); - else if (const auto *CleanupRet = dyn_cast<CleanupReturnInst>(TI)) - UnwindBB = CleanupRet->getUnwindDest(); - if (!UnwindBB) - continue; - const Instruction *UnwindPad = UnwindBB->getFirstNonPHI(); - if (const auto *CatchSwitch = dyn_cast<CatchSwitchInst>(UnwindPad)) - // Currently there should be only one handler per a catchswitch. - EHInfo.setThrowUnwindDest(&BB, *CatchSwitch->handlers().begin()); - else // cleanuppad - EHInfo.setThrowUnwindDest(&BB, UnwindBB); - } } diff --git a/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp b/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp index 65958e00eb3..1c4f42cc26d 100644 --- a/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp +++ b/llvm/lib/Target/WebAssembly/WebAssemblyLateEHPrepare.cpp @@ -330,7 +330,7 @@ bool WebAssemblyLateEHPrepare::addExceptionExtraction(MachineFunction &MF) { } else { BuildMI(ElseMBB, DL, TII.get(WebAssembly::RETHROW)); if (EHInfo->hasEHPadUnwindDest(EHPad)) - EHInfo->setThrowUnwindDest(ElseMBB, EHInfo->getEHPadUnwindDest(EHPad)); + ElseMBB->addSuccessor(EHInfo->getEHPadUnwindDest(EHPad)); } } diff --git a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll index ed1996f7284..01bac8e63d1 100644 --- a/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll +++ b/llvm/test/CodeGen/WebAssembly/cfg-stackify-eh.ll @@ -105,7 +105,7 @@ try.cont: ; preds = %entry, %catch, %cat ; 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 @@ try.cont: ; preds = %entry, %catch, %cat ; 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 |