Rotate two of the functions used to count bonuses for the inline cost

analysis to be methods on the cost analysis's function info object
instead of the code metrics object. These really are just users of the
code metrics, they're building the information for the function's
analysis.

This is the first step of growing the amount of information we collect
about a function in order to cope with pair-wise simplifications due to
allocas.

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@152283 91177308-0d34-0410-b5e6-96231b3b80d8
This commit is contained in:
Chandler Carruth 2012-03-08 02:04:19 +00:00
parent 5fdf50065d
commit 6f130bf368
3 changed files with 22 additions and 25 deletions

View File

@ -81,21 +81,10 @@ namespace llvm {
/// to the current structure. /// to the current structure.
void analyzeFunction(Function *F, const TargetData *TD = 0); void analyzeFunction(Function *F, const TargetData *TD = 0);
/// CountCodeReductionForConstant - Figure out an approximation for how
/// many instructions will be constant folded if the specified value is
/// constant.
unsigned CountCodeReductionForConstant(Value *V);
/// CountBonusForConstant - Figure out an approximation for how much /// CountBonusForConstant - Figure out an approximation for how much
/// per-call performance boost we can expect if the specified value is /// per-call performance boost we can expect if the specified value is
/// constant. /// constant.
unsigned CountBonusForConstant(Value *V); unsigned CountBonusForConstant(Value *V);
/// CountCodeReductionForAlloca - Figure out an approximation of how much
/// smaller the function will be if it is inlined into a context where an
/// argument becomes an alloca.
///
unsigned CountCodeReductionForAlloca(Value *V);
}; };
} }

View File

@ -110,6 +110,18 @@ namespace llvm {
/// entry here. /// entry here.
std::vector<ArgInfo> ArgumentWeights; std::vector<ArgInfo> ArgumentWeights;
/// countCodeReductionForConstant - Figure out an approximation for how
/// many instructions will be constant folded if the specified value is
/// constant.
unsigned countCodeReductionForConstant(const CodeMetrics &Metrics,
Value *V);
/// countCodeReductionForAlloca - Figure out an approximation of how much
/// smaller the function will be if it is inlined into a context where an
/// argument becomes an alloca.
unsigned countCodeReductionForAlloca(const CodeMetrics &Metrics,
Value *V);
/// analyzeFunction - Add information about the specified function /// analyzeFunction - Add information about the specified function
/// to the current structure. /// to the current structure.
void analyzeFunction(Function *F, const TargetData *TD); void analyzeFunction(Function *F, const TargetData *TD);

View File

@ -162,10 +162,8 @@ void CodeMetrics::analyzeBasicBlock(const BasicBlock *BB,
NumBBInsts[BB] = NumInsts - NumInstsBeforeThisBB; NumBBInsts[BB] = NumInsts - NumInstsBeforeThisBB;
} }
// CountCodeReductionForConstant - Figure out an approximation for how many unsigned InlineCostAnalyzer::FunctionInfo::countCodeReductionForConstant(
// instructions will be constant folded if the specified value is constant. const CodeMetrics &Metrics, Value *V) {
//
unsigned CodeMetrics::CountCodeReductionForConstant(Value *V) {
unsigned Reduction = 0; unsigned Reduction = 0;
for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){ for (Value::use_iterator UI = V->use_begin(), E = V->use_end(); UI != E;++UI){
User *U = *UI; User *U = *UI;
@ -175,7 +173,7 @@ unsigned CodeMetrics::CountCodeReductionForConstant(Value *V) {
const unsigned NumSucc = TI.getNumSuccessors(); const unsigned NumSucc = TI.getNumSuccessors();
unsigned Instrs = 0; unsigned Instrs = 0;
for (unsigned I = 0; I != NumSucc; ++I) for (unsigned I = 0; I != NumSucc; ++I)
Instrs += NumBBInsts[TI.getSuccessor(I)]; Instrs += Metrics.NumBBInsts.lookup(TI.getSuccessor(I));
// We don't know which blocks will be eliminated, so use the average size. // We don't know which blocks will be eliminated, so use the average size.
Reduction += InlineConstants::InstrCost*Instrs*(NumSucc-1)/NumSucc; Reduction += InlineConstants::InstrCost*Instrs*(NumSucc-1)/NumSucc;
} else { } else {
@ -207,18 +205,15 @@ unsigned CodeMetrics::CountCodeReductionForConstant(Value *V) {
// And any other instructions that use it which become constants // And any other instructions that use it which become constants
// themselves. // themselves.
Reduction += CountCodeReductionForConstant(&Inst); Reduction += countCodeReductionForConstant(Metrics, &Inst);
} }
} }
} }
return Reduction; return Reduction;
} }
// CountCodeReductionForAlloca - Figure out an approximation of how much smaller unsigned InlineCostAnalyzer::FunctionInfo::countCodeReductionForAlloca(
// the function will be if it is inlined into a context where an argument const CodeMetrics &Metrics, Value *V) {
// becomes an alloca.
//
unsigned CodeMetrics::CountCodeReductionForAlloca(Value *V) {
if (!V->getType()->isPointerTy()) return 0; // Not a pointer if (!V->getType()->isPointerTy()) return 0; // Not a pointer
unsigned Reduction = 0; unsigned Reduction = 0;
@ -331,7 +326,8 @@ unsigned CodeMetrics::CountCodeReductionForAlloca(Value *V) {
if (BranchInst *BI = dyn_cast<BranchInst>(I)) { if (BranchInst *BI = dyn_cast<BranchInst>(I)) {
BasicBlock *BB = BI->getSuccessor(Result ? 0 : 1); BasicBlock *BB = BI->getSuccessor(Result ? 0 : 1);
if (BB->getSinglePredecessor()) if (BB->getSinglePredecessor())
Reduction += InlineConstants::InstrCost * NumBBInsts[BB]; Reduction
+= InlineConstants::InstrCost * Metrics.NumBBInsts.lookup(BB);
} }
} }
} while (!Worklist.empty()); } while (!Worklist.empty());
@ -372,8 +368,8 @@ void InlineCostAnalyzer::FunctionInfo::analyzeFunction(Function *F,
// code can be eliminated if one of the arguments is a constant. // code can be eliminated if one of the arguments is a constant.
ArgumentWeights.reserve(F->arg_size()); ArgumentWeights.reserve(F->arg_size());
for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I) for (Function::arg_iterator I = F->arg_begin(), E = F->arg_end(); I != E; ++I)
ArgumentWeights.push_back(ArgInfo(Metrics.CountCodeReductionForConstant(I), ArgumentWeights.push_back(ArgInfo(countCodeReductionForConstant(Metrics, I),
Metrics.CountCodeReductionForAlloca(I))); countCodeReductionForAlloca(Metrics, I)));
} }
/// NeverInline - returns true if the function should never be inlined into /// NeverInline - returns true if the function should never be inlined into