diff options
Diffstat (limited to 'lib/Analysis/InlineCost.cpp')
-rw-r--r-- | lib/Analysis/InlineCost.cpp | 36 |
1 files changed, 36 insertions, 0 deletions
diff --git a/lib/Analysis/InlineCost.cpp b/lib/Analysis/InlineCost.cpp index 140e7daa6d..09e66487c7 100644 --- a/lib/Analysis/InlineCost.cpp +++ b/lib/Analysis/InlineCost.cpp @@ -383,3 +383,39 @@ float InlineCostAnalyzer::getInlineFudgeFactor(CallSite CS) { Factor += 1.5f; return Factor; } + +/// growCachedCostInfo - update the cached cost info for Caller after Callee has +/// been inlined. +void +InlineCostAnalyzer::growCachedCostInfo(Function* Caller, Function* Callee) { + FunctionInfo &CallerFI = CachedFunctionInfo[Caller]; + + // For small functions we prefer to recalculate the cost for better accuracy. + if (!CallerFI.Metrics.NumBlocks || CallerFI.Metrics.NumInsts < 100) { + resetCachedCostInfo(Caller); + return; + } + + // For large functions, we can save a lot of computation time by skipping + // recalculations. + if (CallerFI.Metrics.NumCalls > 0) + --CallerFI.Metrics.NumCalls; + + if (Callee) { + FunctionInfo &CalleeFI = CachedFunctionInfo[Callee]; + if (!CalleeFI.Metrics.NumBlocks) { + resetCachedCostInfo(Caller); + return; + } + CallerFI.Metrics.NeverInline |= CalleeFI.Metrics.NeverInline; + CallerFI.Metrics.usesDynamicAlloca |= CalleeFI.Metrics.usesDynamicAlloca; + + CallerFI.Metrics.NumInsts += CalleeFI.Metrics.NumInsts; + CallerFI.Metrics.NumBlocks += CalleeFI.Metrics.NumBlocks; + CallerFI.Metrics.NumCalls += CalleeFI.Metrics.NumCalls; + CallerFI.Metrics.NumVectorInsts += CalleeFI.Metrics.NumVectorInsts; + CallerFI.Metrics.NumRets += CalleeFI.Metrics.NumRets; + } + // We are not updating the argumentweights. We have already determined that + // Caller is a fairly large function, so we accept the loss of precision. +} |