summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorBill Wendling <isanbard@gmail.com>2013-03-22 20:31:05 +0000
committerBill Wendling <isanbard@gmail.com>2013-03-22 20:31:05 +0000
commit4c6250247053810d44119d2e34eb4f07ba56d035 (patch)
tree9b76798bfd6effc93f737df1f7ab033a2eaae621
parent8faed2745c849fb35f6edf411263dfa564ef3643 (diff)
downloadllvm-4c6250247053810d44119d2e34eb4f07ba56d035.tar.gz
llvm-4c6250247053810d44119d2e34eb4f07ba56d035.tar.bz2
llvm-4c6250247053810d44119d2e34eb4f07ba56d035.tar.xz
Add all clauses when merging the landing pads. Duplicates will be handled later on.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@177757 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r--lib/Transforms/Utils/InlineFunction.cpp38
1 files changed, 14 insertions, 24 deletions
diff --git a/lib/Transforms/Utils/InlineFunction.cpp b/lib/Transforms/Utils/InlineFunction.cpp
index 62f101f1e2..e9828d60cd 100644
--- a/lib/Transforms/Utils/InlineFunction.cpp
+++ b/lib/Transforms/Utils/InlineFunction.cpp
@@ -82,7 +82,8 @@ namespace {
/// a simple branch. When there is more than one predecessor, we need to
/// split the landing pad block after the landingpad instruction and jump
/// to there.
- void forwardResume(ResumeInst *RI, BasicBlock *FirstNewBlock);
+ void forwardResume(ResumeInst *RI,
+ SmallPtrSet<LandingPadInst*, 16> &InlinedLPads);
/// addIncomingPHIValuesFor - Add incoming-PHI values to the unwind
/// destination block for the given basic block, using the values for the
@@ -141,7 +142,7 @@ BasicBlock *InvokeInliningInfo::getInnerResumeDest() {
/// branch. When there is more than one predecessor, we need to split the
/// landing pad block after the landingpad instruction and jump to there.
void InvokeInliningInfo::forwardResume(ResumeInst *RI,
- BasicBlock *FirstNewBlock) {
+ SmallPtrSet<LandingPadInst*, 16> &InlinedLPads) {
BasicBlock *Dest = getInnerResumeDest();
LandingPadInst *OuterLPad = getLandingPadInst();
BasicBlock *Src = RI->getParent();
@@ -155,31 +156,14 @@ void InvokeInliningInfo::forwardResume(ResumeInst *RI,
InnerEHValuesPHI->addIncoming(RI->getOperand(0), Src);
RI->eraseFromParent();
- // Get all of the inlined landing pad instructions.
- SmallPtrSet<LandingPadInst*, 16> InlinedLPads;
- Function *Caller = FirstNewBlock->getParent();
- for (Function::iterator I = FirstNewBlock, E = Caller->end(); I != E; ++I)
- if (InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator()))
- InlinedLPads.insert(II->getLandingPadInst());
-
- // Merge the catch clauses from the outer landing pad instruction into the
- // inlined landing pad instructions.
+ // Append the clauses from the outer landing pad instruction into the inlined
+ // landing pad instructions.
for (SmallPtrSet<LandingPadInst*, 16>::iterator I = InlinedLPads.begin(),
E = InlinedLPads.end(); I != E; ++I) {
LandingPadInst *InlinedLPad = *I;
for (unsigned OuterIdx = 0, OuterNum = OuterLPad->getNumClauses();
- OuterIdx != OuterNum; ++OuterIdx) {
- bool hasClause = false;
- if (OuterLPad->isFilter(OuterIdx)) continue;
- Value *OuterClause = OuterLPad->getClause(OuterIdx);
- for (unsigned Idx = 0, N = InlinedLPad->getNumClauses(); Idx != N; ++Idx)
- if (OuterClause == InlinedLPad->getClause(Idx)) {
- hasClause = true;
- break;
- }
- if (!hasClause)
- InlinedLPad->addClause(OuterClause);
- }
+ OuterIdx != OuterNum; ++OuterIdx)
+ InlinedLPad->addClause(OuterLPad->getClause(OuterIdx));
}
}
@@ -261,6 +245,12 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
// rewrite.
InvokeInliningInfo Invoke(II);
+ // Get all of the inlined landing pad instructions.
+ SmallPtrSet<LandingPadInst*, 16> InlinedLPads;
+ for (Function::iterator I = FirstNewBlock, E = Caller->end(); I != E; ++I)
+ if (InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator()))
+ InlinedLPads.insert(II->getLandingPadInst());
+
for (Function::iterator BB = FirstNewBlock, E = Caller->end(); BB != E; ++BB){
if (InlinedCodeInfo.ContainsCalls)
if (HandleCallsInBlockInlinedThroughInvoke(BB, Invoke)) {
@@ -271,7 +261,7 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
// Forward any resumes that are remaining here.
if (ResumeInst *RI = dyn_cast<ResumeInst>(BB->getTerminator()))
- Invoke.forwardResume(RI, FirstNewBlock);
+ Invoke.forwardResume(RI, InlinedLPads);
}
// Now that everything is happy, we have one final detail. The PHI nodes in