Skip to content

Commit 4adefcf

Browse files
authored
[Analysis][EphemeralValuesAnalysis][NFCI] Remove EphemeralValuesCache class (#132454)
This is a follow-up to #130210. The EphemeralValuesAnalysis pass used to return an EphemeralValuesCache object which used to hold the ephemeral values and used to provide a lazy collection of the ephemeral values, and an invalidation using the `clear()` function. This patch removes the EphemeralValuesCache class completely and instead returns the SmallVector containing the ephemeral values.
1 parent c0b2c10 commit 4adefcf

File tree

7 files changed

+40
-70
lines changed

7 files changed

+40
-70
lines changed

llvm/include/llvm/Analysis/EphemeralValuesCache.h

Lines changed: 1 addition & 23 deletions
Original file line numberDiff line numberDiff line change
@@ -23,35 +23,13 @@ class Function;
2323
class AssumptionCache;
2424
class Value;
2525

26-
/// A cache of ephemeral values within a function.
27-
class EphemeralValuesCache {
28-
SmallPtrSet<const Value *, 32> EphValues;
29-
Function &F;
30-
AssumptionCache &AC;
31-
bool Collected = false;
32-
33-
void collectEphemeralValues();
34-
35-
public:
36-
EphemeralValuesCache(Function &F, AssumptionCache &AC) : F(F), AC(AC) {}
37-
void clear() {
38-
EphValues.clear();
39-
Collected = false;
40-
}
41-
const SmallPtrSetImpl<const Value *> &ephValues() {
42-
if (!Collected)
43-
collectEphemeralValues();
44-
return EphValues;
45-
}
46-
};
47-
4826
class EphemeralValuesAnalysis
4927
: public AnalysisInfoMixin<EphemeralValuesAnalysis> {
5028
friend AnalysisInfoMixin<EphemeralValuesAnalysis>;
5129
static AnalysisKey Key;
5230

5331
public:
54-
using Result = EphemeralValuesCache;
32+
using Result = SmallPtrSet<const Value *, 32>;
5533
Result run(Function &F, FunctionAnalysisManager &FAM);
5634
};
5735

llvm/include/llvm/Analysis/InlineCost.h

Lines changed: 13 additions & 12 deletions
Original file line numberDiff line numberDiff line change
@@ -15,6 +15,7 @@
1515

1616
#include "llvm/ADT/APInt.h"
1717
#include "llvm/ADT/STLFunctionalExtras.h"
18+
#include "llvm/Analysis/EphemeralValuesCache.h"
1819
#include "llvm/Analysis/InlineModelFeatureMaps.h"
1920
#include "llvm/IR/PassManager.h"
2021
#include <cassert>
@@ -31,7 +32,6 @@ class Function;
3132
class ProfileSummaryInfo;
3233
class TargetTransformInfo;
3334
class TargetLibraryInfo;
34-
class EphemeralValuesCache;
3535

3636
namespace InlineConstants {
3737
// Various thresholds used by inline cost analysis.
@@ -280,23 +280,24 @@ InlineCost getInlineCost(
280280
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
281281
function_ref<BlockFrequencyInfo &(Function &)> GetBFI = nullptr,
282282
ProfileSummaryInfo *PSI = nullptr, OptimizationRemarkEmitter *ORE = nullptr,
283-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
284-
nullptr);
283+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
284+
GetEphValuesCache = nullptr);
285285

286286
/// Get an InlineCost with the callee explicitly specified.
287287
/// This allows you to calculate the cost of inlining a function via a
288288
/// pointer. This behaves exactly as the version with no explicit callee
289289
/// parameter in all other respects.
290290
//
291-
InlineCost getInlineCost(
292-
CallBase &Call, Function *Callee, const InlineParams &Params,
293-
TargetTransformInfo &CalleeTTI,
294-
function_ref<AssumptionCache &(Function &)> GetAssumptionCache,
295-
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
296-
function_ref<BlockFrequencyInfo &(Function &)> GetBFI = nullptr,
297-
ProfileSummaryInfo *PSI = nullptr, OptimizationRemarkEmitter *ORE = nullptr,
298-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
299-
nullptr);
291+
InlineCost
292+
getInlineCost(CallBase &Call, Function *Callee, const InlineParams &Params,
293+
TargetTransformInfo &CalleeTTI,
294+
function_ref<AssumptionCache &(Function &)> GetAssumptionCache,
295+
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
296+
function_ref<BlockFrequencyInfo &(Function &)> GetBFI = nullptr,
297+
ProfileSummaryInfo *PSI = nullptr,
298+
OptimizationRemarkEmitter *ORE = nullptr,
299+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
300+
GetEphValuesCache = nullptr);
300301

301302
/// Returns InlineResult::success() if the call site should be always inlined
302303
/// because of user directives, and the inlining is viable. Returns

llvm/lib/Analysis/EphemeralValuesCache.cpp

Lines changed: 4 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -12,17 +12,14 @@
1212

1313
namespace llvm {
1414

15-
void EphemeralValuesCache::collectEphemeralValues() {
16-
CodeMetrics::collectEphemeralValues(&F, &AC, EphValues);
17-
Collected = true;
18-
}
19-
2015
AnalysisKey EphemeralValuesAnalysis::Key;
2116

22-
EphemeralValuesCache
17+
EphemeralValuesAnalysis::Result
2318
EphemeralValuesAnalysis::run(Function &F, FunctionAnalysisManager &FAM) {
2419
auto &AC = FAM.getResult<AssumptionAnalysis>(F);
25-
return EphemeralValuesCache(F, AC);
20+
SmallPtrSet<const Value *, 32> EphValues;
21+
CodeMetrics::collectEphemeralValues(&F, &AC, EphValues);
22+
return EphValues;
2623
}
2724

2825
} // namespace llvm

llvm/lib/Analysis/InlineCost.cpp

Lines changed: 11 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -271,7 +271,8 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
271271
CallBase &CandidateCall;
272272

273273
/// Getter for the cache of ephemeral values.
274-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache = nullptr;
274+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
275+
GetEphValuesCache = nullptr;
275276

276277
/// Extension points for handling callsite features.
277278
// Called before a basic block was analyzed.
@@ -515,8 +516,8 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
515516
function_ref<const TargetLibraryInfo &(Function &)> GetTLI = nullptr,
516517
ProfileSummaryInfo *PSI = nullptr,
517518
OptimizationRemarkEmitter *ORE = nullptr,
518-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
519-
nullptr)
519+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
520+
GetEphValuesCache = nullptr)
520521
: TTI(TTI), GetAssumptionCache(GetAssumptionCache), GetBFI(GetBFI),
521522
GetTLI(GetTLI), PSI(PSI), F(Callee), DL(F.getDataLayout()), ORE(ORE),
522523
CandidateCall(Call), GetEphValuesCache(GetEphValuesCache) {}
@@ -1133,8 +1134,8 @@ class InlineCostCallAnalyzer final : public CallAnalyzer {
11331134
ProfileSummaryInfo *PSI = nullptr,
11341135
OptimizationRemarkEmitter *ORE = nullptr, bool BoostIndirect = true,
11351136
bool IgnoreThreshold = false,
1136-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
1137-
nullptr)
1137+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
1138+
GetEphValuesCache = nullptr)
11381139
: CallAnalyzer(Callee, Call, TTI, GetAssumptionCache, GetBFI, GetTLI, PSI,
11391140
ORE, GetEphValuesCache),
11401141
ComputeFullInlineCost(OptComputeFullInlineCost ||
@@ -2794,7 +2795,7 @@ InlineResult CallAnalyzer::analyze() {
27942795
SmallPtrSet<const Value *, 32> EphValuesStorage;
27952796
const SmallPtrSetImpl<const Value *> *EphValues = &EphValuesStorage;
27962797
if (GetEphValuesCache)
2797-
EphValues = &GetEphValuesCache(F).ephValues();
2798+
EphValues = &GetEphValuesCache(F);
27982799
else
27992800
CodeMetrics::collectEphemeralValues(&F, &GetAssumptionCache(F),
28002801
EphValuesStorage);
@@ -2980,7 +2981,8 @@ InlineCost llvm::getInlineCost(
29802981
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
29812982
function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
29822983
ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE,
2983-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache) {
2984+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
2985+
GetEphValuesCache) {
29842986
return getInlineCost(Call, Call.getCalledFunction(), Params, CalleeTTI,
29852987
GetAssumptionCache, GetTLI, GetBFI, PSI, ORE,
29862988
GetEphValuesCache);
@@ -3104,7 +3106,8 @@ InlineCost llvm::getInlineCost(
31043106
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
31053107
function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
31063108
ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE,
3107-
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache) {
3109+
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
3110+
GetEphValuesCache) {
31083111

31093112
auto UserDecision =
31103113
llvm::getAttributeBasedInliningDecision(Call, Callee, CalleeTTI, GetTLI);

llvm/lib/Transforms/IPO/Inliner.cpp

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -391,7 +391,8 @@ PreservedAnalyses InlinerPass::run(LazyCallGraph::SCC &InitialC,
391391
}
392392
// TODO: Shouldn't we be invalidating all analyses on F here?
393393
// The caller was modified, so invalidate Ephemeral Values.
394-
FAM.getResult<EphemeralValuesAnalysis>(F).clear();
394+
FAM.invalidate(
395+
F, PreservedAnalyses::all().abandon(EphemeralValuesAnalysis::ID()));
395396

396397
DidInline = true;
397398
InlinedCallees.insert(&Callee);

llvm/test/Transforms/Inline/cgscc-incremental-invalidate.ll

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -12,18 +12,15 @@
1212
; CHECK: Invalidating analysis: LoopAnalysis on test1_f
1313
; CHECK: Invalidating analysis: BranchProbabilityAnalysis on test1_f
1414
; CHECK: Invalidating analysis: BlockFrequencyAnalysis on test1_f
15-
; CHECK: Invalidating analysis: EphemeralValuesAnalysis on test1_f
1615
; CHECK: Running analysis: DominatorTreeAnalysis on test1_g
1716
; CHECK: Invalidating analysis: DominatorTreeAnalysis on test1_g
1817
; CHECK: Invalidating analysis: LoopAnalysis on test1_g
1918
; CHECK: Invalidating analysis: BranchProbabilityAnalysis on test1_g
2019
; CHECK: Invalidating analysis: BlockFrequencyAnalysis on test1_g
21-
; CHECK: Invalidating analysis: EphemeralValuesAnalysis on test1_g
2220
; CHECK: Invalidating analysis: DominatorTreeAnalysis on test1_h
2321
; CHECK: Invalidating analysis: LoopAnalysis on test1_h
2422
; CHECK: Invalidating analysis: BranchProbabilityAnalysis on test1_h
2523
; CHECK: Invalidating analysis: BlockFrequencyAnalysis on test1_h
26-
; CHECK: Invalidating analysis: EphemeralValuesAnalysis on test1_h
2724
; CHECK-NOT: Invalidating analysis:
2825
; CHECK: Running pass: DominatorTreeVerifierPass on test1_g
2926
; CHECK-NEXT: Running analysis: DominatorTreeAnalysis on test1_g

llvm/unittests/Analysis/EphemeralValuesCacheTest.cpp

Lines changed: 9 additions & 16 deletions
Original file line numberDiff line numberDiff line change
@@ -8,9 +8,11 @@
88

99
#include "llvm/Analysis/EphemeralValuesCache.h"
1010
#include "llvm/Analysis/AssumptionCache.h"
11+
#include "llvm/Analysis/TargetTransformInfo.h"
1112
#include "llvm/AsmParser/Parser.h"
1213
#include "llvm/IR/LLVMContext.h"
1314
#include "llvm/IR/Module.h"
15+
#include "llvm/IR/PassInstrumentation.h"
1416
#include "llvm/Support/SourceMgr.h"
1517
#include "gmock/gmock-matchers.h"
1618
#include "gtest/gtest.h"
@@ -46,29 +48,20 @@ define void @foo(i8 %arg0, i8 %arg1) {
4648
)IR");
4749
Function *F = M->getFunction("foo");
4850
auto *BB = &*F->begin();
49-
AssumptionCache AC(*F);
50-
EphemeralValuesCache EVC(*F, AC);
5151
auto It = BB->begin();
5252
auto *C0 = &*It++;
5353
auto *Assume0 = &*It++;
5454
[[maybe_unused]] auto *NotEph = &*It++;
5555
auto *C1 = &*It++;
5656
auto *Assume1 = &*It++;
57-
[[maybe_unused]] auto *Ret = &*It++;
58-
// Check emphemeral values.
59-
EXPECT_THAT(EVC.ephValues(),
60-
testing::UnorderedElementsAre(C0, Assume0, C1, Assume1));
61-
// Clear the cache and try again.
62-
EVC.clear();
63-
EXPECT_THAT(EVC.ephValues(),
64-
testing::UnorderedElementsAre(C0, Assume0, C1, Assume1));
65-
// Modify the IR, clear cache and recompute.
66-
Assume1->eraseFromParent();
67-
C1->eraseFromParent();
68-
EXPECT_THAT(EVC.ephValues(),
57+
58+
FunctionAnalysisManager FAM;
59+
FAM.registerPass([] { return EphemeralValuesAnalysis(); });
60+
FAM.registerPass([] { return PassInstrumentationAnalysis(); });
61+
FAM.registerPass([] { return AssumptionAnalysis(); });
62+
FAM.registerPass([] { return TargetIRAnalysis(); });
63+
EXPECT_THAT(FAM.getResult<EphemeralValuesAnalysis>(*F),
6964
testing::UnorderedElementsAre(C0, Assume0, C1, Assume1));
70-
EVC.clear();
71-
EXPECT_THAT(EVC.ephValues(), testing::UnorderedElementsAre(C0, Assume0));
7265
}
7366

7467
} // namespace

0 commit comments

Comments
 (0)