mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2025-01-30 04:35:00 +00:00
Fix quadratic behavior in InlineFunction by fetching the personality function of the callee once and not for every invoke in the caller.
The callee is usually smaller than the caller, too. This reduces the compile time of ARMDisassembler.cpp by 32% (Release build). It still takes ages to compile though. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@145690 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
94f2dc90a5
commit
30fe1ae20d
@ -924,37 +924,41 @@ bool llvm::InlineFunction(CallSite CS, InlineFunctionInfo &IFI) {
|
|||||||
return false;
|
return false;
|
||||||
}
|
}
|
||||||
|
|
||||||
// Find the personality function used by the landing pads of the caller. If it
|
// Get the personality function from the callee if it contains a landing pad.
|
||||||
// exists, then check to see that it matches the personality function used in
|
Value *CalleePersonality = 0;
|
||||||
// the callee.
|
for (Function::const_iterator I = CalledFunc->begin(), E = CalledFunc->end();
|
||||||
for (Function::const_iterator
|
I != E; ++I)
|
||||||
I = Caller->begin(), E = Caller->end(); I != E; ++I)
|
|
||||||
if (const InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator())) {
|
|
||||||
const BasicBlock *BB = II->getUnwindDest();
|
|
||||||
// FIXME: This 'isa' here should become go away once the new EH system is
|
|
||||||
// in place.
|
|
||||||
if (!isa<LandingPadInst>(BB->getFirstNonPHI()))
|
|
||||||
continue;
|
|
||||||
const LandingPadInst *LP = cast<LandingPadInst>(BB->getFirstNonPHI());
|
|
||||||
const Value *CallerPersFn = LP->getPersonalityFn();
|
|
||||||
|
|
||||||
// If the personality functions match, then we can perform the
|
|
||||||
// inlining. Otherwise, we can't inline.
|
|
||||||
// TODO: This isn't 100% true. Some personality functions are proper
|
|
||||||
// supersets of others and can be used in place of the other.
|
|
||||||
for (Function::const_iterator
|
|
||||||
I = CalledFunc->begin(), E = CalledFunc->end(); I != E; ++I)
|
|
||||||
if (const InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator())) {
|
if (const InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator())) {
|
||||||
const BasicBlock *BB = II->getUnwindDest();
|
const BasicBlock *BB = II->getUnwindDest();
|
||||||
// FIXME: This 'if/dyn_cast' here should become a normal 'cast' once
|
// FIXME: This 'if/dyn_cast' here should become a normal 'cast' once
|
||||||
// the new EH system is in place.
|
// the new EH system is in place.
|
||||||
if (const LandingPadInst *LP =
|
if (const LandingPadInst *LP =
|
||||||
dyn_cast<LandingPadInst>(BB->getFirstNonPHI()))
|
dyn_cast<LandingPadInst>(BB->getFirstNonPHI()))
|
||||||
if (CallerPersFn != LP->getPersonalityFn())
|
CalleePersonality = LP->getPersonalityFn();
|
||||||
return false;
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
// Find the personality function used by the landing pads of the caller. If it
|
||||||
|
// exists, then check to see that it matches the personality function used in
|
||||||
|
// the callee.
|
||||||
|
if (CalleePersonality)
|
||||||
|
for (Function::const_iterator I = Caller->begin(), E = Caller->end();
|
||||||
|
I != E; ++I)
|
||||||
|
if (const InvokeInst *II = dyn_cast<InvokeInst>(I->getTerminator())) {
|
||||||
|
const BasicBlock *BB = II->getUnwindDest();
|
||||||
|
// FIXME: This 'isa' here should become go away once the new EH system
|
||||||
|
// is in place.
|
||||||
|
if (!isa<LandingPadInst>(BB->getFirstNonPHI()))
|
||||||
|
continue;
|
||||||
|
const LandingPadInst *LP = cast<LandingPadInst>(BB->getFirstNonPHI());
|
||||||
|
|
||||||
|
// If the personality functions match, then we can perform the
|
||||||
|
// inlining. Otherwise, we can't inline.
|
||||||
|
// TODO: This isn't 100% true. Some personality functions are proper
|
||||||
|
// supersets of others and can be used in place of the other.
|
||||||
|
if (LP->getPersonalityFn() != CalleePersonality)
|
||||||
|
return false;
|
||||||
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user