19ffa6cd6SDuncan P. N. Exon Smith //===- unittests/Support/BlockFrequencyTest.cpp - BlockFrequency tests ----===//
29ffa6cd6SDuncan P. N. Exon Smith //
3*2946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4*2946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
5*2946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
69ffa6cd6SDuncan P. N. Exon Smith //
79ffa6cd6SDuncan P. N. Exon Smith //===----------------------------------------------------------------------===//
89ffa6cd6SDuncan P. N. Exon Smith 
98a3d4c43SJakub Staszak #include "llvm/Support/BlockFrequency.h"
108a3d4c43SJakub Staszak #include "llvm/Support/BranchProbability.h"
11130cec21SChandler Carruth #include "llvm/Support/DataTypes.h"
128a3d4c43SJakub Staszak #include "gtest/gtest.h"
138a3d4c43SJakub Staszak #include <climits>
148a3d4c43SJakub Staszak 
158a3d4c43SJakub Staszak using namespace llvm;
168a3d4c43SJakub Staszak 
178a3d4c43SJakub Staszak namespace {
188a3d4c43SJakub Staszak 
TEST(BlockFrequencyTest,OneToZero)198a3d4c43SJakub Staszak TEST(BlockFrequencyTest, OneToZero) {
208a3d4c43SJakub Staszak   BlockFrequency Freq(1);
2115ea0163SCong Hou   BranchProbability Prob(UINT32_MAX / 3, UINT32_MAX);
228a3d4c43SJakub Staszak   Freq *= Prob;
23bfb84d0bSBenjamin Kramer   EXPECT_EQ(Freq.getFrequency(), 0u);
244d078a3dSMichael Gottesman 
254d078a3dSMichael Gottesman   Freq = BlockFrequency(1);
26547183bfSDuncan P. N. Exon Smith   Freq *= Prob;
274d078a3dSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), 0u);
288a3d4c43SJakub Staszak }
298a3d4c43SJakub Staszak 
TEST(BlockFrequencyTest,OneToOne)308a3d4c43SJakub Staszak TEST(BlockFrequencyTest, OneToOne) {
318a3d4c43SJakub Staszak   BlockFrequency Freq(1);
328a3d4c43SJakub Staszak   BranchProbability Prob(UINT32_MAX, UINT32_MAX);
338a3d4c43SJakub Staszak   Freq *= Prob;
348a3d4c43SJakub Staszak   EXPECT_EQ(Freq.getFrequency(), 1u);
354d078a3dSMichael Gottesman 
364d078a3dSMichael Gottesman   Freq = BlockFrequency(1);
37547183bfSDuncan P. N. Exon Smith   Freq *= Prob;
384d078a3dSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), 1u);
398a3d4c43SJakub Staszak }
408a3d4c43SJakub Staszak 
TEST(BlockFrequencyTest,ThreeToOne)418a3d4c43SJakub Staszak TEST(BlockFrequencyTest, ThreeToOne) {
428a3d4c43SJakub Staszak   BlockFrequency Freq(3);
438a3d4c43SJakub Staszak   BranchProbability Prob(3000000, 9000000);
448a3d4c43SJakub Staszak   Freq *= Prob;
458a3d4c43SJakub Staszak   EXPECT_EQ(Freq.getFrequency(), 1u);
464d078a3dSMichael Gottesman 
474d078a3dSMichael Gottesman   Freq = BlockFrequency(3);
48547183bfSDuncan P. N. Exon Smith   Freq *= Prob;
494d078a3dSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), 1u);
508a3d4c43SJakub Staszak }
518a3d4c43SJakub Staszak 
TEST(BlockFrequencyTest,MaxToHalfMax)528a3d4c43SJakub Staszak TEST(BlockFrequencyTest, MaxToHalfMax) {
538a3d4c43SJakub Staszak   BlockFrequency Freq(UINT64_MAX);
548a3d4c43SJakub Staszak   BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
558a3d4c43SJakub Staszak   Freq *= Prob;
5615ea0163SCong Hou   EXPECT_EQ(Freq.getFrequency(), 9223372036854775807ULL);
574d078a3dSMichael Gottesman 
584d078a3dSMichael Gottesman   Freq = BlockFrequency(UINT64_MAX);
59547183bfSDuncan P. N. Exon Smith   Freq *= Prob;
6015ea0163SCong Hou   EXPECT_EQ(Freq.getFrequency(), 9223372036854775807ULL);
618a3d4c43SJakub Staszak }
628a3d4c43SJakub Staszak 
TEST(BlockFrequencyTest,BigToBig)638a3d4c43SJakub Staszak TEST(BlockFrequencyTest, BigToBig) {
648a3d4c43SJakub Staszak   const uint64_t Big = 387246523487234346LL;
658a3d4c43SJakub Staszak   const uint32_t P = 123456789;
668a3d4c43SJakub Staszak   BlockFrequency Freq(Big);
678a3d4c43SJakub Staszak   BranchProbability Prob(P, P);
688a3d4c43SJakub Staszak   Freq *= Prob;
698a3d4c43SJakub Staszak   EXPECT_EQ(Freq.getFrequency(), Big);
704d078a3dSMichael Gottesman 
714d078a3dSMichael Gottesman   Freq = BlockFrequency(Big);
72547183bfSDuncan P. N. Exon Smith   Freq *= Prob;
734d078a3dSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), Big);
748a3d4c43SJakub Staszak }
758a3d4c43SJakub Staszak 
TEST(BlockFrequencyTest,MaxToMax)768a3d4c43SJakub Staszak TEST(BlockFrequencyTest, MaxToMax) {
778a3d4c43SJakub Staszak   BlockFrequency Freq(UINT64_MAX);
788a3d4c43SJakub Staszak   BranchProbability Prob(UINT32_MAX, UINT32_MAX);
798a3d4c43SJakub Staszak   Freq *= Prob;
808a3d4c43SJakub Staszak   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
814d078a3dSMichael Gottesman 
824d078a3dSMichael Gottesman   // This additionally makes sure if we have a value equal to our saturating
834d078a3dSMichael Gottesman   // value, we do not signal saturation if the result equals said value, but
844d078a3dSMichael Gottesman   // saturating does not occur.
854d078a3dSMichael Gottesman   Freq = BlockFrequency(UINT64_MAX);
86547183bfSDuncan P. N. Exon Smith   Freq *= Prob;
874d078a3dSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
884d078a3dSMichael Gottesman }
894d078a3dSMichael Gottesman 
TEST(BlockFrequencyTest,Subtract)9061e13de4SCong Hou TEST(BlockFrequencyTest, Subtract) {
9161e13de4SCong Hou   BlockFrequency Freq1(0), Freq2(1);
9261e13de4SCong Hou   EXPECT_EQ((Freq1 - Freq2).getFrequency(), 0u);
9361e13de4SCong Hou   EXPECT_EQ((Freq2 - Freq1).getFrequency(), 1u);
9461e13de4SCong Hou }
9561e13de4SCong Hou 
TEST(BlockFrequency,Divide)96c506e5d9SJakob Stoklund Olesen TEST(BlockFrequency, Divide) {
97c506e5d9SJakob Stoklund Olesen   BlockFrequency Freq(0x3333333333333333ULL);
98c506e5d9SJakob Stoklund Olesen   Freq /= BranchProbability(1, 2);
99c506e5d9SJakob Stoklund Olesen   EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
100c506e5d9SJakob Stoklund Olesen }
101c506e5d9SJakob Stoklund Olesen 
TEST(BlockFrequencyTest,Saturate)102c506e5d9SJakob Stoklund Olesen TEST(BlockFrequencyTest, Saturate) {
103c506e5d9SJakob Stoklund Olesen   BlockFrequency Freq(0x3333333333333333ULL);
104c506e5d9SJakob Stoklund Olesen   Freq /= BranchProbability(100, 300);
10515ea0163SCong Hou   EXPECT_EQ(Freq.getFrequency(), 0x9999999866666668ULL);
106c506e5d9SJakob Stoklund Olesen   Freq /= BranchProbability(1, 2);
107c506e5d9SJakob Stoklund Olesen   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
108c506e5d9SJakob Stoklund Olesen 
109c506e5d9SJakob Stoklund Olesen   Freq = 0x1000000000000000ULL;
11015ea0163SCong Hou   Freq /= BranchProbability(10000, 170000);
111c506e5d9SJakob Stoklund Olesen   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
1123192b2fcSJakob Stoklund Olesen 
1133192b2fcSJakob Stoklund Olesen   // Try to cheat the multiplication overflow check.
1143192b2fcSJakob Stoklund Olesen   Freq = 0x00000001f0000001ull;
1153192b2fcSJakob Stoklund Olesen   Freq /= BranchProbability(1000, 0xf000000f);
11615ea0163SCong Hou   EXPECT_EQ(33527736066704712ULL, Freq.getFrequency());
117c506e5d9SJakob Stoklund Olesen }
118c506e5d9SJakob Stoklund Olesen 
TEST(BlockFrequencyTest,SaturatingRightShift)1198f17dccdSMichael Gottesman TEST(BlockFrequencyTest, SaturatingRightShift) {
1208f17dccdSMichael Gottesman   BlockFrequency Freq(0x10080ULL);
1218f17dccdSMichael Gottesman   Freq >>= 2;
1228f17dccdSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
1238f17dccdSMichael Gottesman   Freq >>= 20;
1248f17dccdSMichael Gottesman   EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
1258f17dccdSMichael Gottesman }
1268f17dccdSMichael Gottesman 
1278a3d4c43SJakub Staszak }
128