blob: c1f5671815bdfbcbdc80a56bbb0e91fec15f4e6a [file] [log] [blame]
Duncan P. N. Exon Smith9ffa6cd2015-02-02 18:18:07 +00001//===- unittests/Support/BlockFrequencyTest.cpp - BlockFrequency tests ----===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000010#include "llvm/Support/BlockFrequency.h"
11#include "llvm/Support/BranchProbability.h"
Chandler Carruth130cec22012-12-04 10:23:08 +000012#include "llvm/Support/DataTypes.h"
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000013#include "gtest/gtest.h"
14#include <climits>
15
16using namespace llvm;
17
18namespace {
19
20TEST(BlockFrequencyTest, OneToZero) {
21 BlockFrequency Freq(1);
Cong Hou15ea0162015-09-25 23:09:59 +000022 BranchProbability Prob(UINT32_MAX / 3, UINT32_MAX);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000023 Freq *= Prob;
Benjamin Kramerbfb84d02013-06-21 20:20:27 +000024 EXPECT_EQ(Freq.getFrequency(), 0u);
Michael Gottesman4d078a32013-11-17 03:25:24 +000025
26 Freq = BlockFrequency(1);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000027 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000028 EXPECT_EQ(Freq.getFrequency(), 0u);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000029}
30
31TEST(BlockFrequencyTest, OneToOne) {
32 BlockFrequency Freq(1);
33 BranchProbability Prob(UINT32_MAX, UINT32_MAX);
34 Freq *= Prob;
35 EXPECT_EQ(Freq.getFrequency(), 1u);
Michael Gottesman4d078a32013-11-17 03:25:24 +000036
37 Freq = BlockFrequency(1);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000038 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000039 EXPECT_EQ(Freq.getFrequency(), 1u);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000040}
41
42TEST(BlockFrequencyTest, ThreeToOne) {
43 BlockFrequency Freq(3);
44 BranchProbability Prob(3000000, 9000000);
45 Freq *= Prob;
46 EXPECT_EQ(Freq.getFrequency(), 1u);
Michael Gottesman4d078a32013-11-17 03:25:24 +000047
48 Freq = BlockFrequency(3);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000049 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000050 EXPECT_EQ(Freq.getFrequency(), 1u);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000051}
52
53TEST(BlockFrequencyTest, MaxToHalfMax) {
54 BlockFrequency Freq(UINT64_MAX);
55 BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
56 Freq *= Prob;
Cong Hou15ea0162015-09-25 23:09:59 +000057 EXPECT_EQ(Freq.getFrequency(), 9223372036854775807ULL);
Michael Gottesman4d078a32013-11-17 03:25:24 +000058
59 Freq = BlockFrequency(UINT64_MAX);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000060 Freq *= Prob;
Cong Hou15ea0162015-09-25 23:09:59 +000061 EXPECT_EQ(Freq.getFrequency(), 9223372036854775807ULL);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000062}
63
64TEST(BlockFrequencyTest, BigToBig) {
65 const uint64_t Big = 387246523487234346LL;
66 const uint32_t P = 123456789;
67 BlockFrequency Freq(Big);
68 BranchProbability Prob(P, P);
69 Freq *= Prob;
70 EXPECT_EQ(Freq.getFrequency(), Big);
Michael Gottesman4d078a32013-11-17 03:25:24 +000071
72 Freq = BlockFrequency(Big);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000073 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000074 EXPECT_EQ(Freq.getFrequency(), Big);
Jakub Staszak8a3d4c42011-07-27 18:57:40 +000075}
76
77TEST(BlockFrequencyTest, MaxToMax) {
78 BlockFrequency Freq(UINT64_MAX);
79 BranchProbability Prob(UINT32_MAX, UINT32_MAX);
80 Freq *= Prob;
81 EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
Michael Gottesman4d078a32013-11-17 03:25:24 +000082
83 // This additionally makes sure if we have a value equal to our saturating
84 // value, we do not signal saturation if the result equals said value, but
85 // saturating does not occur.
86 Freq = BlockFrequency(UINT64_MAX);
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000087 Freq *= Prob;
Michael Gottesman4d078a32013-11-17 03:25:24 +000088 EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
Michael Gottesman4d078a32013-11-17 03:25:24 +000089}
90
Cong Hou61e13de2015-10-12 18:34:00 +000091TEST(BlockFrequencyTest, Subtract) {
92 BlockFrequency Freq1(0), Freq2(1);
93 EXPECT_EQ((Freq1 - Freq2).getFrequency(), 0u);
94 EXPECT_EQ((Freq2 - Freq1).getFrequency(), 1u);
95}
96
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000097TEST(BlockFrequency, Divide) {
98 BlockFrequency Freq(0x3333333333333333ULL);
99 Freq /= BranchProbability(1, 2);
100 EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
101}
102
103TEST(BlockFrequencyTest, Saturate) {
104 BlockFrequency Freq(0x3333333333333333ULL);
105 Freq /= BranchProbability(100, 300);
Cong Hou15ea0162015-09-25 23:09:59 +0000106 EXPECT_EQ(Freq.getFrequency(), 0x9999999866666668ULL);
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +0000107 Freq /= BranchProbability(1, 2);
108 EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
109
110 Freq = 0x1000000000000000ULL;
Cong Hou15ea0162015-09-25 23:09:59 +0000111 Freq /= BranchProbability(10000, 170000);
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +0000112 EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
Jakob Stoklund Olesen3192b2f2013-06-28 21:51:18 +0000113
114 // Try to cheat the multiplication overflow check.
115 Freq = 0x00000001f0000001ull;
116 Freq /= BranchProbability(1000, 0xf000000f);
Cong Hou15ea0162015-09-25 23:09:59 +0000117 EXPECT_EQ(33527736066704712ULL, Freq.getFrequency());
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +0000118}
119
Michael Gottesman8f17dcc2013-12-14 02:24:22 +0000120TEST(BlockFrequencyTest, SaturatingRightShift) {
121 BlockFrequency Freq(0x10080ULL);
122 Freq >>= 2;
123 EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
124 Freq >>= 20;
125 EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
126}
127
Jakub Staszak8a3d4c42011-07-27 18:57:40 +0000128}