mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
Factor shouldInline method out of Inliner.
- No functionality change. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@58355 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
parent
2d5a0b9e54
commit
1a99dbfe3b
@ -23,7 +23,7 @@ namespace llvm {
|
||||
class CallSite;
|
||||
|
||||
/// Inliner - This class contains all of the helper code which is used to
|
||||
/// perform the inlining operations that does not depend on the policy.
|
||||
/// perform the inlining operations that do not depend on the policy.
|
||||
///
|
||||
struct Inliner : public CallGraphSCCPass {
|
||||
explicit Inliner(void *ID);
|
||||
@ -63,6 +63,10 @@ struct Inliner : public CallGraphSCCPass {
|
||||
private:
|
||||
// InlineThreshold - Cache the value here for easy access.
|
||||
unsigned InlineThreshold;
|
||||
|
||||
/// shouldInline - Return true if the inliner should attempt to
|
||||
/// inline at the given CallSite.
|
||||
bool shouldInline(CallSite CS);
|
||||
};
|
||||
|
||||
} // End llvm namespace
|
||||
|
@ -72,6 +72,31 @@ static bool InlineCallIfPossible(CallSite CS, CallGraph &CG,
|
||||
}
|
||||
return true;
|
||||
}
|
||||
|
||||
/// shouldInline - Return true if the inliner should attempt to inline
|
||||
/// at the given CallSite.
|
||||
bool Inliner::shouldInline(CallSite CS) {
|
||||
int Cost = getInlineCost(CS);
|
||||
float FudgeFactor = getInlineFudgeFactor(CS);
|
||||
|
||||
int CurrentThreshold = InlineThreshold;
|
||||
Function *Fn = CS.getCaller();
|
||||
if (Fn && !Fn->isDeclaration()
|
||||
&& Fn->hasFnAttr(Attribute::OptimizeForSize)
|
||||
&& InlineThreshold != 50) {
|
||||
CurrentThreshold = 50;
|
||||
}
|
||||
|
||||
if (Cost >= (int)(CurrentThreshold * FudgeFactor)) {
|
||||
DOUT << " NOT Inlining: cost=" << Cost
|
||||
<< ", Call: " << *CS.getInstruction();
|
||||
return false;
|
||||
} else {
|
||||
DOUT << " Inlining: cost=" << Cost
|
||||
<< ", Call: " << *CS.getInstruction();
|
||||
return true;
|
||||
}
|
||||
}
|
||||
|
||||
bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
|
||||
CallGraph &CG = getAnalysis<CallGraph>();
|
||||
@ -136,24 +161,7 @@ bool Inliner::runOnSCC(const std::vector<CallGraphNode*> &SCC) {
|
||||
// If the policy determines that we should inline this function,
|
||||
// try to do so.
|
||||
CallSite CS = CallSites[CSi];
|
||||
int InlineCost = getInlineCost(CS);
|
||||
float FudgeFactor = getInlineFudgeFactor(CS);
|
||||
|
||||
int CurrentThreshold = InlineThreshold;
|
||||
Function *Fn = CS.getCaller();
|
||||
if (Fn && !Fn->isDeclaration()
|
||||
&& Fn->hasFnAttr(Attribute::OptimizeForSize)
|
||||
&& InlineThreshold != 50) {
|
||||
CurrentThreshold = 50;
|
||||
}
|
||||
|
||||
if (InlineCost >= (int)(CurrentThreshold * FudgeFactor)) {
|
||||
DOUT << " NOT Inlining: cost=" << InlineCost
|
||||
<< ", Call: " << *CS.getInstruction();
|
||||
} else {
|
||||
DOUT << " Inlining: cost=" << InlineCost
|
||||
<< ", Call: " << *CS.getInstruction();
|
||||
|
||||
if (shouldInline(CS)) {
|
||||
// Attempt to inline the function...
|
||||
if (InlineCallIfPossible(CS, CG, SCCFunctions,
|
||||
getAnalysis<TargetData>())) {
|
||||
|
Loading…
Reference in New Issue
Block a user