summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorMichael Gottesman <mgottesman@apple.com>2013-12-14 02:24:22 +0000
committerMichael Gottesman <mgottesman@apple.com>2013-12-14 02:24:22 +0000
commit1b98ef1c19082fb49bf6db7b008eec33361e1080 (patch)
tree2a14da4524f8fd0aa01a5405b03fe23a36dad9d5
parent7cc5f793bc858e4be4fbf532942d14013f123e55 (diff)
downloadllvm-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.h3
-rw-r--r--lib/Support/BlockFrequency.cpp12
-rw-r--r--unittests/Support/BlockFrequencyTest.cpp8
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);
+}
+
}