diff --git a/include/llvm/Support/BranchProbability.h b/include/llvm/Support/BranchProbability.h index dd43857fa22..98b2a3d7d9a 100644 --- a/include/llvm/Support/BranchProbability.h +++ b/include/llvm/Support/BranchProbability.h @@ -79,8 +79,20 @@ public: /// \return \c Num divided by \c this. uint64_t scaleByInverse(uint64_t Num) const; - BranchProbability &operator+=(BranchProbability RHS); - BranchProbability &operator-=(BranchProbability RHS); + BranchProbability &operator+=(BranchProbability RHS) { + assert(N <= D - RHS.N && + "The sum of branch probabilities should not exceed one!"); + 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; + return *this; + } + BranchProbability &operator*=(BranchProbability RHS) { N = (static_cast(N) * RHS.N + D / 2) / D; return *this; diff --git a/lib/Support/BranchProbability.cpp b/lib/Support/BranchProbability.cpp index 47b06c2e0ff..3b0f6e6f06e 100644 --- a/lib/Support/BranchProbability.cpp +++ b/lib/Support/BranchProbability.cpp @@ -19,20 +19,13 @@ using namespace llvm; +const uint32_t BranchProbability::D; + raw_ostream &BranchProbability::print(raw_ostream &OS) const { - auto GetHexDigit = [](int Val) -> char { - assert(Val < 16); - if (Val < 10) - return '0' + Val; - return 'a' + Val - 10; - }; - OS << "0x"; - for (int Digits = 0; Digits < 8; ++Digits) - OS << GetHexDigit(N >> (28 - Digits * 4) & 0xf); - OS << " / 0x"; - for (int Digits = 0; Digits < 8; ++Digits) - OS << GetHexDigit(D >> (28 - Digits * 4) & 0xf); - OS << " = " << format("%.2f%%", ((double)N / D) * 100.0); + // Get a percentage rounded to two decimal digits. This avoids + // implementation-defined rounding inside printf. + double Percent = rint(((double)N / D) * 100.0 * 100.0) / 100.0; + OS << format("0x%08" PRIx32 " / 0x%08" PRIx32 " = %.2f%%", N, D, Percent); return OS; } @@ -50,25 +43,11 @@ BranchProbability::BranchProbability(uint32_t Numerator, uint32_t Denominator) { } } -BranchProbability &BranchProbability::operator+=(BranchProbability RHS) { - assert(N <= D - RHS.N && - "The sum of branch probabilities should not exceed one!"); - N += RHS.N; - return *this; -} - -BranchProbability &BranchProbability::operator-=(BranchProbability RHS) { - assert(N >= RHS.N && - "Can only subtract a smaller probability from a larger one!"); - N -= RHS.N; - return *this; -} - // If ConstD is not zero, then replace D by ConstD so that division and modulo // operations by D can be optimized, in case this function is not inlined by the // compiler. template -inline uint64_t scale(uint64_t Num, uint32_t N, uint32_t D) { +static uint64_t scale(uint64_t Num, uint32_t N, uint32_t D) { if (ConstD > 0) D = ConstD;