From a5cefaaccbfee17b615baba27c293f805570e3cd Mon Sep 17 00:00:00 2001 From: Rahul Joshi Date: Thu, 9 Oct 2025 09:30:25 -0700 Subject: [PATCH] [NFC][LLVM] Code cleanup in MisExpect.cpp --- .../include/llvm/Transforms/Utils/MisExpect.h | 22 +++---- llvm/lib/Transforms/Utils/MisExpect.cpp | 61 +++++++------------ 2 files changed, 32 insertions(+), 51 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/MisExpect.h b/llvm/include/llvm/Transforms/Utils/MisExpect.h index e9fba47c97a4d..2d35d92d6b199 100644 --- a/llvm/include/llvm/Transforms/Utils/MisExpect.h +++ b/llvm/include/llvm/Transforms/Utils/MisExpect.h @@ -22,8 +22,7 @@ #include "llvm/IR/Instructions.h" #include "llvm/IR/LLVMContext.h" -namespace llvm { -namespace misexpect { +namespace llvm::misexpect { /// checkBackendInstrumentation - compares PGO counters to the thresholds used /// for llvm.expect and warns if the PGO counters are outside of the expected @@ -34,8 +33,8 @@ namespace misexpect { /// /// \param I The Instruction being checked /// \param RealWeights A vector of profile weights for each target block -void checkBackendInstrumentation(Instruction &I, - const llvm::ArrayRef RealWeights); +void checkBackendInstrumentation(const Instruction &I, + ArrayRef RealWeights); /// checkFrontendInstrumentation - compares PGO counters to the thresholds used /// for llvm.expect and warns if the PGO counters are outside of the expected @@ -48,8 +47,8 @@ void checkBackendInstrumentation(Instruction &I, /// \param I The Instruction being checked /// \param ExpectedWeights A vector of the expected weights for each target /// block, this determines the threshold values used when emitting diagnostics -void checkFrontendInstrumentation(Instruction &I, - const ArrayRef ExpectedWeights); +void checkFrontendInstrumentation(const Instruction &I, + ArrayRef ExpectedWeights); /// veryifyMisExpect - compares RealWeights to the thresholds used /// for llvm.expect and warns if the PGO counters are outside of the expected @@ -58,8 +57,8 @@ void checkFrontendInstrumentation(Instruction &I, /// \param I The Instruction being checked /// \param RealWeights A vector of profile weights from the profile data /// \param ExpectedWeights A vector of the weights attatch by llvm.expect -void verifyMisExpect(Instruction &I, ArrayRef RealWeights, - const ArrayRef ExpectedWeights); +void verifyMisExpect(const Instruction &I, ArrayRef RealWeights, + ArrayRef ExpectedWeights); /// checkExpectAnnotations - compares PGO counters to the thresholds used /// for llvm.expect and warns if the PGO counters are outside of the expected @@ -72,11 +71,10 @@ void verifyMisExpect(Instruction &I, ArrayRef RealWeights, /// \param I The Instruction being checked /// \param ExistingWeights A vector of profile weights for each target block /// \param IsFrontend A boolean describing if this is Frontend instrumentation -void checkExpectAnnotations(Instruction &I, - const ArrayRef ExistingWeights, +void checkExpectAnnotations(const Instruction &I, + ArrayRef ExistingWeights, bool IsFrontend); -} // namespace misexpect -} // namespace llvm +} // namespace llvm::misexpect #endif diff --git a/llvm/lib/Transforms/Utils/MisExpect.cpp b/llvm/lib/Transforms/Utils/MisExpect.cpp index ca7e09da9737b..1585e9e509f89 100644 --- a/llvm/lib/Transforms/Utils/MisExpect.cpp +++ b/llvm/lib/Transforms/Utils/MisExpect.cpp @@ -48,8 +48,6 @@ using namespace llvm; using namespace misexpect; -namespace llvm { - // Command line option to enable/disable the warning when profile data suggests // a mismatch with the use of the llvm.expect intrinsic static cl::opt PGOWarnMisExpect( @@ -63,22 +61,18 @@ static cl::opt MisExpectTolerance( cl::desc("Prevents emitting diagnostics when profile counts are " "within N% of the threshold..")); -} // namespace llvm - -namespace { - -bool isMisExpectDiagEnabled(LLVMContext &Ctx) { +static bool isMisExpectDiagEnabled(const LLVMContext &Ctx) { return PGOWarnMisExpect || Ctx.getMisExpectWarningRequested(); } -uint32_t getMisExpectTolerance(LLVMContext &Ctx) { +static uint32_t getMisExpectTolerance(const LLVMContext &Ctx) { return std::max(static_cast(MisExpectTolerance), Ctx.getDiagnosticsMisExpectTolerance()); } -Instruction *getInstCondition(Instruction *I) { +static const Instruction *getInstCondition(const Instruction *I) { assert(I != nullptr && "MisExpect target Instruction cannot be nullptr"); - Instruction *Ret = nullptr; + const Instruction *Ret = nullptr; if (auto *B = dyn_cast(I)) { Ret = dyn_cast(B->getCondition()); } @@ -97,8 +91,8 @@ Instruction *getInstCondition(Instruction *I) { return Ret ? Ret : I; } -void emitMisexpectDiagnostic(Instruction *I, LLVMContext &Ctx, - uint64_t ProfCount, uint64_t TotalCount) { +static void emitMisexpectDiagnostic(const Instruction *I, LLVMContext &Ctx, + uint64_t ProfCount, uint64_t TotalCount) { double PercentageCorrect = (double)ProfCount / TotalCount; auto PerString = formatv("{0:P} ({1} / {2})", PercentageCorrect, ProfCount, TotalCount); @@ -106,20 +100,16 @@ void emitMisexpectDiagnostic(Instruction *I, LLVMContext &Ctx, "Potential performance regression from use of the llvm.expect intrinsic: " "Annotation was correct on {0} of profiled executions.", PerString); - Instruction *Cond = getInstCondition(I); + const Instruction *Cond = getInstCondition(I); if (isMisExpectDiagEnabled(Ctx)) Ctx.diagnose(DiagnosticInfoMisExpect(Cond, Twine(PerString))); OptimizationRemarkEmitter ORE(I->getParent()->getParent()); ORE.emit(OptimizationRemark(DEBUG_TYPE, "misexpect", Cond) << RemStr.str()); } -} // namespace - -namespace llvm { -namespace misexpect { - -void verifyMisExpect(Instruction &I, ArrayRef RealWeights, - ArrayRef ExpectedWeights) { +void misexpect::verifyMisExpect(const Instruction &I, + ArrayRef RealWeights, + ArrayRef ExpectedWeights) { // To determine if we emit a diagnostic, we need to compare the branch weights // from the profile to those added by the llvm.expect intrinsic. // So first, we extract the "likely" and "unlikely" weights from @@ -128,15 +118,13 @@ void verifyMisExpect(Instruction &I, ArrayRef RealWeights, uint64_t LikelyBranchWeight = 0, UnlikelyBranchWeight = std::numeric_limits::max(); size_t MaxIndex = 0; - for (size_t Idx = 0, End = ExpectedWeights.size(); Idx < End; Idx++) { - uint32_t V = ExpectedWeights[Idx]; + for (const auto &[Idx, V] : enumerate(ExpectedWeights)) { if (LikelyBranchWeight < V) { LikelyBranchWeight = V; MaxIndex = Idx; } - if (UnlikelyBranchWeight > V) { + if (UnlikelyBranchWeight > V) UnlikelyBranchWeight = V; - } } const uint64_t ProfiledWeight = RealWeights[MaxIndex]; @@ -161,7 +149,7 @@ void verifyMisExpect(Instruction &I, ArrayRef RealWeights, uint64_t ScaledThreshold = LikelyProbablilty.scale(RealWeightsTotal); // clamp tolerance range to [0, 100) - auto Tolerance = getMisExpectTolerance(I.getContext()); + uint32_t Tolerance = getMisExpectTolerance(I.getContext()); Tolerance = std::clamp(Tolerance, 0u, 99u); // Allow users to relax checking by N% i.e., if they use a 5% tolerance, @@ -175,8 +163,8 @@ void verifyMisExpect(Instruction &I, ArrayRef RealWeights, RealWeightsTotal); } -void checkBackendInstrumentation(Instruction &I, - const ArrayRef RealWeights) { +void misexpect::checkBackendInstrumentation(const Instruction &I, + ArrayRef RealWeights) { // Backend checking assumes any existing weight comes from an `llvm.expect` // intrinsic. However, SampleProfiling + ThinLTO add branch weights multiple // times, leading to an invalid assumption in our checking. Backend checks @@ -190,24 +178,19 @@ void checkBackendInstrumentation(Instruction &I, verifyMisExpect(I, RealWeights, ExpectedWeights); } -void checkFrontendInstrumentation(Instruction &I, - const ArrayRef ExpectedWeights) { +void misexpect::checkFrontendInstrumentation( + const Instruction &I, ArrayRef ExpectedWeights) { SmallVector RealWeights; if (!extractBranchWeights(I, RealWeights)) return; verifyMisExpect(I, RealWeights, ExpectedWeights); } -void checkExpectAnnotations(Instruction &I, - const ArrayRef ExistingWeights, - bool IsFrontend) { - if (IsFrontend) { +void misexpect::checkExpectAnnotations(const Instruction &I, + ArrayRef ExistingWeights, + bool IsFrontend) { + if (IsFrontend) checkFrontendInstrumentation(I, ExistingWeights); - } else { + else checkBackendInstrumentation(I, ExistingWeights); - } } - -} // namespace misexpect -} // namespace llvm -#undef DEBUG_TYPE