Split the landing pad block only if it's a critical edge. Also intelligently

split it in the other place where we're splitting critical edges.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@138658 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Bill Wendling 2011-08-26 21:18:55 +00:00
parent 2b568fb3ce
commit 51fb91c04c

View File

@ -143,7 +143,19 @@ void SjLjEHPass::markInvokeCallSite(InvokeInst *II, int InvokeNo,
// If the unwind edge has phi nodes, split the edge.
if (isa<PHINode>(II->getUnwindDest()->begin())) {
SplitCriticalEdge(II, 1, this);
// FIXME: New EH - This if-condition will be always true in the new scheme.
if (II->getUnwindDest()->isLandingPad()) {
if (isCriticalEdge(II, 1)) {
SmallVector<BasicBlock*, 2> NewBBs;
SplitLandingPadPredecessors(II->getUnwindDest(), II->getParent(),
".1", ".2", this, NewBBs);
LPadSuccMap[II] = *succ_begin(NewBBs[0]);
} else {
LPadSuccMap[II] = II->getUnwindDest();
}
} else {
SplitCriticalEdge(II, 1, this);
}
// If there are any phi nodes left, they must have a single predecessor.
while (PHINode *PN = dyn_cast<PHINode>(II->getUnwindDest()->begin())) {
@ -194,10 +206,14 @@ splitLiveRangesAcrossInvokes(SmallVector<InvokeInst*,16> &Invokes) {
// FIXME: New EH - This if-condition will be always true in the new scheme.
if (II->getUnwindDest()->isLandingPad()) {
SmallVector<BasicBlock*, 2> NewBBs;
SplitLandingPadPredecessors(II->getUnwindDest(), II->getParent(),
".1", ".2", this, NewBBs);
LPadSuccMap[II] = *succ_begin(NewBBs[0]);
if (isCriticalEdge(II, 1)) {
SmallVector<BasicBlock*, 2> NewBBs;
SplitLandingPadPredecessors(II->getUnwindDest(), II->getParent(),
".1", ".2", this, NewBBs);
LPadSuccMap[II] = *succ_begin(NewBBs[0]);
} else {
LPadSuccMap[II] = II->getUnwindDest();
}
} else {
SplitCriticalEdge(II, 1, this);
}