X-Git-Url: http://plrg.eecs.uci.edu/git/?a=blobdiff_plain;f=unittests%2FSupport%2FBlockFrequencyTest.cpp;h=0eac8bb8811bcc01f92c49a2a23af980d51b6472;hb=5d3a9d6339b9493d32632fd7585e67c8269e2c27;hp=ac3cedf18695d0ccd7ea933d4dea1c21394160f1;hpb=341473c86d19cad5f3be432533ecdb42d9e07044;p=oota-llvm.git diff --git a/unittests/Support/BlockFrequencyTest.cpp b/unittests/Support/BlockFrequencyTest.cpp index ac3cedf1869..0eac8bb8811 100644 --- a/unittests/Support/BlockFrequencyTest.cpp +++ b/unittests/Support/BlockFrequencyTest.cpp @@ -1,7 +1,15 @@ -#include "llvm/Support/DataTypes.h" +//===- unittests/Support/BlockFrequencyTest.cpp - BlockFrequency tests ----===// +// +// The LLVM Compiler Infrastructure +// +// This file is distributed under the University of Illinois Open Source +// License. See LICENSE.TXT for details. +// +//===----------------------------------------------------------------------===// + #include "llvm/Support/BlockFrequency.h" #include "llvm/Support/BranchProbability.h" - +#include "llvm/Support/DataTypes.h" #include "gtest/gtest.h" #include @@ -14,6 +22,10 @@ TEST(BlockFrequencyTest, OneToZero) { BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX); Freq *= Prob; EXPECT_EQ(Freq.getFrequency(), 0u); + + Freq = BlockFrequency(1); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), 0u); } TEST(BlockFrequencyTest, OneToOne) { @@ -21,6 +33,10 @@ TEST(BlockFrequencyTest, OneToOne) { BranchProbability Prob(UINT32_MAX, UINT32_MAX); Freq *= Prob; EXPECT_EQ(Freq.getFrequency(), 1u); + + Freq = BlockFrequency(1); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), 1u); } TEST(BlockFrequencyTest, ThreeToOne) { @@ -28,13 +44,21 @@ TEST(BlockFrequencyTest, ThreeToOne) { BranchProbability Prob(3000000, 9000000); Freq *= Prob; EXPECT_EQ(Freq.getFrequency(), 1u); + + Freq = BlockFrequency(3); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), 1u); } TEST(BlockFrequencyTest, MaxToHalfMax) { BlockFrequency Freq(UINT64_MAX); BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX); Freq *= Prob; - EXPECT_EQ(Freq.getFrequency(), 9223372034707292159LLu); + EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL); + + Freq = BlockFrequency(UINT64_MAX); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL); } TEST(BlockFrequencyTest, BigToBig) { @@ -44,6 +68,10 @@ TEST(BlockFrequencyTest, BigToBig) { BranchProbability Prob(P, P); Freq *= Prob; EXPECT_EQ(Freq.getFrequency(), Big); + + Freq = BlockFrequency(Big); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), Big); } TEST(BlockFrequencyTest, MaxToMax) { @@ -51,26 +79,44 @@ TEST(BlockFrequencyTest, MaxToMax) { BranchProbability Prob(UINT32_MAX, UINT32_MAX); Freq *= Prob; EXPECT_EQ(Freq.getFrequency(), UINT64_MAX); + + // This additionally makes sure if we have a value equal to our saturating + // value, we do not signal saturation if the result equals said value, but + // saturating does not occur. + Freq = BlockFrequency(UINT64_MAX); + Freq *= Prob; + EXPECT_EQ(Freq.getFrequency(), UINT64_MAX); +} + +TEST(BlockFrequency, Divide) { + BlockFrequency Freq(0x3333333333333333ULL); + Freq /= BranchProbability(1, 2); + EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL); +} + +TEST(BlockFrequencyTest, Saturate) { + BlockFrequency Freq(0x3333333333333333ULL); + Freq /= BranchProbability(100, 300); + EXPECT_EQ(Freq.getFrequency(), 0x9999999999999999ULL); + Freq /= BranchProbability(1, 2); + EXPECT_EQ(Freq.getFrequency(), UINT64_MAX); + + Freq = 0x1000000000000000ULL; + Freq /= BranchProbability(10000, 160000); + EXPECT_EQ(Freq.getFrequency(), UINT64_MAX); + + // Try to cheat the multiplication overflow check. + Freq = 0x00000001f0000001ull; + Freq /= BranchProbability(1000, 0xf000000f); + EXPECT_EQ(33506781356485509ULL, Freq.getFrequency()); } -TEST(BlockFrequencyTest, ProbabilityCompare) { - BranchProbability A(4, 5); - BranchProbability B(4U << 29, 5U << 29); - BranchProbability C(3, 4); - - EXPECT_TRUE(A == B); - EXPECT_FALSE(A != B); - EXPECT_FALSE(A < B); - EXPECT_FALSE(A > B); - EXPECT_TRUE(A <= B); - EXPECT_TRUE(A >= B); - - EXPECT_FALSE(B == C); - EXPECT_TRUE(B != C); - EXPECT_FALSE(B < C); - EXPECT_TRUE(B > C); - EXPECT_FALSE(B <= C); - EXPECT_TRUE(B >= C); +TEST(BlockFrequencyTest, SaturatingRightShift) { + BlockFrequency Freq(0x10080ULL); + Freq >>= 2; + EXPECT_EQ(Freq.getFrequency(), 0x4020ULL); + Freq >>= 20; + EXPECT_EQ(Freq.getFrequency(), 0x1ULL); } }