diff options
Diffstat (limited to 'llvm/lib/Transforms/Utils/Local.cpp')
-rw-r--r-- | llvm/lib/Transforms/Utils/Local.cpp | 18 |
1 files changed, 11 insertions, 7 deletions
diff --git a/llvm/lib/Transforms/Utils/Local.cpp b/llvm/lib/Transforms/Utils/Local.cpp index 391ed685766..cb17b603ae5 100644 --- a/llvm/lib/Transforms/Utils/Local.cpp +++ b/llvm/lib/Transforms/Utils/Local.cpp @@ -1338,19 +1338,22 @@ void llvm::removeUnwindEdge(BasicBlock *BB) { if (auto *CRI = dyn_cast<CleanupReturnInst>(TI)) { NewTI = CleanupReturnInst::Create(CRI->getCleanupPad(), nullptr, CRI); UnwindDest = CRI->getUnwindDest(); - } else if (auto *CEP = dyn_cast<CleanupEndPadInst>(TI)) { - NewTI = CleanupEndPadInst::Create(CEP->getCleanupPad(), nullptr, CEP); - UnwindDest = CEP->getUnwindDest(); - } else if (auto *CEP = dyn_cast<CatchEndPadInst>(TI)) { - NewTI = CatchEndPadInst::Create(CEP->getContext(), nullptr, CEP); - UnwindDest = CEP->getUnwindDest(); } else if (auto *TPI = dyn_cast<TerminatePadInst>(TI)) { SmallVector<Value *, 3> TerminatePadArgs; for (Value *Operand : TPI->arg_operands()) TerminatePadArgs.push_back(Operand); - NewTI = TerminatePadInst::Create(TPI->getContext(), nullptr, + NewTI = TerminatePadInst::Create(TPI->getParentPad(), nullptr, TerminatePadArgs, TPI); UnwindDest = TPI->getUnwindDest(); + } else if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(TI)) { + auto *NewCatchSwitch = CatchSwitchInst::Create( + CatchSwitch->getParentPad(), nullptr, CatchSwitch->getNumHandlers(), + CatchSwitch->getName(), CatchSwitch); + for (BasicBlock *PadBB : CatchSwitch->handlers()) + NewCatchSwitch->addHandler(PadBB); + + NewTI = NewCatchSwitch; + UnwindDest = CatchSwitch->getUnwindDest(); } else { llvm_unreachable("Could not find unwind successor"); } @@ -1358,6 +1361,7 @@ void llvm::removeUnwindEdge(BasicBlock *BB) { NewTI->takeName(TI); NewTI->setDebugLoc(TI->getDebugLoc()); UnwindDest->removePredecessor(BB); + TI->replaceAllUsesWith(NewTI); TI->eraseFromParent(); } |