From: Nathan Slingerland Date: Wed, 18 Nov 2015 00:55:15 +0000 (+0000) Subject: Revert "[llvm-profdata] Add SaturatingAdd/SaturatingMultiply Helper Functions" X-Git-Url: http://plrg.eecs.uci.edu/git/?p=oota-llvm.git;a=commitdiff_plain;h=d4cf58476e0af9e62fbf868221e5f59547c682df Revert "[llvm-profdata] Add SaturatingAdd/SaturatingMultiply Helper Functions" Not ready for merge. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@253415 91177308-0d34-0410-b5e6-96231b3b80d8 --- diff --git a/include/llvm/ProfileData/InstrProf.h b/include/llvm/ProfileData/InstrProf.h index 384edddf85a..aa100a796f2 100644 --- a/include/llvm/ProfileData/InstrProf.h +++ b/include/llvm/ProfileData/InstrProf.h @@ -226,7 +226,7 @@ struct InstrProfValueSiteRecord { while (I != IE && I->Value < J->Value) ++I; if (I != IE && I->Value == J->Value) { - I->Count = SaturatingAdd(I->Count, J->Count); + I->Count += J->Count; ++I; continue; } diff --git a/include/llvm/ProfileData/SampleProf.h b/include/llvm/ProfileData/SampleProf.h index a8960cf7bc1..d7596d7b1b7 100644 --- a/include/llvm/ProfileData/SampleProf.h +++ b/include/llvm/ProfileData/SampleProf.h @@ -173,7 +173,10 @@ public: /// Sample counts accumulate using saturating arithmetic, to avoid wrapping /// around unsigned integers. void addSamples(uint64_t S) { - NumSamples = SaturatingAdd(NumSamples, S); + if (NumSamples <= std::numeric_limits::max() - S) + NumSamples += S; + else + NumSamples = std::numeric_limits::max(); } /// Add called function \p F with samples \p S. @@ -182,7 +185,10 @@ public: /// around unsigned integers. void addCalledTarget(StringRef F, uint64_t S) { uint64_t &TargetSamples = CallTargets[F]; - TargetSamples = SaturatingAdd(TargetSamples, S); + if (TargetSamples <= std::numeric_limits::max() - S) + TargetSamples += S; + else + TargetSamples = std::numeric_limits::max(); } /// Return true if this sample record contains function calls. diff --git a/include/llvm/Support/MathExtras.h b/include/llvm/Support/MathExtras.h index b7b3c02dcfe..2c515bbd242 100644 --- a/include/llvm/Support/MathExtras.h +++ b/include/llvm/Support/MathExtras.h @@ -653,32 +653,6 @@ inline int64_t SignExtend64(uint64_t X, unsigned B) { return int64_t(X << (64 - B)) >> (64 - B); } -/// \brief Add two unsigned integers, X and Y, of type T. -/// Clamp the result to the maximum representable value of T on overflow. -template -typename std::enable_if::value, T>::type -SaturatingAdd(T X, T Y) { - // Hacker's Delight, p. 29 - T Z = X + Y; - if (Z < X || Z < Y) - return std::numeric_limits::max(); - else - return Z; -} - -/// \brief Multiply two unsigned integers, X and Y, of type T. -/// Clamp the result to the maximum representable value of T on overflow. -template -typename std::enable_if::value, T>::type -SaturatingMultiply(T X, T Y) { - // Hacker's Delight, p. 30 - T Z = X * Y; - if (Y != 0 && Z / Y != X) - return std::numeric_limits::max(); - else - return Z; -} - extern const float huge_valf; } // End llvm namespace diff --git a/unittests/Support/MathExtrasTest.cpp b/unittests/Support/MathExtrasTest.cpp index 8adde02ed4e..8bd47e34c7e 100644 --- a/unittests/Support/MathExtrasTest.cpp +++ b/unittests/Support/MathExtrasTest.cpp @@ -190,52 +190,4 @@ TEST(MathExtras, RoundUpToAlignment) { EXPECT_EQ(552u, RoundUpToAlignment(321, 255, 42)); } -template -void SaturatingAddTestHelper() -{ - EXPECT_EQ(static_cast(3), - SaturatingAdd(static_cast(1), static_cast(2))); - EXPECT_EQ(std::numeric_limits::max(), - SaturatingAdd(std::numeric_limits::max(), static_cast(1))); - EXPECT_EQ(std::numeric_limits::max(), - SaturatingAdd(static_cast(1), std::numeric_limits::max())); - EXPECT_EQ(std::numeric_limits::max(), - SaturatingAdd(std::numeric_limits::max(), - std::numeric_limits::max())); -} - -TEST(MathExtras, SaturatingAdd) { - SaturatingAddTestHelper(); - SaturatingAddTestHelper(); - SaturatingAddTestHelper(); - SaturatingAddTestHelper(); -} - -template -void SaturatingMultiplyTestHelper() -{ - EXPECT_EQ(static_cast(0), - SaturatingMultiply(static_cast(1), static_cast(0))); - EXPECT_EQ(static_cast(0), - SaturatingMultiply(static_cast(0), static_cast(1))); - EXPECT_EQ(static_cast(6), - SaturatingMultiply(static_cast(2), static_cast(3))); - EXPECT_EQ(std::numeric_limits::max(), - SaturatingMultiply(std::numeric_limits::max(), - static_cast(2))); - EXPECT_EQ(std::numeric_limits::max(), - SaturatingMultiply(static_cast(2), - std::numeric_limits::max())); - EXPECT_EQ(std::numeric_limits::max(), - SaturatingMultiply(std::numeric_limits::max(), - std::numeric_limits::max())); -} - -TEST(MathExtras, SaturatingMultiply) { - SaturatingMultiplyTestHelper(); - SaturatingMultiplyTestHelper(); - SaturatingMultiplyTestHelper(); - SaturatingMultiplyTestHelper(); -} - }