48#define DEBUG_TYPE "misexpect"
51using namespace misexpect;
59 cl::desc(
"Use this option to turn on/off "
60 "warnings about incorrect usage of llvm.expect intrinsics."));
64 cl::desc(
"Prevents emiting diagnostics when profile counts are "
65 "within N% of the threshold.."));
81 assert(
I !=
nullptr &&
"MisExpect target Instruction cannot be nullptr");
83 if (
auto *
B = dyn_cast<BranchInst>(
I)) {
84 Ret = dyn_cast<Instruction>(
B->getCondition());
95 else if (
auto *S = dyn_cast<SwitchInst>(
I)) {
96 Ret = dyn_cast<Instruction>(S->getCondition());
103 double PercentageCorrect = (double)ProfCount / TotalCount;
105 formatv(
"{0:P} ({1} / {2})", PercentageCorrect, ProfCount, TotalCount);
107 "Potential performance regression from use of the llvm.expect intrinsic: "
108 "Annotation was correct on {0} of profiled executions.",
112 if (isMisExpectDiagEnabled(Ctx))
144 const uint64_t ProfiledWeight = RealWeights[MaxIndex];
147 std::plus<uint64_t>());
148 const uint64_t NumUnlikelyTargets = RealWeights.
size() - 1;
169 uint64_t ScaledThreshold = LikelyProbablilty.scale(RealWeightsTotal);
172 auto Tolerance = getMisExpectTolerance(
I.getContext());
173 Tolerance = std::clamp(Tolerance, 0u, 99u);
178 ScaledThreshold *= (1.0 - Tolerance / 100.0);
181 if (ProfiledWeight < ScaledThreshold)
182 emitMisexpectDiagnostic(&
I,
I.getContext(), ProfiledWeight,
SmallVector< MachineOperand, 4 > Cond
static GCRegistry::Add< OcamlGC > B("ocaml", "ocaml 3.10-compatible GC")
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Returns the sub type a function will return at a given Idx Should correspond to the result type of an ExtractValue instruction executed with just that one unsigned Idx
static cl::opt< uint32_t > UnlikelyBranchWeight("unlikely-branch-weight", cl::Hidden, cl::init(1), cl::desc("Weight of the branch unlikely to be taken (default = 1)"))
static cl::opt< uint32_t > LikelyBranchWeight("likely-branch-weight", cl::Hidden, cl::init(2000), cl::desc("Weight of the branch likely to be taken (default = 2000)"))
This file contains the declarations for profiling metadata utility functions.
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
ArrayRef - Represent a constant reference to an array (0 or more elements consecutively in memory),...
size_t size() const
size - Get the array size.
static BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
Diagnostic information for MisExpect analysis.
This is an important class for using LLVM in a threaded context.
bool getMisExpectWarningRequested() const
void diagnose(const DiagnosticInfo &DI)
Report a message to the currently installed diagnostic handler.
uint32_t getDiagnosticsMisExpectTolerance() const
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
Twine - A lightweight data structure for efficiently representing the concatenation of temporary valu...
const CustomOperand< const MCSubtargetInfo & > Msg[]
initializer< Ty > init(const Ty &Val)
void checkFrontendInstrumentation(Instruction &I, const ArrayRef< uint32_t > ExpectedWeights)
checkFrontendInstrumentation - compares PGO counters to the thresholds used for llvm....
void checkExpectAnnotations(Instruction &I, const ArrayRef< uint32_t > ExistingWeights, bool IsFrontend)
checkExpectAnnotations - compares PGO counters to the thresholds used for llvm.expect and warns if th...
void checkBackendInstrumentation(Instruction &I, const llvm::ArrayRef< uint32_t > RealWeights)
checkBackendInstrumentation - compares PGO counters to the thresholds used for llvm....
void verifyMisExpect(Instruction &I, ArrayRef< uint32_t > RealWeights, const ArrayRef< uint32_t > ExpectedWeights)
veryifyMisExpect - compares RealWeights to the thresholds used for llvm.expect and warns if the PGO c...
This is an optimization pass for GlobalISel generic memory operations.
static cl::opt< bool > PGOWarnMisExpect("pgo-warn-misexpect", cl::init(false), cl::Hidden, cl::desc("Use this option to turn on/off " "warnings about incorrect usage of llvm.expect intrinsics."))
auto formatv(const char *Fmt, Ts &&... Vals) -> formatv_object< decltype(std::make_tuple(detail::build_format_adapter(std::forward< Ts >(Vals))...))>
bool extractBranchWeights(const MDNode *ProfileData, SmallVectorImpl< uint32_t > &Weights)
Extract branch weights from MD_prof metadata.
static cl::opt< uint32_t > MisExpectTolerance("misexpect-tolerance", cl::init(0), cl::desc("Prevents emiting diagnostics when profile counts are " "within N% of the threshold.."))