mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-06-12 13:38:21 +00:00
Fix inlining to not produce duplicate landingpad clauses
Before this change, inlining one "invoke" into an outer "invoke" call site can lead to the outer landingpad's catch/filter clauses being copied multiple times into the resulting landingpad. This happens: * when the inlined function contains multiple "resume" instructions, because forwardResume() copies the clauses but is called multiple times; * when the inlined function contains a "resume" and a "call", because HandleCallsInBlockInlinedThroughInvoke() copies the clauses but is redundant with forwardResume(). Fix this by deduplicating the code. This problem doesn't lead to any incorrect execution; it's only untidy. This change will make fixing PR17872 a little easier. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@196710 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
@ -144,7 +144,6 @@ BasicBlock *InvokeInliningInfo::getInnerResumeDest() {
|
||||
void InvokeInliningInfo::forwardResume(ResumeInst *RI,
|
||||
SmallPtrSet<LandingPadInst*, 16> &InlinedLPads) {
|
||||
BasicBlock *Dest = getInnerResumeDest();
|
||||
LandingPadInst *OuterLPad = getLandingPadInst();
|
||||
BasicBlock *Src = RI->getParent();
|
||||
|
||||
BranchInst::Create(Dest, Src);
|
||||
@ -155,16 +154,6 @@ void InvokeInliningInfo::forwardResume(ResumeInst *RI,
|
||||
|
||||
InnerEHValuesPHI->addIncoming(RI->getOperand(0), Src);
|
||||
RI->eraseFromParent();
|
||||
|
||||
// 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)
|
||||
InlinedLPad->addClause(OuterLPad->getClause(OuterIdx));
|
||||
}
|
||||
}
|
||||
|
||||
/// HandleCallsInBlockInlinedThroughInvoke - When we inline a basic block into
|
||||
@ -174,18 +163,9 @@ void InvokeInliningInfo::forwardResume(ResumeInst *RI,
|
||||
/// nodes in that block with the values specified in InvokeDestPHIValues.
|
||||
static void HandleCallsInBlockInlinedThroughInvoke(BasicBlock *BB,
|
||||
InvokeInliningInfo &Invoke) {
|
||||
LandingPadInst *LPI = Invoke.getLandingPadInst();
|
||||
|
||||
for (BasicBlock::iterator BBI = BB->begin(), E = BB->end(); BBI != E; ) {
|
||||
Instruction *I = BBI++;
|
||||
|
||||
if (LandingPadInst *L = dyn_cast<LandingPadInst>(I)) {
|
||||
unsigned NumClauses = LPI->getNumClauses();
|
||||
L->reserveClauses(NumClauses);
|
||||
for (unsigned i = 0; i != NumClauses; ++i)
|
||||
L->addClause(LPI->getClause(i));
|
||||
}
|
||||
|
||||
// We only need to check for function calls: inlined invoke
|
||||
// instructions require no special handling.
|
||||
CallInst *CI = dyn_cast<CallInst>(I);
|
||||
@ -248,6 +228,18 @@ static void HandleInlinedInvoke(InvokeInst *II, BasicBlock *FirstNewBlock,
|
||||
if (InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator()))
|
||||
InlinedLPads.insert(II->getLandingPadInst());
|
||||
|
||||
// Append the clauses from the outer landing pad instruction into the inlined
|
||||
// landing pad instructions.
|
||||
LandingPadInst *OuterLPad = Invoke.getLandingPadInst();
|
||||
for (SmallPtrSet<LandingPadInst*, 16>::iterator I = InlinedLPads.begin(),
|
||||
E = InlinedLPads.end(); I != E; ++I) {
|
||||
LandingPadInst *InlinedLPad = *I;
|
||||
unsigned OuterNum = OuterLPad->getNumClauses();
|
||||
InlinedLPad->reserveClauses(OuterNum);
|
||||
for (unsigned OuterIdx = 0; OuterIdx != OuterNum; ++OuterIdx)
|
||||
InlinedLPad->addClause(OuterLPad->getClause(OuterIdx));
|
||||
}
|
||||
|
||||
for (Function::iterator BB = FirstNewBlock, E = Caller->end(); BB != E; ++BB){
|
||||
if (InlinedCodeInfo.ContainsCalls)
|
||||
HandleCallsInBlockInlinedThroughInvoke(BB, Invoke);
|
||||
|
Reference in New Issue
Block a user