Don't remove a landing pad if the invoke requires a table entry.

An invoke may require a table entry. For instance, when the function it calls
is expected to throw.
<rdar://problem/13360379>


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@176827 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling
2013-03-11 20:53:00 +00:00
parent fd49dac48f
commit d5bb20805e
2 changed files with 94 additions and 3 deletions

View File

@ -2789,9 +2789,20 @@ bool SimplifyCFGOpt::SimplifyResume(ResumeInst *RI, IRBuilder<> &Builder) {
return false;
// Turn all invokes that unwind here into calls and delete the basic block.
bool InvokeRequiresTableEntry = false;
bool Changed = false;
for (pred_iterator PI = pred_begin(BB), PE = pred_end(BB); PI != PE;) {
InvokeInst *II = cast<InvokeInst>((*PI++)->getTerminator());
if (II->hasFnAttr(Attribute::UWTable)) {
// Don't remove an `invoke' instruction if the ABI requires an entry into
// the table.
InvokeRequiresTableEntry = true;
continue;
}
SmallVector<Value*, 8> Args(II->op_begin(), II->op_end() - 3);
// Insert a call instruction before the invoke.
CallInst *Call = CallInst::Create(II->getCalledValue(), Args, "", II);
Call->takeName(II);
@ -2811,11 +2822,14 @@ bool SimplifyCFGOpt::SimplifyResume(ResumeInst *RI, IRBuilder<> &Builder) {
// Finally, delete the invoke instruction!
II->eraseFromParent();
Changed = true;
}
// The landingpad is now unreachable. Zap it.
BB->eraseFromParent();
return true;
if (!InvokeRequiresTableEntry)
// The landingpad is now unreachable. Zap it.
BB->eraseFromParent();
return Changed;
}
bool SimplifyCFGOpt::SimplifyReturn(ReturnInst *RI, IRBuilder<> &Builder) {