Let += and -= operators in BranchProbability have saturation behaviors.

This commit is for a later patch that is depend on it. The sum of two
branch probabilities can be greater than 1 due to rounding. It is safer
to saturate the results of sum and subtraction.

llvm-svn: 253421
This commit is contained in:
Cong Hou 2015-11-18 01:20:37 +00:00
parent 2a40fb78c0
commit e8c455d90e
1 changed files with 4 additions and 6 deletions

View File

@ -92,16 +92,14 @@ public:
uint64_t scaleByInverse(uint64_t Num) const;
BranchProbability &operator+=(BranchProbability RHS) {
assert(N <= D - RHS.N &&
"The sum of branch probabilities should not exceed one!");
N += RHS.N;
// Saturate the result in case of overflow.
N = (uint64_t(N) + RHS.N > D) ? D : N + RHS.N;
return *this;
}
BranchProbability &operator-=(BranchProbability RHS) {
assert(N >= RHS.N &&
"Can only subtract a smaller probability from a larger one!");
N -= RHS.N;
// Saturate the result in case of underflow.
N = N < RHS.N ? 0 : N - RHS.N;
return *this;
}