[SjLj Prepare] When demoting an invoke instructions to the stack, if the normal

edge is critical, then split it so we can insert the store.
rdar://13126179

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@174418 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chad Rosier
2013-02-05 18:23:10 +00:00
parent e6dc59891f
commit 1e45487dfd
2 changed files with 82 additions and 5 deletions

View File

@@ -7,6 +7,7 @@
//
//===----------------------------------------------------------------------===//
#include "llvm/Transforms/Utils/BasicBlockUtils.h"
#include "llvm/Transforms/Utils/Local.h"
#include "llvm/ADT/DenseMap.h"
#include "llvm/IR/Function.h"
@@ -78,12 +79,21 @@ AllocaInst *llvm::DemoteRegToStack(Instruction &I, bool VolatileLoads,
InsertPt = &I;
++InsertPt;
} else {
// We cannot demote invoke instructions to the stack if their normal edge
// is critical.
InvokeInst &II = cast<InvokeInst>(I);
assert(II.getNormalDest()->getSinglePredecessor() &&
"Cannot demote invoke with a critical successor!");
InsertPt = II.getNormalDest()->begin();
if (II.getNormalDest()->getSinglePredecessor())
InsertPt = II.getNormalDest()->getFirstInsertionPt();
else {
// We cannot demote invoke instructions to the stack if their normal edge
// is critical. Therefore, split the critical edge and insert the store
// in the newly created basic block.
unsigned SuccNum = GetSuccessorNumber(I.getParent(), II.getNormalDest());
TerminatorInst *TI = &cast<TerminatorInst>(I);
assert (isCriticalEdge(TI, SuccNum) &&
"Expected a critical edge!");
BasicBlock *BB = SplitCriticalEdge(TI, SuccNum);
assert (BB && "Unable to split critical edge.");
InsertPt = BB->getFirstInsertionPt();
}
}
for (; isa<PHINode>(InsertPt) || isa<LandingPadInst>(InsertPt); ++InsertPt)