Skip to content

Commit 973ea04

Browse files
committed
Revert "[Analysis][EphemeralValuesAnalysis][NFCI] Remove EphemeralValuesCache class (#132454)"
This reverts commit 4adefcf.
1 parent db7475a commit 973ea04

File tree

7 files changed

+70
-40
lines changed

7 files changed

+70
-40
lines changed

llvm/include/llvm/Analysis/EphemeralValuesCache.h

Lines changed: 23 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,13 +23,35 @@ 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+
2648
class EphemeralValuesAnalysis
2749
: public AnalysisInfoMixin<EphemeralValuesAnalysis> {
2850
friend AnalysisInfoMixin<EphemeralValuesAnalysis>;
2951
static AnalysisKey Key;
3052

3153
public:
32-
using Result = SmallPtrSet<const Value *, 32>;
54+
using Result = EphemeralValuesCache;
3355
Result run(Function &F, FunctionAnalysisManager &FAM);
3456
};
3557

llvm/include/llvm/Analysis/InlineCost.h

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

1616
#include "llvm/ADT/APInt.h"
1717
#include "llvm/ADT/STLFunctionalExtras.h"
18-
#include "llvm/Analysis/EphemeralValuesCache.h"
1918
#include "llvm/Analysis/InlineModelFeatureMaps.h"
2019
#include "llvm/IR/PassManager.h"
2120
#include <cassert>
@@ -32,6 +31,7 @@ class Function;
3231
class ProfileSummaryInfo;
3332
class TargetTransformInfo;
3433
class TargetLibraryInfo;
34+
class EphemeralValuesCache;
3535

3636
namespace InlineConstants {
3737
// Various thresholds used by inline cost analysis.
@@ -280,24 +280,23 @@ 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<EphemeralValuesAnalysis::Result &(Function &)>
284-
GetEphValuesCache = nullptr);
283+
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
284+
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
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);
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);
301300

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

llvm/lib/Analysis/EphemeralValuesCache.cpp

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

1313
namespace llvm {
1414

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

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

2528
} // namespace llvm

llvm/lib/Analysis/InlineCost.cpp

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

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

