13#ifndef LLVM_SUPPORT_BRANCHPROBABILITY_H
14#define LLVM_SUPPORT_BRANCHPROBABILITY_H
32class BranchProbability {
37 static constexpr uint32_t D = 1u << 31;
38 static constexpr uint32_t UnknownN = UINT32_MAX;
48 assert(Denominator > 0 &&
"Denominator cannot be 0!");
49 assert(Numerator <= Denominator &&
"Probability cannot be bigger than 1!");
50 if (Denominator != D) {
52 (Numerator *
static_cast<uint64_t>(D) + Denominator / 2) /
58 bool isZero()
const {
return N == 0; }
59 bool isOne()
const {
return N == D; }
80 template <
class ProbabilityIter>
84 template <
class ProbabilityContainer>
91 double toDouble()
const {
return static_cast<double>(N) / D; }
98#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
122 assert(N != UnknownN &&
RHS.N != UnknownN &&
123 "Unknown probability cannot participate in arithmetics.");
130 assert(N != UnknownN &&
RHS.N != UnknownN &&
131 "Unknown probability cannot participate in arithmetics.");
133 N = N <
RHS.N ? 0 : N -
RHS.N;
138 assert(N != UnknownN &&
RHS.N != UnknownN &&
139 "Unknown probability cannot participate in arithmetics.");
140 N = (
static_cast<uint64_t>(N) *
RHS.N + D / 2) / D;
146 "Unknown probability cannot participate in arithmetics.");
152 assert(N != UnknownN &&
RHS.N != UnknownN &&
153 "Unknown probability cannot participate in arithmetics.");
160 "Unknown probability cannot participate in arithmetics.");
161 assert(
RHS > 0 &&
"The divider cannot be zero.");
167 BranchProbability Prob(*
this);
173 BranchProbability Prob(*
this);
179 BranchProbability Prob(*
this);
185 BranchProbability Prob(*
this);
191 BranchProbability Prob(*
this);
197 BranchProbability Prob(*
this);
206 assert(N != UnknownN &&
RHS.N != UnknownN &&
207 "Unknown probability cannot participate in comparisons.");
212 assert(N != UnknownN &&
RHS.N != UnknownN &&
213 "Unknown probability cannot participate in comparisons.");
218 assert(N != UnknownN &&
RHS.N != UnknownN &&
219 "Unknown probability cannot participate in comparisons.");
220 return !(
RHS < *
this);
224 assert(N != UnknownN &&
RHS.N != UnknownN &&
225 "Unknown probability cannot participate in comparisons.");
226 return !(*
this <
RHS);
231 return Prob.
print(OS);
234template <
class ProbabilityIter>
236 ProbabilityIter End) {
240 unsigned UnknownProbCount = 0;
242 [&](
uint64_t S,
const BranchProbability &BP) {
249 if (UnknownProbCount > 0) {
258 std::replace_if(Begin, End,
259 [](
const BranchProbability &BP) {
return BP.
isUnknown(); },
267 BranchProbability BP(1, std::distance(Begin, End));
268 std::fill(Begin, End, BP);
272 for (
auto I = Begin;
I != End; ++
I)
assert(UImm &&(UImm !=~static_cast< T >(0)) &&"Invalid immediate!")
#define LLVM_DUMP_METHOD
Mark debug helper function definitions like dump() that should not be stripped from debug builds.
LLVM_DUMP_METHOD void dump() const
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
static constexpr BranchProbability getOne()
BranchProbability operator-(BranchProbability RHS) const
BranchProbability & operator-=(BranchProbability RHS)
constexpr BranchProbability(uint32_t Numerator, uint32_t Denominator)
static uint32_t getDenominator()
bool operator<(BranchProbability RHS) const
bool operator!=(BranchProbability RHS) const
bool operator==(BranchProbability RHS) const
constexpr BranchProbability()
BranchProbability operator/(uint32_t RHS) const
BranchProbability & operator/=(BranchProbability RHS)
LLVM_ABI BranchProbability pow(unsigned N) const
Compute pow(Probability, N).
bool operator<=(BranchProbability RHS) const
LLVM_ABI raw_ostream & print(raw_ostream &OS) const
BranchProbability & operator*=(BranchProbability RHS)
static constexpr BranchProbability getUnknown()
LLVM_ABI uint64_t scaleByInverse(uint64_t Num) const
Scale a large integer by the inverse.
static constexpr BranchProbability getZero()
BranchProbability operator*(BranchProbability RHS) const
BranchProbability operator/(BranchProbability RHS) const
uint32_t getNumerator() const
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
static void normalizeProbabilities(ProbabilityContainer &&R)
BranchProbability operator+(BranchProbability RHS) const
bool operator>=(BranchProbability RHS) const
BranchProbability operator*(uint32_t RHS) const
BranchProbability & operator*=(uint32_t RHS)
BranchProbability getCompl() const
BranchProbability & operator+=(BranchProbability RHS)
BranchProbability & operator/=(uint32_t RHS)
static constexpr BranchProbability getRaw(uint32_t N)
bool operator>(BranchProbability RHS) const
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
This class implements an extremely fast bulk output stream that can only output to a stream.
This is an optimization pass for GlobalISel generic memory operations.
constexpr auto adl_begin(RangeT &&range) -> decltype(adl_detail::begin_impl(std::forward< RangeT >(range)))
Returns the begin iterator to range using std::begin and function found through Argument-Dependent Lo...
constexpr auto adl_end(RangeT &&range) -> decltype(adl_detail::end_impl(std::forward< RangeT >(range)))
Returns the end iterator to range using std::end and functions found through Argument-Dependent Looku...
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)