32#define DEBUG_TYPE "lower-allow-check"
40 cl::desc(
"Probability value in the range [0.0, 1.0] of "
41 "unconditional pseudo-random checks."));
44STATISTIC(NumChecksRemoved,
"Number of removed checks");
51 :
Kind(
"Kind",
II->getArgOperand(0)),
62 <<
"Removed check: Kind=" <<
Info.Kind <<
" F=" <<
Info.F
69 <<
"Allowed check: Kind=" <<
Info.Kind <<
" F=" <<
Info.F
80 std::unique_ptr<RandomNumberGenerator> Rng;
84 Rng =
F.getParent()->createRNG(
F.getName());
91 else if (
II->getIntrinsicID() == Intrinsic::allow_ubsan_check) {
93 if (Kind->getZExtValue() < Opts.
cutoffs.size())
94 return Opts.
cutoffs[Kind->getZExtValue()];
95 }
else if (
II->getIntrinsicID() == Intrinsic::allow_runtime_check) {
102 auto ShouldRemoveHot = [&](
const BasicBlock &BB,
unsigned int cutoff) {
103 return (cutoff == 1000000) ||
105 cutoff, BFI.getBlockProfileCount(&BB).value_or(0)));
108 auto ShouldRemoveRandom = [&]() {
110 !std::bernoulli_distribution(
RandomRate)(GetRng());
114 unsigned int cutoff = GetCutoff(
II);
115 return ShouldRemoveRandom() || ShouldRemoveHot(*(
II->getParent()), cutoff);
122 auto ID =
II->getIntrinsicID();
124 case Intrinsic::allow_ubsan_check:
125 case Intrinsic::allow_runtime_check: {
144 for (
auto [
I, V] : ReplaceWithValue) {
146 I->eraseFromParent();
149 return !ReplaceWithValue.
empty();
154 if (
F.isDeclaration())
178 OS, MapClassName2PassName);
189 for (
unsigned int cutoff : Opts.cutoffs) {
191 OS << LS <<
"cutoffs[" << i <<
"]=" << cutoff;
194 if (Opts.runtime_check)
195 OS << LS <<
"runtime_check=" << Opts.runtime_check;
ReachingDefAnalysis InstSet & ToRemove
Expand Atomic instructions
static const Function * getParent(const Value *V)
Analysis containing CSE Info
This file contains the declarations for the subclasses of Constant, which represent the different fla...
Module.h This file contains the declarations for the Module class.
static cl::opt< float > RandomRate("lower-allow-check-random-rate", cl::desc("Probability value in the range [0.0, 1.0] of " "unconditional pseudo-random checks."))
static cl::opt< int > HotPercentileCutoff("lower-allow-check-percentile-cutoff-hot", cl::desc("Hot percentile cutoff."))
static void emitRemark(IntrinsicInst *II, OptimizationRemarkEmitter &ORE, bool Removed)
static bool lowerAllowChecks(Function &F, const BlockFrequencyInfo &BFI, const ProfileSummaryInfo *PSI, OptimizationRemarkEmitter &ORE, const LowerAllowCheckPass::Options &Opts)
This file provides the interface for the pass responsible for removing expensive ubsan checks.
uint64_t IntrinsicInst * II
static StringRef getName(Value *V)
This file defines the SmallVector class.
This file defines the 'Statistic' class, which is designed to be an easy way to expose various metric...
#define STATISTIC(VARNAME, DESC)
PassT::Result & getResult(IRUnitT &IR, ExtraArgTs... ExtraArgs)
Get the result of an analysis pass for a given IR unit.
LLVM Basic Block Representation.
Analysis pass which computes BlockFrequencyInfo.
BlockFrequencyInfo pass uses BlockFrequencyInfoImpl implementation to estimate IR basic block frequen...
Represents analyses that only rely on functions' control flow.
static LLVM_ABI ConstantInt * getBool(LLVMContext &Context, bool V)
A wrapper class for inspecting calls to intrinsic functions.
A helper class to return the specified delimiter string after the first invocation of operator String...
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
static LLVM_ABI bool IsRequested()
A set of analyses that are preserved following a run of a transformation pass.
static PreservedAnalyses none()
Convenience factory function for the empty preserved set.
static PreservedAnalyses all()
Construct a special preserved set that preserves all passes.
PreservedAnalyses & preserveSet()
Mark an analysis set as preserved.
An analysis pass based on the new PM to deliver ProfileSummaryInfo.
Analysis providing profile information.
LLVM_ABI bool isHotCountNthPercentile(int PercentileCutoff, uint64_t C) const
Returns true if count C is considered hot with regard to a given hot percentile cutoff value.
A random number generator.
void push_back(const T &Elt)
This is a 'vector' (really, a variable-sized array), optimized for the case when the array is small.
StringRef - Represent a constant reference to a string, i.e.
An efficient, type-erasing, non-owning reference to a callable.
This class implements an extremely fast bulk output stream that can only output to a stream.
unsigned ID
LLVM IR allows to use arbitrary numbers as calling convention identifiers.
DiagnosticInfoOptimizationBase::Argument NV
This is an optimization pass for GlobalISel generic memory operations.
decltype(auto) dyn_cast(const From &Val)
dyn_cast<X> - Return the argument parameter cast to the specified type.
OuterAnalysisManagerProxy< ModuleAnalysisManager, Function > ModuleAnalysisManagerFunctionProxy
Provide the ModuleAnalysisManager to Function proxy.
decltype(auto) cast(const From &Val)
cast<X> - Return the argument parameter cast to the specified type.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
unsigned int runtime_check
std::vector< unsigned int > cutoffs
A CRTP mix-in to automatically provide informational APIs needed for passes.