277276
/// Extension points for handling callsite features.
278277
// Called before a basic block was analyzed.
@@ -516,8 +515,8 @@ class CallAnalyzer : public InstVisitor<CallAnalyzer, bool> {
516515
function_ref<const TargetLibraryInfo &(Function &)> GetTLI = nullptr,
517516
ProfileSummaryInfo *PSI = nullptr,
518517
OptimizationRemarkEmitter *ORE = nullptr,
519-
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
520-
GetEphValuesCache = nullptr)
518+
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
519+
nullptr)
521520
: TTI(TTI), GetAssumptionCache(GetAssumptionCache), GetBFI(GetBFI),
522521
GetTLI(GetTLI), PSI(PSI), F(Callee), DL(F.getDataLayout()), ORE(ORE),
523522
CandidateCall(Call), GetEphValuesCache(GetEphValuesCache) {}
@@ -1134,8 +1133,8 @@ class InlineCostCallAnalyzer final : public CallAnalyzer {
11341133
ProfileSummaryInfo *PSI = nullptr,
11351134
OptimizationRemarkEmitter *ORE = nullptr, bool BoostIndirect = true,
11361135
bool IgnoreThreshold = false,
1137-
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
1138-
GetEphValuesCache = nullptr)
1136+
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache =
1137+
nullptr)
11391138
: CallAnalyzer(Callee, Call, TTI, GetAssumptionCache, GetBFI, GetTLI, PSI,
11401139
ORE, GetEphValuesCache),
11411140
ComputeFullInlineCost(OptComputeFullInlineCost ||
@@ -2795,7 +2794,7 @@ InlineResult CallAnalyzer::analyze() {
27952794
SmallPtrSet<const Value *, 32> EphValuesStorage;
27962795
const SmallPtrSetImpl<const Value *> *EphValues = &EphValuesStorage;
27972796
if (GetEphValuesCache)
2798-
EphValues = &GetEphValuesCache(F);
2797+
EphValues = &GetEphValuesCache(F).ephValues();
27992798
else
28002799
CodeMetrics::collectEphemeralValues(&F, &GetAssumptionCache(F),
28012800
EphValuesStorage);
@@ -2981,8 +2980,7 @@ InlineCost llvm::getInlineCost(
29812980
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
29822981
function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
29832982
ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE,
2984-
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
2985-
GetEphValuesCache) {
2983+
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache) {
29862984
return getInlineCost(Call, Call.getCalledFunction(), Params, CalleeTTI,
29872985
GetAssumptionCache, GetTLI, GetBFI, PSI, ORE,
29882986
GetEphValuesCache);
@@ -3106,8 +3104,7 @@ InlineCost llvm::getInlineCost(
31063104
function_ref<const TargetLibraryInfo &(Function &)> GetTLI,
31073105
function_ref<BlockFrequencyInfo &(Function &)> GetBFI,
31083106
ProfileSummaryInfo *PSI, OptimizationRemarkEmitter *ORE,
3109-
function_ref<EphemeralValuesAnalysis::Result &(Function &)>
3110-
GetEphValuesCache) {
3107+
function_ref<EphemeralValuesCache &(Function &)> GetEphValuesCache) {
31113108

31123109
auto UserDecision =
31133110
llvm::getAttributeBasedInliningDecision(Call, Callee, CalleeTTI, GetTLI);

llvm/lib/Transforms/IPO/Inliner.cpp

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -391,8 +391,7 @@ 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.invalidate(
395-
F, PreservedAnalyses::all().abandon(EphemeralValuesAnalysis::ID()));
394+
FAM.getResult<EphemeralValuesAnalysis>(F).clear();
396395

397396
DidInline = true;
398397
InlinedCallees.insert(&Callee);

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

Lines changed: 3 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -12,15 +12,18 @@
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
1516
; CHECK: Running analysis: DominatorTreeAnalysis on test1_g
1617
; CHECK: Invalidating analysis: DominatorTreeAnalysis on test1_g
1718
; CHECK: Invalidating analysis: LoopAnalysis on test1_g
1819
; CHECK: Invalidating analysis: BranchProbabilityAnalysis on test1_g
1920
; CHECK: Invalidating analysis: BlockFrequencyAnalysis on test1_g
21+
; CHECK: Invalidating analysis: EphemeralValuesAnalysis on test1_g
2022
; CHECK: Invalidating analysis: DominatorTreeAnalysis on test1_h
2123
; CHECK: Invalidating analysis: LoopAnalysis on test1_h
2224
; CHECK: Invalidating analysis: BranchProbabilityAnalysis on test1_h
2325
; CHECK: Invalidating analysis: BlockFrequencyAnalysis on test1_h
26+
; CHECK: Invalidating analysis: EphemeralValuesAnalysis on test1_h
2427
; CHECK-NOT: Invalidating analysis:
2528
; CHECK: Running pass: DominatorTreeVerifierPass on test1_g
2629
; CHECK-NEXT: Running analysis: DominatorTreeAnalysis on test1_g

llvm/unittests/Analysis/EphemeralValuesCacheTest.cpp

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

99
#include "llvm/Analysis/EphemeralValuesCache.h"
1010
#include "llvm/Analysis/AssumptionCache.h"
11-
#include "llvm/Analysis/TargetTransformInfo.h"
1211
#include "llvm/AsmParser/Parser.h"
1312
#include "llvm/IR/LLVMContext.h"
1413
#include "llvm/IR/Module.h"
15-
#include "llvm/IR/PassInstrumentation.h"
1614
#include "llvm/Support/SourceMgr.h"
1715
#include "gmock/gmock-matchers.h"
1816
#include "gtest/gtest.h"
@@ -48,20 +46,29 @@ define void @foo(i8 %arg0, i8 %arg1) {
4846
)IR");
4947
Function *F = M->getFunction("foo");
5048
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-
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),
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(),
6469
testing::UnorderedElementsAre(C0, Assume0, C1, Assume1));
70+
EVC.clear();
71+
EXPECT_THAT(EVC.ephValues(), testing::UnorderedElementsAre(C0, Assume0));
6572
}
6673

6774
} // namespace

0 commit comments

Comments
 (0)