blob: f6e3537de91a979bd9a217aa16011fd7e5c9fdd6 [file] [log] [blame]
Jakub Staszak8a3d4c42011-07-27 18:57:40 +00001#include "llvm/Support/BlockFrequency.h"
2#include "llvm/Support/BranchProbability.h"
Chandler Carruth130cec22012-12-04 10:23:08 +00003#include "llvm/Support/DataTypes.h"
Jakub Staszak8a3d4c42011-07-27 18:57:40 +00004#include "gtest/gtest.h"
5#include <climits>
6
7using namespace llvm;
8
9namespace {
10
11TEST(BlockFrequencyTest, OneToZero) {
12 BlockFrequency Freq(1);
13 BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX);
14 Freq *= Prob;
Benjamin Kramerbfb84d02013-06-21 20:20:27 +000015 EXPECT_EQ(Freq.getFrequency(), 0u);
Michael Gottesman4d078a32013-11-17 03:25:24 +000016
17 Freq = BlockFrequency(1);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000018 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000019 EXPECT_EQ(Freq.getFrequency(), 0u);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000020}
21
22TEST(BlockFrequencyTest, OneToOne) {
23 BlockFrequency Freq(1);
24 BranchProbability Prob(UINT32_MAX, UINT32_MAX);
25 Freq *= Prob;
26 EXPECT_EQ(Freq.getFrequency(), 1u);
Michael Gottesman4d078a32013-11-17 03:25:24 +000027
28 Freq = BlockFrequency(1);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000029 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000030 EXPECT_EQ(Freq.getFrequency(), 1u);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000031}
32
33TEST(BlockFrequencyTest, ThreeToOne) {
34 BlockFrequency Freq(3);
35 BranchProbability Prob(3000000, 9000000);
36 Freq *= Prob;
37 EXPECT_EQ(Freq.getFrequency(), 1u);
Michael Gottesman4d078a32013-11-17 03:25:24 +000038
39 Freq = BlockFrequency(3);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000040 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000041 EXPECT_EQ(Freq.getFrequency(), 1u);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000042}
43
44TEST(BlockFrequencyTest, MaxToHalfMax) {
45 BlockFrequency Freq(UINT64_MAX);
46 BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
47 Freq *= Prob;
Benjamin Kramera520de12012-06-17 14:53:53 +000048 EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
Michael Gottesman4d078a32013-11-17 03:25:24 +000049
50 Freq = BlockFrequency(UINT64_MAX);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000051 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000052 EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000053}
54
55TEST(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);
Michael Gottesman4d078a32013-11-17 03:25:24 +000062
63 Freq = BlockFrequency(Big);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000064 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000065 EXPECT_EQ(Freq.getFrequency(), Big);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000066}
67
68TEST(BlockFrequencyTest, MaxToMax) {
69 BlockFrequency Freq(UINT64_MAX);
70 BranchProbability Prob(UINT32_MAX, UINT32_MAX);
71 Freq *= Prob;
72 EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
Michael Gottesman4d078a32013-11-17 03:25:24 +000073
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);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000078 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000079 EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
Michael Gottesman4d078a32013-11-17 03:25:24 +000080}
81
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000082TEST(BlockFrequency, Divide) {
83 BlockFrequency Freq(0x3333333333333333ULL);
84 Freq /= BranchProbability(1, 2);
85 EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
86}
87
88TEST(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);
Jakob Stoklund Olesen3192b2f2013-06-28 21:51:18 +000098
99 // Try to cheat the multiplication overflow check.
100 Freq = 0x00000001f0000001ull;
101 Freq /= BranchProbability(1000, 0xf000000f);
102 EXPECT_EQ(33506781356485509ULL, Freq.getFrequency());
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +0000103}
104
Michael Gottesman8f17dcc2013-12-14 02:24:22 +0000105TEST(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
Jakub Staszak8a3d4c42011-07-27 18:57:40 +0000113}