From 7b4feef4008452496f53f0da34b1e72fb3658a81 Mon Sep 17 00:00:00 2001
From: Cong Hou
Date: Wed, 18 Nov 2015 01:20:37 +0000
Subject: [PATCH] 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.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253421 91177308-0d34-0410-b5e6-96231b3b80d8
---
include/llvm/Support/BranchProbability.h | 10 ++++------
1 file changed, 4 insertions(+), 6 deletions(-)
diff --git a/include/llvm/Support/BranchProbability.h b/include/llvm/Support/BranchProbability.h
index 71c0cf9afea..1ca94ca3196 100644
--- a/include/llvm/Support/BranchProbability.h
+++ b/include/llvm/Support/BranchProbability.h
@@ -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;
}
--
2.17.1