mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-13 04:38:24 +00:00
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:
@ -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) {
|
||||
|
Reference in New Issue
Block a user