mirror of
https://github.com/c64scene-ar/llvm-6502.git
synced 2024-12-14 11:32:34 +00:00
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:
parent
86953b5795
commit
8d6c0f4dee
@ -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;
|
||||||
|
@ -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());
|
||||||
|
Loading…
Reference in New Issue
Block a user