]>
git.proxmox.com Git - rustc.git/blob - src/llvm/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"
11 TEST(BlockFrequencyTest
, OneToZero
) {
12 BlockFrequency
Freq(1);
13 BranchProbability
Prob(UINT32_MAX
- 1, UINT32_MAX
);
15 EXPECT_EQ(Freq
.getFrequency(), 0u);
17 Freq
= BlockFrequency(1);
19 EXPECT_EQ(Freq
.getFrequency(), 0u);
22 TEST(BlockFrequencyTest
, OneToOne
) {
23 BlockFrequency
Freq(1);
24 BranchProbability
Prob(UINT32_MAX
, UINT32_MAX
);
26 EXPECT_EQ(Freq
.getFrequency(), 1u);
28 Freq
= BlockFrequency(1);
30 EXPECT_EQ(Freq
.getFrequency(), 1u);
33 TEST(BlockFrequencyTest
, ThreeToOne
) {
34 BlockFrequency
Freq(3);
35 BranchProbability
Prob(3000000, 9000000);
37 EXPECT_EQ(Freq
.getFrequency(), 1u);
39 Freq
= BlockFrequency(3);
41 EXPECT_EQ(Freq
.getFrequency(), 1u);
44 TEST(BlockFrequencyTest
, MaxToHalfMax
) {
45 BlockFrequency
Freq(UINT64_MAX
);
46 BranchProbability
Prob(UINT32_MAX
/ 2, UINT32_MAX
);
48 EXPECT_EQ(Freq
.getFrequency(), 9223372034707292159ULL);
50 Freq
= BlockFrequency(UINT64_MAX
);
52 EXPECT_EQ(Freq
.getFrequency(), 9223372034707292159ULL);
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
);
61 EXPECT_EQ(Freq
.getFrequency(), Big
);
63 Freq
= BlockFrequency(Big
);
65 EXPECT_EQ(Freq
.getFrequency(), Big
);
68 TEST(BlockFrequencyTest
, MaxToMax
) {
69 BlockFrequency
Freq(UINT64_MAX
);
70 BranchProbability
Prob(UINT32_MAX
, UINT32_MAX
);
72 EXPECT_EQ(Freq
.getFrequency(), UINT64_MAX
);
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
);
79 EXPECT_EQ(Freq
.getFrequency(), UINT64_MAX
);
82 TEST(BlockFrequency
, Divide
) {
83 BlockFrequency
Freq(0x3333333333333333ULL
);
84 Freq
/= BranchProbability(1, 2);
85 EXPECT_EQ(Freq
.getFrequency(), 0x6666666666666666ULL
);
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
);
95 Freq
= 0x1000000000000000ULL
;
96 Freq
/= BranchProbability(10000, 160000);
97 EXPECT_EQ(Freq
.getFrequency(), UINT64_MAX
);
99 // Try to cheat the multiplication overflow check.
100 Freq
= 0x00000001f0000001ull
;
101 Freq
/= BranchProbability(1000, 0xf000000f);
102 EXPECT_EQ(33506781356485509ULL, Freq
.getFrequency());
105 TEST(BlockFrequencyTest
, SaturatingRightShift
) {
106 BlockFrequency
Freq(0x10080ULL
);
108 EXPECT_EQ(Freq
.getFrequency(), 0x4020ULL
);
110 EXPECT_EQ(Freq
.getFrequency(), 0x1ULL
);