forked from OSchip/llvm-project
Refactor callsite cost computation into a helper function /NFC
Makes code more readable. The function will also be used by the partial inlining's cost analysis. llvm-svn: 301899
This commit is contained in:
parent
9378752b67
commit
351d9b01b9
|
@ -160,6 +160,10 @@ InlineParams getInlineParams(int Threshold);
|
|||
/// the -Oz flag.
|
||||
InlineParams getInlineParams(unsigned OptLevel, unsigned SizeOptLevel);
|
||||
|
||||
/// Return the cost associated with a callsite, including paramater passing
|
||||
/// and the call/return instruction.
|
||||
int getCallsiteCost(CallSite CS, const DataLayout &DL);
|
||||
|
||||
/// \brief Get an InlineCost object representing the cost of inlining this
|
||||
/// callsite.
|
||||
///
|
||||
|
|
|
@ -1283,36 +1283,10 @@ bool CallAnalyzer::analyzeCall(CallSite CS) {
|
|||
// the rest of the function body.
|
||||
Threshold += (SingleBBBonus + FiftyPercentVectorBonus);
|
||||
|
||||
// Give out bonuses per argument, as the instructions setting them up will
|
||||
// be gone after inlining.
|
||||
for (unsigned I = 0, E = CS.arg_size(); I != E; ++I) {
|
||||
if (CS.isByValArgument(I)) {
|
||||
// We approximate the number of loads and stores needed by dividing the
|
||||
// size of the byval type by the target's pointer size.
|
||||
PointerType *PTy = cast<PointerType>(CS.getArgument(I)->getType());
|
||||
unsigned TypeSize = DL.getTypeSizeInBits(PTy->getElementType());
|
||||
unsigned PointerSize = DL.getPointerSizeInBits();
|
||||
// Ceiling division.
|
||||
unsigned NumStores = (TypeSize + PointerSize - 1) / PointerSize;
|
||||
// Give out bonuses for the callsite, as the instructions setting them up
|
||||
// will be gone after inlining.
|
||||
Cost -= getCallsiteCost(CS, DL);
|
||||
|
||||
// If it generates more than 8 stores it is likely to be expanded as an
|
||||
// inline memcpy so we take that as an upper bound. Otherwise we assume
|
||||
// one load and one store per word copied.
|
||||
// FIXME: The maxStoresPerMemcpy setting from the target should be used
|
||||
// here instead of a magic number of 8, but it's not available via
|
||||
// DataLayout.
|
||||
NumStores = std::min(NumStores, 8U);
|
||||
|
||||
Cost -= 2 * NumStores * InlineConstants::InstrCost;
|
||||
} else {
|
||||
// For non-byval arguments subtract off one instruction per call
|
||||
// argument.
|
||||
Cost -= InlineConstants::InstrCost;
|
||||
}
|
||||
}
|
||||
// The call instruction also disappears after inlining.
|
||||
Cost -= InlineConstants::InstrCost + InlineConstants::CallPenalty;
|
||||
|
||||
// If there is only one call of the function, and it has internal linkage,
|
||||
// the cost of inlining it drops dramatically.
|
||||
bool OnlyOneCallAndLocalLinkage =
|
||||
|
@ -1497,6 +1471,38 @@ static bool functionsHaveCompatibleAttributes(Function *Caller,
|
|||
AttributeFuncs::areInlineCompatible(*Caller, *Callee);
|
||||
}
|
||||
|
||||
int llvm::getCallsiteCost(CallSite CS, const DataLayout &DL) {
|
||||
int Cost = 0;
|
||||
for (unsigned I = 0, E = CS.arg_size(); I != E; ++I) {
|
||||
if (CS.isByValArgument(I)) {
|
||||
// We approximate the number of loads and stores needed by dividing the
|
||||
// size of the byval type by the target's pointer size.
|
||||
PointerType *PTy = cast<PointerType>(CS.getArgument(I)->getType());
|
||||
unsigned TypeSize = DL.getTypeSizeInBits(PTy->getElementType());
|
||||
unsigned PointerSize = DL.getPointerSizeInBits();
|
||||
// Ceiling division.
|
||||
unsigned NumStores = (TypeSize + PointerSize - 1) / PointerSize;
|
||||
|
||||
// If it generates more than 8 stores it is likely to be expanded as an
|
||||
// inline memcpy so we take that as an upper bound. Otherwise we assume
|
||||
// one load and one store per word copied.
|
||||
// FIXME: The maxStoresPerMemcpy setting from the target should be used
|
||||
// here instead of a magic number of 8, but it's not available via
|
||||
// DataLayout.
|
||||
NumStores = std::min(NumStores, 8U);
|
||||
|
||||
Cost += 2 * NumStores * InlineConstants::InstrCost;
|
||||
} else {
|
||||
// For non-byval arguments subtract off one instruction per call
|
||||
// argument.
|
||||
Cost += InlineConstants::InstrCost;
|
||||
}
|
||||
}
|
||||
// The call instruction also disappears after inlining.
|
||||
Cost += InlineConstants::InstrCost + InlineConstants::CallPenalty;
|
||||
return Cost;
|
||||
}
|
||||
|
||||
InlineCost llvm::getInlineCost(
|
||||
CallSite CS, const InlineParams &Params, TargetTransformInfo &CalleeTTI,
|
||||
std::function<AssumptionCache &(Function &)> &GetAssumptionCache,
|
||||
|
|
Loading…
Reference in New Issue