Now that the inline cost analysis is a pass, we can easily have it

depend on and use other analyses (as long as they're either immutable
passes or CGSCC passes of course -- nothing in the pass manager has been
fixed here). Leverage this to thread TargetTransformInfo down through
the inline cost analysis.

No functionality changed here, this just threads things through.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@173031 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2013-01-21 11:55:09 +00:00
parent 86953b5795
commit 8d6c0f4dee
2 changed files with 22 additions and 12 deletions

View File

@ -23,6 +23,7 @@ namespace llvm {
class CallSite; class CallSite;
class DataLayout; class DataLayout;
class Function; class Function;
class TargetTransformInfo;
namespace InlineConstants { namespace InlineConstants {
// Various magic constants used to adjust heuristics. // Various magic constants used to adjust heuristics.
@ -100,6 +101,7 @@ public:
/// \brief Cost analyzer used by inliner. /// \brief Cost analyzer used by inliner.
class InlineCostAnalysis : public CallGraphSCCPass { class InlineCostAnalysis : public CallGraphSCCPass {
const DataLayout *TD; const DataLayout *TD;
const TargetTransformInfo *TTI;
public: public:
static char ID; static char ID;

View File

@ -20,6 +20,7 @@
#include "llvm/ADT/Statistic.h" #include "llvm/ADT/Statistic.h"
#include "llvm/Analysis/ConstantFolding.h" #include "llvm/Analysis/ConstantFolding.h"
#include "llvm/Analysis/InstructionSimplify.h" #include "llvm/Analysis/InstructionSimplify.h"
#include "llvm/Analysis/TargetTransformInfo.h"
#include "llvm/IR/CallingConv.h" #include "llvm/IR/CallingConv.h"
#include "llvm/IR/DataLayout.h" #include "llvm/IR/DataLayout.h"
#include "llvm/IR/GlobalAlias.h" #include "llvm/IR/GlobalAlias.h"
@ -44,6 +45,9 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
// DataLayout if available, or null. // DataLayout if available, or null.
const DataLayout *const TD; const DataLayout *const TD;
/// The TargetTransformInfo available for this compilation.
const TargetTransformInfo &TTI;
// The called function. // The called function.
Function &F; Function &F;
@ -130,16 +134,17 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
bool visitCallSite(CallSite CS); bool visitCallSite(CallSite CS);
public: public:
CallAnalyzer(const DataLayout *TD, Function &Callee, int Threshold) CallAnalyzer(const DataLayout *TD, const TargetTransformInfo &TTI,
: TD(TD), F(Callee), Threshold(Threshold), Cost(0), Function &Callee, int Threshold)
: TD(TD), TTI(TTI), F(Callee), Threshold(Threshold), Cost(0),
IsCallerRecursive(false), IsRecursiveCall(false), IsCallerRecursive(false), IsRecursiveCall(false),
ExposesReturnsTwice(false), HasDynamicAlloca(false), ContainsNoDuplicateCall(false), ExposesReturnsTwice(false), HasDynamicAlloca(false),
AllocatedSize(0), NumInstructions(0), NumVectorInstructions(0), ContainsNoDuplicateCall(false), AllocatedSize(0), NumInstructions(0),
FiftyPercentVectorBonus(0), TenPercentVectorBonus(0), VectorBonus(0), NumVectorInstructions(0), FiftyPercentVectorBonus(0),
NumConstantArgs(0), NumConstantOffsetPtrArgs(0), NumAllocaArgs(0), TenPercentVectorBonus(0), VectorBonus(0), NumConstantArgs(0),
NumConstantPtrCmps(0), NumConstantPtrDiffs(0), NumConstantOffsetPtrArgs(0), NumAllocaArgs(0), NumConstantPtrCmps(0),
NumInstructionsSimplified(0), SROACostSavings(0), SROACostSavingsLost(0) { NumConstantPtrDiffs(0), NumInstructionsSimplified(0),
} SROACostSavings(0), SROACostSavingsLost(0) {}
bool analyzeCall(CallSite CS); bool analyzeCall(CallSite CS);
@ -764,7 +769,7 @@ bool CallAnalyzer::visitCallSite(CallSite CS) {
// during devirtualization and so we want to give it a hefty bonus for // during devirtualization and so we want to give it a hefty bonus for
// inlining, but cap that bonus in the event that inlining wouldn't pan // inlining, but cap that bonus in the event that inlining wouldn't pan
// out. Pretend to inline the function, with a custom threshold. // out. Pretend to inline the function, with a custom threshold.
CallAnalyzer CA(TD, *F, InlineConstants::IndirectCallThreshold); CallAnalyzer CA(TD, TTI, *F, InlineConstants::IndirectCallThreshold);
if (CA.analyzeCall(CS)) { if (CA.analyzeCall(CS)) {
// We were able to inline the indirect call! Subtract the cost from the // We were able to inline the indirect call! Subtract the cost from the
// bonus we want to apply, but don't go below zero. // bonus we want to apply, but don't go below zero.
@ -1134,6 +1139,7 @@ void CallAnalyzer::dump() {
INITIALIZE_PASS_BEGIN(InlineCostAnalysis, "inline-cost", "Inline Cost Analysis", INITIALIZE_PASS_BEGIN(InlineCostAnalysis, "inline-cost", "Inline Cost Analysis",
true, true) true, true)
INITIALIZE_AG_DEPENDENCY(TargetTransformInfo)
INITIALIZE_PASS_END(InlineCostAnalysis, "inline-cost", "Inline Cost Analysis", INITIALIZE_PASS_END(InlineCostAnalysis, "inline-cost", "Inline Cost Analysis",
true, true) true, true)
@ -1145,11 +1151,13 @@ InlineCostAnalysis::~InlineCostAnalysis() {}
void InlineCostAnalysis::getAnalysisUsage(AnalysisUsage &AU) const { void InlineCostAnalysis::getAnalysisUsage(AnalysisUsage &AU) const {
AU.setPreservesAll(); AU.setPreservesAll();
AU.addRequired<TargetTransformInfo>();
CallGraphSCCPass::getAnalysisUsage(AU); CallGraphSCCPass::getAnalysisUsage(AU);
} }
bool InlineCostAnalysis::runOnSCC(CallGraphSCC &SCC) { bool InlineCostAnalysis::runOnSCC(CallGraphSCC &SCC) {
TD = getAnalysisIfAvailable<DataLayout>(); TD = getAnalysisIfAvailable<DataLayout>();
TTI = &getAnalysis<TargetTransformInfo>();
return false; return false;
} }
@ -1184,7 +1192,7 @@ InlineCost InlineCostAnalysis::getInlineCost(CallSite CS, Function *Callee,
DEBUG(llvm::dbgs() << " Analyzing call of " << Callee->getName() DEBUG(llvm::dbgs() << " Analyzing call of " << Callee->getName()
<< "...\n"); << "...\n");
CallAnalyzer CA(TD, *Callee, Threshold); CallAnalyzer CA(TD, *TTI, *Callee, Threshold);
bool ShouldInline = CA.analyzeCall(CS); bool ShouldInline = CA.analyzeCall(CS);
DEBUG(CA.dump()); DEBUG(CA.dump());