[llvm] r177757 - Add all clauses when merging the landing pads. Duplicates will be handled later on.
Bill Wendling
isanbard at gmail.com
Fri Mar 22 13:31:05 PDT 2013
Author: void
Date: Fri Mar 22 15:31:05 2013
New Revision: 177757
URL: http://llvm.org/viewvc/llvm-project?rev=177757&view=rev
Log:
Add all clauses when merging the landing pads. Duplicates will be handled later on.
Modified:
llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
Modified: llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp?rev=177757&r1=177756&r2=177757&view=diff
==============================================================================
--- llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp (original)
+++ llvm/trunk/lib/Transforms/Utils/InlineFunction.cpp Fri Mar 22 15:31:05 2013
@@ -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::getInner
/// 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(R
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(InvokeIn
// 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(InvokeIn
// 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
More information about the llvm-commits
mailing list