2020#include " llvm/Analysis/BlockFrequencyInfo.h"
2121#include " llvm/Analysis/CodeMetrics.h"
2222#include " llvm/Analysis/ConstantFolding.h"
23+ #include " llvm/Analysis/EphemeralValuesCache.h"
2324#include " llvm/Analysis/InstructionSimplify.h"
2425#include " llvm/Analysis/LoopInfo.h"
2526#include " llvm/Analysis/MemoryBuiltins.h"
@@ -269,6 +270,10 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
269270 // / easily cacheable. Instead, use the cover function paramHasAttr.
270271 CallBase &CandidateCall;
271272
273+ // / Getter for the cache of ephemeral values.
274+ std::optional<function_ref<EphemeralValuesCache &(Function &)>>
275+ GetEphValuesCache;
276+
272277 // / Extension points for handling callsite features.
273278 // Called before a basic block was analyzed.
274279 virtual void onBlockStart (const BasicBlock *BB) {}
@@ -462,7 +467,7 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
462467
463468 // Custom analysis routines.
464469 InlineResult analyzeBlock (BasicBlock *BB,
465- SmallPtrSetImpl<const Value *> &EphValues);
470+ const SmallPtrSetImpl<const Value *> &EphValues);
466471
467472 // Disable several entry points to the visitor so we don't accidentally use
468473 // them by declaring but not defining them here.
@@ -510,10 +515,12 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
510515 function_ref<BlockFrequencyInfo &(Function &)> GetBFI = nullptr ,
511516 function_ref<const TargetLibraryInfo &(Function &)> GetTLI = nullptr ,
512517 ProfileSummaryInfo *PSI = nullptr ,
513- OptimizationRemarkEmitter *ORE = nullptr )
518+ OptimizationRemarkEmitter *ORE = nullptr ,
519+ std::optional<function_ref<EphemeralValuesCache &(Function &)>>
520+ GetEphValuesCache = std::nullopt )
514521 : TTI(TTI), GetAssumptionCache(GetAssumptionCache), GetBFI(GetBFI),
515522 GetTLI (GetTLI), PSI(PSI), F(Callee), DL(F.getDataLayout()), ORE(ORE),
516- CandidateCall(Call) {}
523+ CandidateCall(Call), GetEphValuesCache(GetEphValuesCache) {}
517524
518525 InlineResult analyze ();
519526
@@ -1126,9 +1133,11 @@ class InlineCostCallAnalyzer final : public CallAnalyzer {
11261133 function_ref<const TargetLibraryInfo &(Function &)> GetTLI = nullptr ,
11271134 ProfileSummaryInfo *PSI = nullptr ,
11281135 OptimizationRemarkEmitter *ORE = nullptr , bool BoostIndirect = true ,
1129- bool IgnoreThreshold = false )
1136+ bool IgnoreThreshold = false ,
1137+ std::optional<function_ref<EphemeralValuesCache &(Function &)>>
1138+ GetEphValuesCache = std::nullopt )
11301139 : CallAnalyzer(Callee, Call, TTI, GetAssumptionCache, GetBFI, GetTLI, PSI,
1131- ORE),
1140+ ORE, GetEphValuesCache ),
11321141 ComputeFullInlineCost (OptComputeFullInlineCost ||
11331142 Params.ComputeFullInlineCost || ORE ||
11341143 isCostBenefitAnalysisEnabled ()),
@@ -2566,7 +2575,7 @@ bool CallAnalyzer::visitInstruction(Instruction &I) {
25662575// / viable, and true if inlining remains viable.
25672576InlineResult
25682577CallAnalyzer::analyzeBlock (BasicBlock *BB,
2569- SmallPtrSetImpl<const Value *> &EphValues) {
2578+ const SmallPtrSetImpl<const Value *> &EphValues) {
25702579 for (Instruction &I : *BB) {
25712580 // FIXME: Currently, the number of instructions in a function regardless of
25722581 // our ability to simplify them during inline to constants or dead code,
@@ -2781,11 +2790,15 @@ InlineResult CallAnalyzer::analyze() {
27812790 NumConstantOffsetPtrArgs = ConstantOffsetPtrs.size ();
27822791 NumAllocaArgs = SROAArgValues.size ();
27832792
2784- // FIXME: If a caller has multiple calls to a callee, we end up recomputing
2785- // the ephemeral values multiple times (and they're completely determined by
2786- // the callee, so this is purely duplicate work).
2787- SmallPtrSet<const Value *, 32 > EphValues;
2788- CodeMetrics::collectEphemeralValues (&F, &GetAssumptionCache (F), EphValues);
2793+ // Collecting the ephemeral values of `F` can be expensive, so use the
2794+ // ephemeral values cache if available.
2795+ SmallPtrSet<const Value *, 32 > EphValuesStorage;
2796+ const SmallPtrSetImpl<const Value *> *EphValues = &EphValuesStorage;
2797+ auto &AC = GetAssumptionCache (F);
2798+ if (GetEphValuesCache)
2799+ EphValues = &(*GetEphValuesCache)(F).ephValues ();
2800+ else
2801+ CodeMetrics::collectEphemeralValues (&F, &AC, EphValuesStorage);
27892802
27902803 // The worklist of live basic blocks in the callee *after* inlining. We avoid
27912804 // adding basic blocks of the callee which can be proven to be dead for this
@@ -2824,7 +2837,7 @@ InlineResult CallAnalyzer::analyze() {
28242837
28252838 // Analyze the cost of this block. If we blow through the threshold, this
28262839 // returns false, and we can bail on out.
2827- InlineResult IR = analyzeBlock (BB, EphValues);
2840+ InlineResult IR = analyzeBlock (BB, * EphValues);
28282841 if (!IR.isSuccess ())
28292842 return IR;
28302843
@@ -2967,9 +2980,12 @@ InlineCost llvm::getInlineCost(
29672980 function_ref<AssumptionCache &(Function &)> GetAssumptionCache,
29682981 function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
29692982 function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
2970- ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE) {
2983+ ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE,
2984+ std::optional<function_ref<EphemeralValuesCache &(Function &)>>
2985+ GetEphValuesCache) {
29712986 return getInlineCost (Call, Call.getCalledFunction (), Params, CalleeTTI,
2972- GetAssumptionCache, GetTLI, GetBFI, PSI, ORE);
2987+ GetAssumptionCache, GetTLI, GetBFI, PSI, ORE,
2988+ GetEphValuesCache);
29732989}
29742990
29752991std::optional<int > llvm::getInliningCostEstimate (
@@ -3089,7 +3105,9 @@ InlineCost llvm::getInlineCost(
30893105 function_ref<AssumptionCache &(Function &)> GetAssumptionCache,
30903106 function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
30913107 function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
3092- ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE) {
3108+ ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE,
3109+ std::optional<function_ref<EphemeralValuesCache &(Function &)>>
3110+ GetEphValuesCache) {
30933111
30943112 auto UserDecision =
30953113 llvm::getAttributeBasedInliningDecision (Call, Callee, CalleeTTI, GetTLI);
@@ -3105,7 +3123,9 @@ InlineCost llvm::getInlineCost(
31053123 << " )\n " );
31063124
31073125 InlineCostCallAnalyzer CA (*Callee, Call, Params, CalleeTTI,
3108- GetAssumptionCache, GetBFI, GetTLI, PSI, ORE);
3126+ GetAssumptionCache, GetBFI, GetTLI, PSI, ORE,
3127+ /* BoostIndirect=*/ true , /* IgnoreThreshold=*/ false ,
3128+ GetEphValuesCache);
31093129 InlineResult ShouldInline = CA.analyze ();
31103130
31113131 LLVM_DEBUG (CA.dump ());
0 commit comments