LLVM: lib/Analysis/InlineCost.cpp File Reference (original) (raw)
Go to the source code of this file.
| Namespaces | |
|---|---|
| namespace | llvm |
| This is an optimization pass for GlobalISel generic memory operations. | |
| namespace | llvm::InlineConstants |
| Macros | |
|---|---|
| #define | DEBUG_TYPE "inline-cost" |
| #define | DEBUG_PRINT_STAT(x) |
| Functions | |
|---|---|
| STATISTIC (NumCallsAnalyzed, "Number of call sites analyzed") | |
| std::optional< int > | llvm::getStringFnAttrAsInt (const Attribute &Attr) |
| LLVM_ABI std::optional< int > | llvm::getStringFnAttrAsInt (CallBase &CB, StringRef AttrKind) |
| std::optional< int > | llvm::getStringFnAttrAsInt (Function *F, StringRef AttrKind) |
| LLVM_ABI int | llvm::InlineConstants::getInstrCost () |
| static bool | functionsHaveCompatibleAttributes (Function *Caller, Function *Callee, TargetTransformInfo &TTI, function_ref< const TargetLibraryInfo &(Function &)> &GetTLI) |
| Test that there are no attribute conflicts between Caller and Callee that prevent inlining. | |
| static int | computeThresholdFromOptLevels (unsigned OptLevel, unsigned SizeOptLevel) |
| Variables | |
|---|---|
| static cl::opt< int > | DefaultThreshold ("inlinedefault-threshold", cl::Hidden, cl::init(225), cl::desc("Default amount of inlining to perform")) |
| static cl::opt< bool > | IgnoreTTIInlineCompatible ("ignore-tti-inline-compatible", cl::Hidden, cl::init(false), cl::desc("Ignore TTI attributes compatibility check between callee/caller " "during inline cost calculation")) |
| static cl::opt< bool > | PrintInstructionComments ("print-instruction-comments", cl::Hidden, cl::init(false), cl::desc("Prints comments for instruction based on inline cost analysis")) |
| static cl::opt< int > | InlineThreshold ("inline-threshold", cl::Hidden, cl::init(225), cl::desc("Control the amount of inlining to perform (default = 225)")) |
| static cl::opt< int > | HintThreshold ("inlinehint-threshold", cl::Hidden, cl::init(325), cl::desc("Threshold for inlining functions with inline hint")) |
| static cl::opt< int > | ColdCallSiteThreshold ("inline-cold-callsite-threshold", cl::Hidden, cl::init(45), cl::desc("Threshold for inlining cold callsites")) |
| static cl::opt< bool > | InlineEnableCostBenefitAnalysis ("inline-enable-cost-benefit-analysis", cl::Hidden, cl::init(false), cl::desc("Enable the cost-benefit analysis for the inliner")) |
| static cl::opt< int > | InlineSavingsMultiplier ("inline-savings-multiplier", cl::Hidden, cl::init(8), cl::desc("Multiplier to multiply cycle savings by during inlining")) |
| static cl::opt< int > | InlineSavingsProfitableMultiplier ("inline-savings-profitable-multiplier", cl::Hidden, cl::init(4), cl::desc("A multiplier on top of cycle savings to decide whether the " "savings won't justify the cost")) |
| static cl::opt< int > | InlineSizeAllowance ("inline-size-allowance", cl::Hidden, cl::init(100), cl::desc("The maximum size of a callee that get's " "inlined without sufficient cycle savings")) |
| static cl::opt< int > | ColdThreshold ("inlinecold-threshold", cl::Hidden, cl::init(45), cl::desc("Threshold for inlining functions with cold attribute")) |
| static cl::opt< int > | HotCallSiteThreshold ("hot-callsite-threshold", cl::Hidden, cl::init(3000), cl::desc("Threshold for hot callsites ")) |
| static cl::opt< int > | LocallyHotCallSiteThreshold ("locally-hot-callsite-threshold", cl::Hidden, cl::init(525), cl::desc("Threshold for locally hot callsites ")) |
| static cl::opt< int > | ColdCallSiteRelFreq ("cold-callsite-rel-freq", cl::Hidden, cl::init(2), cl::desc("Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a callsite to be cold in the absence of " "profile information.")) |
| static cl::opt< uint64_t > | HotCallSiteRelFreq ("hot-callsite-rel-freq", cl::Hidden, cl::init(60), cl::desc("Minimum block frequency, expressed as a multiple of caller's " "entry frequency, for a callsite to be hot in the absence of " "profile information.")) |
| static cl::opt< int > | InstrCost ("inline-instr-cost", cl::Hidden, cl::init(5), cl::desc("Cost of a single instruction when inlining")) |
| static cl::opt< int > | InlineAsmInstrCost ("inline-asm-instr-cost", cl::Hidden, cl::init(0), cl::desc("Cost of a single inline asm instruction when inlining")) |
| static cl::opt< int > | MemAccessCost ("inline-memaccess-cost", cl::Hidden, cl::init(0), cl::desc("Cost of load/store instruction when inlining")) |
| static cl::opt< int > | CallPenalty ("inline-call-penalty", cl::Hidden, cl::init(25), cl::desc("Call penalty that is applied per callsite when inlining")) |
| static cl::opt< size_t > | StackSizeThreshold ("inline-max-stacksize", cl::Hidden, cl::init(std::numeric_limits< size_t >::max()), cl::desc("Do not inline functions with a stack size " "that exceeds the specified limit")) |
| static cl::opt< size_t > | RecurStackSizeThreshold ("recursive-inline-max-stacksize", cl::Hidden, cl::init(InlineConstants::TotalAllocaSizeRecursiveCaller), cl::desc("Do not inline recursive functions with a stack " "size that exceeds the specified limit")) |
| static cl::opt< bool > | OptComputeFullInlineCost ("inline-cost-full", cl::Hidden, cl::desc("Compute the full inline cost of a call site even when the cost " "exceeds the threshold.")) |
| static cl::opt< bool > | InlineCallerSupersetNoBuiltin ("inline-caller-superset-nobuiltin", cl::Hidden, cl::init(true), cl::desc("Allow inlining when caller has a superset of callee's nobuiltin " "attributes.")) |
| static cl::opt< bool > | DisableGEPConstOperand ("disable-gep-const-evaluation", cl::Hidden, cl::init(false), cl::desc("Disables evaluation of GetElementPtr with constant operands")) |
| static cl::opt< bool > | InlineAllViableCalls ("inline-all-viable-calls", cl::Hidden, cl::init(false), cl::desc("Inline all viable calls, even if they exceed the inlining " "threshold")) |
◆ DEBUG_PRINT_STAT
| #define DEBUG_PRINT_STAT | ( | x | ) |
|---|
Value:
OS << " " #x ": " << x << "\n"
◆ DEBUG_TYPE
#define DEBUG_TYPE "inline-cost"
◆ computeThresholdFromOptLevels()
◆ functionsHaveCompatibleAttributes()
◆ STATISTIC()
| STATISTIC | ( | NumCallsAnalyzed | , |
|---|---|---|---|
| "Number of call sites analyzed" | ) |
◆ CallPenalty
| cl::opt< int > CallPenalty("inline-call-penalty", cl::Hidden, cl::init(25), cl::desc("Call penalty that is applied per callsite when inlining")) ( "inline-call-penalty" , cl::Hidden , cl::init(25) , cl::desc("Call penalty that is applied per callsite when inlining") ) | static |
|---|
◆ ColdCallSiteRelFreq
| cl::opt< int > ColdCallSiteRelFreq("cold-callsite-rel-freq", cl::Hidden, cl::init(2), cl::desc("Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a callsite to be cold in the absence of " "profile information.")) ( "cold-callsite-rel-freq" , cl::Hidden , cl::init(2) , cl::desc("Maximum block frequency, expressed as a percentage of caller's " "entry frequency, for a callsite to be cold in the absence of " "profile information.") ) | static |
|---|
◆ ColdCallSiteThreshold
| cl::opt< int > ColdCallSiteThreshold("inline-cold-callsite-threshold", cl::Hidden, cl::init(45), cl::desc("Threshold for inlining cold callsites")) ( "inline-cold-callsite-threshold" , cl::Hidden , cl::init(45) , cl::desc("Threshold for inlining cold callsites") ) | static |
|---|
◆ ColdThreshold
| cl::opt< int > ColdThreshold("inlinecold-threshold", cl::Hidden, cl::init(45), cl::desc("Threshold for inlining functions with cold attribute")) ( "inlinecold-threshold" , cl::Hidden , cl::init(45) , cl::desc("Threshold for inlining functions with cold attribute") ) | static |
|---|
◆ DefaultThreshold
| cl::opt< int > DefaultThreshold("inlinedefault-threshold", cl::Hidden, cl::init(225), cl::desc("Default amount of inlining to perform")) ( "inlinedefault-threshold" , cl::Hidden , cl::init(225) , cl::desc("Default amount of inlining to perform") ) | static |
|---|
◆ DisableGEPConstOperand
| cl::opt< bool > DisableGEPConstOperand("disable-gep-const-evaluation", cl::Hidden, cl::init(false), cl::desc("Disables evaluation of GetElementPtr with constant operands")) ( "disable-gep-const-evaluation" , cl::Hidden , cl::init(false) , cl::desc("Disables evaluation of GetElementPtr with constant operands") ) | static |
|---|
◆ HintThreshold
◆ HotCallSiteRelFreq
| cl::opt< uint64_t > HotCallSiteRelFreq("hot-callsite-rel-freq", cl::Hidden, cl::init(60), cl::desc("Minimum block frequency, expressed as a multiple of caller's " "entry frequency, for a callsite to be hot in the absence of " "profile information.")) ( "hot-callsite-rel-freq" , cl::Hidden , cl::init(60) , cl::desc("Minimum block frequency, expressed as a multiple of caller's " "entry frequency, for a callsite to be hot in the absence of " "profile information.") ) | static |
|---|
◆ HotCallSiteThreshold
| cl::opt< int > HotCallSiteThreshold("hot-callsite-threshold", cl::Hidden, cl::init(3000), cl::desc("Threshold for hot callsites ")) ( "hot-callsite-threshold" , cl::Hidden , cl::init(3000) , cl::desc("Threshold for hot callsites ") ) | static |
|---|
◆ IgnoreTTIInlineCompatible
| cl::opt< bool > IgnoreTTIInlineCompatible("ignore-tti-inline-compatible", cl::Hidden, cl::init(false), cl::desc("Ignore TTI attributes compatibility check between callee/caller " "during inline cost calculation")) ( "ignore-tti-inline-compatible" , cl::Hidden , cl::init(false) , cl::desc("Ignore TTI attributes compatibility check between callee/caller " "during inline cost calculation") ) | static |
|---|
◆ InlineAllViableCalls
| cl::opt< bool > InlineAllViableCalls("inline-all-viable-calls", cl::Hidden, cl::init(false), cl::desc("Inline all viable calls, even if they exceed the inlining " "threshold")) ( "inline-all-viable-calls" , cl::Hidden , cl::init(false) , cl::desc("Inline all viable calls, even if they exceed the inlining " "threshold") ) | static |
|---|
◆ InlineAsmInstrCost
| cl::opt< int > InlineAsmInstrCost("inline-asm-instr-cost", cl::Hidden, cl::init(0), cl::desc("Cost of a single inline asm instruction when inlining")) ( "inline-asm-instr-cost" , cl::Hidden , cl::init(0) , cl::desc("Cost of a single inline asm instruction when inlining") ) | static |
|---|
◆ InlineCallerSupersetNoBuiltin
| cl::opt< bool > InlineCallerSupersetNoBuiltin("inline-caller-superset-nobuiltin", cl::Hidden, cl::init(true), cl::desc("Allow inlining when caller has a superset of callee's nobuiltin " "attributes.")) ( "inline-caller-superset-nobuiltin" , cl::Hidden , cl::init(true) , cl::desc("Allow inlining when caller has a superset of callee's nobuiltin " "attributes.") ) | static |
|---|
◆ InlineEnableCostBenefitAnalysis
| cl::opt< bool > InlineEnableCostBenefitAnalysis("inline-enable-cost-benefit-analysis", cl::Hidden, cl::init(false), cl::desc("Enable the cost-benefit analysis for the inliner")) ( "inline-enable-cost-benefit-analysis" , cl::Hidden , cl::init(false) , cl::desc("Enable the cost-benefit analysis for the inliner") ) | static |
|---|
◆ InlineSavingsMultiplier
| cl::opt< int > InlineSavingsMultiplier("inline-savings-multiplier", cl::Hidden, cl::init(8), cl::desc("Multiplier to multiply cycle savings by during inlining")) ( "inline-savings-multiplier" , cl::Hidden , cl::init(8) , cl::desc("Multiplier to multiply cycle savings by during inlining") ) | static |
|---|
◆ InlineSavingsProfitableMultiplier
| cl::opt< int > InlineSavingsProfitableMultiplier("inline-savings-profitable-multiplier", cl::Hidden, cl::init(4), cl::desc("A multiplier on top of cycle savings to decide whether the " "savings won't justify the cost")) ( "inline-savings-profitable-multiplier" , cl::Hidden , cl::init(4) , cl::desc("A multiplier on top of cycle savings to decide whether the " "savings won't justify the cost") ) | static |
|---|
◆ InlineSizeAllowance
| cl::opt< int > InlineSizeAllowance("inline-size-allowance", cl::Hidden, cl::init(100), cl::desc("The maximum size of a callee that get's " "inlined without sufficient cycle savings")) ( "inline-size-allowance" , cl::Hidden , cl::init(100) , cl::desc("The maximum size of a callee that get's " "inlined without sufficient cycle savings") ) | static |
|---|
◆ InlineThreshold
| cl::opt< int > InlineThreshold("inline-threshold", cl::Hidden, cl::init(225), cl::desc("Control the amount of inlining to perform (default = 225)")) ( "inline-threshold" , cl::Hidden , cl::init(225) , cl::desc("Control the amount of inlining to perform (default = 225)") ) | static |
|---|
◆ InstrCost
| cl::opt< int > InstrCost("inline-instr-cost", cl::Hidden, cl::init(5), cl::desc("Cost of a single instruction when inlining")) ( "inline-instr-cost" , cl::Hidden , cl::init(5) , cl::desc("Cost of a single instruction when inlining") ) | static |
|---|
◆ LocallyHotCallSiteThreshold
| cl::opt< int > LocallyHotCallSiteThreshold("locally-hot-callsite-threshold", cl::Hidden, cl::init(525), cl::desc("Threshold for locally hot callsites ")) ( "locally-hot-callsite-threshold" , cl::Hidden , cl::init(525) , cl::desc("Threshold for locally hot callsites ") ) | static |
|---|
◆ MemAccessCost
| cl::opt< int > MemAccessCost("inline-memaccess-cost", cl::Hidden, cl::init(0), cl::desc("Cost of load/store instruction when inlining")) ( "inline-memaccess-cost" , cl::Hidden , cl::init(0) , cl::desc("Cost of load/store instruction when inlining") ) | static |
|---|
◆ OptComputeFullInlineCost
| cl::opt< bool > OptComputeFullInlineCost("inline-cost-full", cl::Hidden, cl::desc("Compute the full inline cost of a call site even when the cost " "exceeds the threshold.")) ( "inline-cost-full" , cl::Hidden , cl::desc("Compute the full inline cost of a call site even when the cost " "exceeds the threshold.") ) | static |
|---|
◆ PrintInstructionComments
| cl::opt< bool > PrintInstructionComments("print-instruction-comments", cl::Hidden, cl::init(false), cl::desc("Prints comments for instruction based on inline cost analysis")) ( "print-instruction-comments" , cl::Hidden , cl::init(false) , cl::desc("Prints comments for instruction based on inline cost analysis") ) | static |
|---|
◆ RecurStackSizeThreshold
| cl::opt< size_t > RecurStackSizeThreshold("recursive-inline-max-stacksize", cl::Hidden, cl::init(InlineConstants::TotalAllocaSizeRecursiveCaller), cl::desc("Do not inline recursive functions with a stack " "size that exceeds the specified limit")) ( "recursive-inline-max-stacksize" , cl::Hidden , cl::init(InlineConstants::TotalAllocaSizeRecursiveCaller) , cl::desc("Do not inline recursive functions with a stack " "size that exceeds the specified limit") ) | static |
|---|
◆ StackSizeThreshold
| cl::opt< size_t > StackSizeThreshold("inline-max-stacksize", cl::Hidden, cl::init(std::numeric_limits< size_t >::max()), cl::desc("Do not inline functions with a stack size " "that exceeds the specified limit")) ( "inline-max-stacksize" , cl::Hidden , cl::init(std::numeric_limits< size_t >::max()) , cl::desc("Do not inline functions with a stack size " "that exceeds the specified limit") ) | static |
|---|