[llvm] 01c5ec3 - [NFC] Surface the validation of FunctionPropertiesAnalysis
Mircea Trofin via llvm-commits
llvm-commits at lists.llvm.org
Mon May 22 16:13:36 PDT 2023
Author: Mircea Trofin
Date: 2023-05-22T16:13:28-07:00
New Revision: 01c5ec3d6209875de05de94cd7923c4e462c3317
URL: https://github.com/llvm/llvm-project/commit/01c5ec3d6209875de05de94cd7923c4e462c3317
DIFF: https://github.com/llvm/llvm-project/commit/01c5ec3d6209875de05de94cd7923c4e462c3317.diff
LOG: [NFC] Surface the validation of FunctionPropertiesAnalysis
Avoids relying on `assert` for some of the validation.
Differential Revision: https://reviews.llvm.org/D150827
Added:
Modified:
llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
Removed:
################################################################################
diff --git a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
index cd32979b9ea5b..85d98a05bbd7c 100644
--- a/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
+++ b/llvm/include/llvm/Analysis/FunctionPropertiesAnalysis.h
@@ -20,6 +20,7 @@
#include "llvm/IR/PassManager.h"
namespace llvm {
+class DominatorTree;
class Function;
class LoopInfo;
@@ -31,7 +32,11 @@ class FunctionPropertiesInfo {
public:
static FunctionPropertiesInfo
- getFunctionPropertiesInfo(const Function &F, FunctionAnalysisManager &FAM);
+ getFunctionPropertiesInfo(const Function &F, const DominatorTree &DT,
+ const LoopInfo &LI);
+
+ static FunctionPropertiesInfo
+ getFunctionPropertiesInfo(Function &F, FunctionAnalysisManager &FAM);
bool operator==(const FunctionPropertiesInfo &FPI) const {
return std::memcmp(this, &FPI, sizeof(FunctionPropertiesInfo)) == 0;
@@ -109,14 +114,21 @@ class FunctionPropertiesPrinterPass
/// inlining.
class FunctionPropertiesUpdater {
public:
- FunctionPropertiesUpdater(FunctionPropertiesInfo &FPI, const CallBase &CB);
+ FunctionPropertiesUpdater(FunctionPropertiesInfo &FPI, CallBase &CB);
void finish(FunctionAnalysisManager &FAM) const;
+ bool finishAndTest(FunctionAnalysisManager &FAM) const {
+ finish(FAM);
+ return isUpdateValid(Caller, FPI, FAM);
+ }
private:
FunctionPropertiesInfo &FPI;
- const BasicBlock &CallSiteBB;
- const Function &Caller;
+ BasicBlock &CallSiteBB;
+ Function &Caller;
+
+ static bool isUpdateValid(Function &F, const FunctionPropertiesInfo &FPI,
+ FunctionAnalysisManager &FAM);
DenseSet<const BasicBlock *> Successors;
};
diff --git a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
index 782c11937507e..6094f22a17fd3 100644
--- a/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
+++ b/llvm/lib/Analysis/FunctionPropertiesAnalysis.cpp
@@ -82,13 +82,15 @@ void FunctionPropertiesInfo::updateAggregateStats(const Function &F,
}
FunctionPropertiesInfo FunctionPropertiesInfo::getFunctionPropertiesInfo(
- const Function &F, FunctionAnalysisManager &FAM) {
+ Function &F, FunctionAnalysisManager &FAM) {
+ return getFunctionPropertiesInfo(F, FAM.getResult<DominatorTreeAnalysis>(F),
+ FAM.getResult<LoopAnalysis>(F));
+}
+
+FunctionPropertiesInfo FunctionPropertiesInfo::getFunctionPropertiesInfo(
+ const Function &F, const DominatorTree &DT, const LoopInfo &LI) {
FunctionPropertiesInfo FPI;
- // The const casts are due to the getResult API - there's no mutation of F.
- const auto &LI = FAM.getResult<LoopAnalysis>(const_cast<Function &>(F));
- const auto &DT =
- FAM.getResult<DominatorTreeAnalysis>(const_cast<Function &>(F));
for (const auto &BB : F)
if (DT.isReachableFromEntry(&BB))
FPI.reIncludeBB(BB);
@@ -127,7 +129,7 @@ FunctionPropertiesPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
}
FunctionPropertiesUpdater::FunctionPropertiesUpdater(
- FunctionPropertiesInfo &FPI, const CallBase &CB)
+ FunctionPropertiesInfo &FPI, CallBase &CB)
: FPI(FPI), CallSiteBB(*CB.getParent()), Caller(*CallSiteBB.getParent()) {
assert(isa<CallInst>(CB) || isa<InvokeInst>(CB));
// For BBs that are likely to change, we subtract from feature totals their
@@ -247,5 +249,13 @@ void FunctionPropertiesUpdater::finish(FunctionAnalysisManager &FAM) const {
const auto &LI = FAM.getResult<LoopAnalysis>(const_cast<Function &>(Caller));
FPI.updateAggregateStats(Caller, LI);
- assert(FPI == FunctionPropertiesInfo::getFunctionPropertiesInfo(Caller, FAM));
}
+
+bool FunctionPropertiesUpdater::isUpdateValid(Function &F,
+ const FunctionPropertiesInfo &FPI,
+ FunctionAnalysisManager &FAM) {
+ DominatorTree DT(F);
+ LoopInfo LI(DT);
+ auto Fresh = FunctionPropertiesInfo::getFunctionPropertiesInfo(F, DT, LI);
+ return FPI == Fresh;
+}
\ No newline at end of file
diff --git a/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp b/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
index 6255a4b9e8cd4..181066acd1fab 100644
--- a/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
+++ b/llvm/unittests/Analysis/FunctionPropertiesAnalysisTest.cpp
@@ -158,7 +158,7 @@ define i32 @f2(i32 %a) {
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(FPI, ExpectedFinal);
}
@@ -212,7 +212,7 @@ define i32 @f2(i32 %a) {
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(FPI, ExpectedFinal);
}
@@ -279,7 +279,7 @@ define i32 @f2(i32 %a) {
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(FPI, ExpectedFinal);
}
@@ -324,7 +324,7 @@ declare i32 @__gxx_personality_v0(...)
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(static_cast<size_t>(FPI.BasicBlockCount), F1->size());
EXPECT_EQ(static_cast<size_t>(FPI.TotalInstructionCount),
F1->getInstructionCount());
@@ -377,7 +377,7 @@ declare i32 @__gxx_personality_v0(...)
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(static_cast<size_t>(FPI.BasicBlockCount), F1->size() - 1);
EXPECT_EQ(static_cast<size_t>(FPI.TotalInstructionCount),
F1->getInstructionCount() - 2);
@@ -431,7 +431,7 @@ declare i32 @__gxx_personality_v0(...)
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(static_cast<size_t>(FPI.BasicBlockCount), F1->size() - 1);
EXPECT_EQ(static_cast<size_t>(FPI.TotalInstructionCount),
F1->getInstructionCount() - 2);
@@ -483,7 +483,7 @@ define void @outer() personality i8* null {
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(static_cast<size_t>(FPI.BasicBlockCount), F1->size() - 1);
EXPECT_EQ(static_cast<size_t>(FPI.TotalInstructionCount),
F1->getInstructionCount() - 2);
@@ -539,7 +539,7 @@ if.then:
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(static_cast<size_t>(FPI.BasicBlockCount), F1->size() - 1);
EXPECT_EQ(static_cast<size_t>(FPI.TotalInstructionCount),
F1->getInstructionCount() - 2);
@@ -610,7 +610,7 @@ define i32 @f2(i32 %a) {
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(FPI, ExpectedFinal);
}
@@ -677,7 +677,7 @@ declare void @llvm.trap()
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(FPI, ExpectedFinal);
}
@@ -737,7 +737,7 @@ declare void @f3()
auto IR = llvm::InlineFunction(*CB, IFI);
EXPECT_TRUE(IR.isSuccess());
invalidate(*F1);
- FPU.finish(FAM);
+ EXPECT_TRUE(FPU.finishAndTest(FAM));
EXPECT_EQ(FPI, ExpectedFinal);
}
} // end anonymous namespace
More information about the llvm-commits
mailing list