From 2a63631abd8b2b88a2e27dd1270ec6cd4040c1d3 Mon Sep 17 00:00:00 2001 From: Benjamin Kramer Date: Sat, 26 Sep 2015 10:09:36 +0000 Subject: [BranchProbability] Manually round the floating point output. llvm::format compiles down to snprintf which has no defined rounding for floating point arguments, and MSVC has implemented it differently from what the BSD libcs and glibc do. Try to emulate the glibc rounding behavior to avoid changing tests. While there simplify code a bit and move trivial methods inline. llvm-svn: 248665 --- llvm/lib/Support/BranchProbability.cpp | 35 +++++++--------------------------- 1 file changed, 7 insertions(+), 28 deletions(-) (limited to 'llvm/lib/Support/BranchProbability.cpp') diff --git a/llvm/lib/Support/BranchProbability.cpp b/llvm/lib/Support/BranchProbability.cpp index 47b06c2e0ff..3b0f6e6f06e 100644 --- a/llvm/lib/Support/BranchProbability.cpp +++ b/llvm/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; -- cgit v1.2.3