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.

llvm-svn: 138658
This commit is contained in:
Bill Wendling 2011-08-26 21:18:55 +00:00
parent e7857867d6
commit 88b318ca91

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);
}