diff options
author | Michael Gottesman <mgottesman@apple.com> | 2013-12-14 02:24:22 +0000 |
---|---|---|
committer | Michael Gottesman <mgottesman@apple.com> | 2013-12-14 02:24:22 +0000 |
commit | 1b98ef1c19082fb49bf6db7b008eec33361e1080 (patch) | |
tree | 2a14da4524f8fd0aa01a5405b03fe23a36dad9d5 | |
parent | 7cc5f793bc858e4be4fbf532942d14013f123e55 (diff) | |
download | llvm-1b98ef1c19082fb49bf6db7b008eec33361e1080.tar.gz llvm-1b98ef1c19082fb49bf6db7b008eec33361e1080.tar.bz2 llvm-1b98ef1c19082fb49bf6db7b008eec33361e1080.tar.xz |
[block-freq] Add a right shift to BlockFrequency that saturates at 1.
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@197302 91177308-0d34-0410-b5e6-96231b3b80d8
-rw-r--r-- | include/llvm/Support/BlockFrequency.h | 3 | ||||
-rw-r--r-- | lib/Support/BlockFrequency.cpp | 12 | ||||
-rw-r--r-- | unittests/Support/BlockFrequencyTest.cpp | 8 |
3 files changed, 23 insertions, 0 deletions
diff --git a/include/llvm/Support/BlockFrequency.h b/include/llvm/Support/BlockFrequency.h index 997d11e47a..dae520b54e 100644 --- a/include/llvm/Support/BlockFrequency.h +++ b/include/llvm/Support/BlockFrequency.h @@ -55,6 +55,9 @@ public: BlockFrequency &operator+=(const BlockFrequency &Freq); const BlockFrequency operator+(const BlockFrequency &Freq) const; + /// \brief Shift block frequency to the right by count digits saturating to 1. + BlockFrequency &operator>>=(const unsigned count); + /// \brief Scale the given BlockFrequency by N/D. Return the remainder from /// the division by D. Upon overflow, the routine will saturate. uint32_t scale(const BranchProbability &Prob); diff --git a/lib/Support/BlockFrequency.cpp b/lib/Support/BlockFrequency.cpp index d1f8408dfc..00cf75bd5c 100644 --- a/lib/Support/BlockFrequency.cpp +++ b/lib/Support/BlockFrequency.cpp @@ -145,6 +145,18 @@ BlockFrequency::operator+(const BlockFrequency &Prob) const { return Freq; } +BlockFrequency &BlockFrequency::operator>>=(const unsigned count) { + // Frequency can never be 0 by design. + assert(Frequency != 0); + + // Shift right by count. + Frequency >>= count; + + // Saturate to 1 if we are 0. + Frequency |= Frequency == 0; + return *this; +} + uint32_t BlockFrequency::scale(const BranchProbability &Prob) { return scale(Prob.getNumerator(), Prob.getDenominator()); } diff --git a/unittests/Support/BlockFrequencyTest.cpp b/unittests/Support/BlockFrequencyTest.cpp index ffdea2c179..c318451504 100644 --- a/unittests/Support/BlockFrequencyTest.cpp +++ b/unittests/Support/BlockFrequencyTest.cpp @@ -237,4 +237,12 @@ TEST(BlockFrequencyTest, ProbabilityCompare) { EXPECT_FALSE(BigZero >= BigOne); } +TEST(BlockFrequencyTest, SaturatingRightShift) { + BlockFrequency Freq(0x10080ULL); + Freq >>= 2; + EXPECT_EQ(Freq.getFrequency(), 0x4020ULL); + Freq >>= 20; + EXPECT_EQ(Freq.getFrequency(), 0x1ULL); +} + } |