[SimplifyCFG] Remove redundant catchpads

Remove duplicate catchpad handlers from a catchswitch.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@256814 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
David Majnemer 2016-01-05 06:27:50 +00:00
parent 7572633c62
commit a4824774dc
2 changed files with 35 additions and 2 deletions

View File

@ -1305,8 +1305,9 @@ static bool markAliveBlocks(Function &F,
}
}
// Turn invokes that call 'nounwind' functions into ordinary calls.
if (InvokeInst *II = dyn_cast<InvokeInst>(BB->getTerminator())) {
TerminatorInst *Terminator = BB->getTerminator();
if (auto *II = dyn_cast<InvokeInst>(Terminator)) {
// Turn invokes that call 'nounwind' functions into ordinary calls.
Value *Callee = II->getCalledValue();
if (isa<ConstantPointerNull>(Callee) || isa<UndefValue>(Callee)) {
changeToUnreachable(II, true);
@ -1321,6 +1322,20 @@ static bool markAliveBlocks(Function &F,
changeToCall(II);
Changed = true;
}
} else if (auto *CatchSwitch = dyn_cast<CatchSwitchInst>(Terminator)) {
// Remove catchpads which cannot be reached.
SmallPtrSet<BasicBlock *, 4> HandlersSeen;
for (CatchSwitchInst::handler_iterator I = CatchSwitch->handler_begin(),
E = CatchSwitch->handler_end();
I != E; ++I) {
BasicBlock *HandlerBB = *I;
if (!HandlersSeen.insert(HandlerBB).second) {
CatchSwitch->removeHandler(I);
--I;
--E;
Changed = true;
}
}
}
Changed |= ConstantFoldTerminator(BB, true);

View File

@ -81,3 +81,21 @@ catch.body:
exit:
unreachable
}
; CHECK-LABEL: define void @test6()
define void @test6() personality i8* bitcast (void ()* @Personality to i8*) {
entry:
invoke void @f()
to label %exit unwind label %catch.pad
catch.pad:
%cs1 = catchswitch within none [label %catch.body, label %catch.body] unwind to caller
; CHECK: catchswitch within none [label %catch.body] unwind to caller
catch.body:
%catch = catchpad within %cs1 [i8* null, i32 0, i8* null]
catchret from %catch to label %exit
exit:
ret void
}