LLVM: include/llvm/Support/BranchProbability.h Source File (original) (raw)
1
2
3
4
5
6
7
8
9
10
11
12
13#ifndef LLVM_SUPPORT_BRANCHPROBABILITY_H
14#define LLVM_SUPPORT_BRANCHPROBABILITY_H
15
19#include
20#include
21#include
22#include
23
24namespace llvm {
25
27
28
29
30
31
32class BranchProbability {
33
35
36
37 static constexpr uint32_t D = 1u << 31;
38 static constexpr uint32_t UnknownN = UINT32_MAX;
39
40
41
43
44public:
47
48 bool isZero() const { return N == 0; }
49 bool isUnknown() const { return N == UnknownN; }
50
54
55
57
60
62
63
64
65 template
67 ProbabilityIter End);
68
69 template
73
76 double toDouble() const { return static_cast<double>(N) / D; }
77
78
80
82
83#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
85#endif
86
87
88
89
90
91
92
94
95
96
97
98
99
100
102
103
105
107 assert(N != UnknownN && RHS.N != UnknownN &&
108 "Unknown probability cannot participate in arithmetics.");
109
111 return *this;
112 }
113
115 assert(N != UnknownN && RHS.N != UnknownN &&
116 "Unknown probability cannot participate in arithmetics.");
117
118 N = N < RHS.N ? 0 : N - RHS.N;
119 return *this;
120 }
121
123 assert(N != UnknownN && RHS.N != UnknownN &&
124 "Unknown probability cannot participate in arithmetics.");
125 N = (static_cast<uint64_t>(N) * RHS.N + D / 2) / D;
126 return *this;
127 }
128
130 assert(N != UnknownN &&
131 "Unknown probability cannot participate in arithmetics.");
133 return *this;
134 }
135
137 assert(N != UnknownN && RHS.N != UnknownN &&
138 "Unknown probability cannot participate in arithmetics.");
139 N = (static_cast<uint64_t>(N) * D + RHS.N / 2) / RHS.N;
140 return *this;
141 }
142
144 assert(N != UnknownN &&
145 "Unknown probability cannot participate in arithmetics.");
146 assert(RHS > 0 && "The divider cannot be zero.");
147 N /= RHS;
148 return *this;
149 }
150
151 BranchProbability operator+(BranchProbability RHS) const {
152 BranchProbability Prob(*this);
153 Prob += RHS;
154 return Prob;
155 }
156
157 BranchProbability operator-(BranchProbability RHS) const {
158 BranchProbability Prob(*this);
159 Prob -= RHS;
160 return Prob;
161 }
162
163 BranchProbability operator*(BranchProbability RHS) const {
164 BranchProbability Prob(*this);
165 Prob *= RHS;
166 return Prob;
167 }
168
170 BranchProbability Prob(*this);
171 Prob *= RHS;
172 return Prob;
173 }
174
175 BranchProbability operator/(BranchProbability RHS) const {
176 BranchProbability Prob(*this);
177 Prob /= RHS;
178 return Prob;
179 }
180
182 BranchProbability Prob(*this);
183 Prob /= RHS;
184 return Prob;
185 }
186
189
191 assert(N != UnknownN && RHS.N != UnknownN &&
192 "Unknown probability cannot participate in comparisons.");
193 return N < RHS.N;
194 }
195
197 assert(N != UnknownN && RHS.N != UnknownN &&
198 "Unknown probability cannot participate in comparisons.");
199 return RHS < *this;
200 }
201
203 assert(N != UnknownN && RHS.N != UnknownN &&
204 "Unknown probability cannot participate in comparisons.");
205 return !(RHS < *this);
206 }
207
209 assert(N != UnknownN && RHS.N != UnknownN &&
210 "Unknown probability cannot participate in comparisons.");
211 return !(*this < RHS);
212 }
213};
214
216 return Prob.print(OS);
217}
218
219template
221 ProbabilityIter End) {
222 if (Begin == End)
223 return;
224
225 unsigned UnknownProbCount = 0;
227 [&](uint64_t S, const BranchProbability &BP) {
229 return S + BP.N;
230 UnknownProbCount++;
231 return S;
232 });
233
234 if (UnknownProbCount > 0) {
236
237
238
242
243 std::replace_if(Begin, End,
244 [](const BranchProbability &BP) { return BP.isUnknown(); },
245 ProbForUnknown);
246
248 return;
249 }
250
251 if (Sum == 0) {
252 BranchProbability BP(1, std::distance(Begin, End));
253 std::fill(Begin, End, BP);
254 return;
255 }
256
257 for (auto I = Begin; I != End; ++I)
258 I->N = (I->N * uint64_t(D) + Sum / 2) / Sum;
259}
260
261}
262
263#endif
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.
Definition BranchProbability.h:32
LLVM_DUMP_METHOD void dump() const
static LLVM_ABI BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
BranchProbability operator-(BranchProbability RHS) const
Definition BranchProbability.h:157
BranchProbability & operator-=(BranchProbability RHS)
Definition BranchProbability.h:114
static uint32_t getDenominator()
Definition BranchProbability.h:75
bool operator<(BranchProbability RHS) const
Definition BranchProbability.h:190
bool operator!=(BranchProbability RHS) const
Definition BranchProbability.h:188
static BranchProbability getRaw(uint32_t N)
Definition BranchProbability.h:56
bool operator==(BranchProbability RHS) const
Definition BranchProbability.h:187
BranchProbability operator/(uint32_t RHS) const
Definition BranchProbability.h:181
BranchProbability & operator/=(BranchProbability RHS)
Definition BranchProbability.h:136
BranchProbability pow(unsigned N) const
Compute pow(Probability, N).
bool operator<=(BranchProbability RHS) const
Definition BranchProbability.h:202
static BranchProbability getOne()
Definition BranchProbability.h:52
LLVM_ABI raw_ostream & print(raw_ostream &OS) const
BranchProbability & operator*=(BranchProbability RHS)
Definition BranchProbability.h:122
LLVM_ABI uint64_t scaleByInverse(uint64_t Num) const
Scale a large integer by the inverse.
bool isZero() const
Definition BranchProbability.h:48
BranchProbability operator*(BranchProbability RHS) const
Definition BranchProbability.h:163
static BranchProbability getUnknown()
Definition BranchProbability.h:53
BranchProbability operator/(BranchProbability RHS) const
Definition BranchProbability.h:175
uint32_t getNumerator() const
Definition BranchProbability.h:74
bool isUnknown() const
Definition BranchProbability.h:49
LLVM_ABI uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability()
Definition BranchProbability.h:45
static void normalizeProbabilities(ProbabilityContainer &&R)
Definition BranchProbability.h:70
BranchProbability operator+(BranchProbability RHS) const
Definition BranchProbability.h:151
bool operator>=(BranchProbability RHS) const
Definition BranchProbability.h:208
BranchProbability operator*(uint32_t RHS) const
Definition BranchProbability.h:169
BranchProbability & operator*=(uint32_t RHS)
Definition BranchProbability.h:129
BranchProbability getCompl() const
Definition BranchProbability.h:79
BranchProbability & operator+=(BranchProbability RHS)
Definition BranchProbability.h:106
double toDouble() const
Definition BranchProbability.h:76
BranchProbability & operator/=(uint32_t RHS)
Definition BranchProbability.h:143
static BranchProbability getZero()
Definition BranchProbability.h:51
bool operator>(BranchProbability RHS) const
Definition BranchProbability.h:196
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
Definition BranchProbability.h:220
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)