BumpPtrAllocator: use uintptr_t when aligning addresses to avoid undefined behaviour
[oota-llvm.git] / unittests / Support / BlockFrequencyTest.cpp
1 #include "llvm/Support/BlockFrequency.h"
2 #include "llvm/Support/BranchProbability.h"
3 #include "llvm/Support/DataTypes.h"
4 #include "gtest/gtest.h"
5 #include <climits>
6
7 using namespace llvm;
8
9 namespace {
10
11 TEST(BlockFrequencyTest, OneToZero) {
12   BlockFrequency Freq(1);
13   BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX);
14   Freq *= Prob;
15   EXPECT_EQ(Freq.getFrequency(), 0u);
16
17   Freq = BlockFrequency(1);
18   Freq *= Prob;
19   EXPECT_EQ(Freq.getFrequency(), 0u);
20 }
21
22 TEST(BlockFrequencyTest, OneToOne) {
23   BlockFrequency Freq(1);
24   BranchProbability Prob(UINT32_MAX, UINT32_MAX);
25   Freq *= Prob;
26   EXPECT_EQ(Freq.getFrequency(), 1u);
27
28   Freq = BlockFrequency(1);
29   Freq *= Prob;
30   EXPECT_EQ(Freq.getFrequency(), 1u);
31 }
32
33 TEST(BlockFrequencyTest, ThreeToOne) {
34   BlockFrequency Freq(3);
35   BranchProbability Prob(3000000, 9000000);
36   Freq *= Prob;
37   EXPECT_EQ(Freq.getFrequency(), 1u);
38
39   Freq = BlockFrequency(3);
40   Freq *= Prob;
41   EXPECT_EQ(Freq.getFrequency(), 1u);
42 }
43
44 TEST(BlockFrequencyTest, MaxToHalfMax) {
45   BlockFrequency Freq(UINT64_MAX);
46   BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
47   Freq *= Prob;
48   EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
49
50   Freq = BlockFrequency(UINT64_MAX);
51   Freq *= Prob;
52   EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
53 }
54
55 TEST(BlockFrequencyTest, BigToBig) {
56   const uint64_t Big = 387246523487234346LL;
57   const uint32_t P = 123456789;
58   BlockFrequency Freq(Big);
59   BranchProbability Prob(P, P);
60   Freq *= Prob;
61   EXPECT_EQ(Freq.getFrequency(), Big);
62
63   Freq = BlockFrequency(Big);
64   Freq *= Prob;
65   EXPECT_EQ(Freq.getFrequency(), Big);
66 }
67
68 TEST(BlockFrequencyTest, MaxToMax) {
69   BlockFrequency Freq(UINT64_MAX);
70   BranchProbability Prob(UINT32_MAX, UINT32_MAX);
71   Freq *= Prob;
72   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
73
74   // This additionally makes sure if we have a value equal to our saturating
75   // value, we do not signal saturation if the result equals said value, but
76   // saturating does not occur.
77   Freq = BlockFrequency(UINT64_MAX);
78   Freq *= Prob;
79   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
80 }
81
82 TEST(BlockFrequency, Divide) {
83   BlockFrequency Freq(0x3333333333333333ULL);
84   Freq /= BranchProbability(1, 2);
85   EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
86 }
87
88 TEST(BlockFrequencyTest, Saturate) {
89   BlockFrequency Freq(0x3333333333333333ULL);
90   Freq /= BranchProbability(100, 300);
91   EXPECT_EQ(Freq.getFrequency(), 0x9999999999999999ULL);
92   Freq /= BranchProbability(1, 2);
93   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
94
95   Freq = 0x1000000000000000ULL;
96   Freq /= BranchProbability(10000, 160000);
97   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
98
99   // Try to cheat the multiplication overflow check.
100   Freq = 0x00000001f0000001ull;
101   Freq /= BranchProbability(1000, 0xf000000f);
102   EXPECT_EQ(33506781356485509ULL, Freq.getFrequency());
103 }
104
105 TEST(BlockFrequencyTest, SaturatingRightShift) {
106   BlockFrequency Freq(0x10080ULL);
107   Freq >>= 2;
108   EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
109   Freq >>= 20;
110   EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
111 }
112
113 }