BlockFrequencyTest.cpp 3.5 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122123124125126127
  1. //===- unittests/Support/BlockFrequencyTest.cpp - BlockFrequency tests ----===//
  2. //
  3. // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
  4. // See https://llvm.org/LICENSE.txt for license information.
  5. // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
  6. //
  7. //===----------------------------------------------------------------------===//
  8. #include "llvm/Support/BlockFrequency.h"
  9. #include "llvm/Support/BranchProbability.h"
  10. #include "llvm/Support/DataTypes.h"
  11. #include "gtest/gtest.h"
  12. #include <climits>
  13. using namespace llvm;
  14. namespace {
  15. TEST(BlockFrequencyTest, OneToZero) {
  16. BlockFrequency Freq(1);
  17. BranchProbability Prob(UINT32_MAX / 3, UINT32_MAX);
  18. Freq *= Prob;
  19. EXPECT_EQ(Freq.getFrequency(), 0u);
  20. Freq = BlockFrequency(1);
  21. Freq *= Prob;
  22. EXPECT_EQ(Freq.getFrequency(), 0u);
  23. }
  24. TEST(BlockFrequencyTest, OneToOne) {
  25. BlockFrequency Freq(1);
  26. BranchProbability Prob(UINT32_MAX, UINT32_MAX);
  27. Freq *= Prob;
  28. EXPECT_EQ(Freq.getFrequency(), 1u);
  29. Freq = BlockFrequency(1);
  30. Freq *= Prob;
  31. EXPECT_EQ(Freq.getFrequency(), 1u);
  32. }
  33. TEST(BlockFrequencyTest, ThreeToOne) {
  34. BlockFrequency Freq(3);
  35. BranchProbability Prob(3000000, 9000000);
  36. Freq *= Prob;
  37. EXPECT_EQ(Freq.getFrequency(), 1u);
  38. Freq = BlockFrequency(3);
  39. Freq *= Prob;
  40. EXPECT_EQ(Freq.getFrequency(), 1u);
  41. }
  42. TEST(BlockFrequencyTest, MaxToHalfMax) {
  43. BlockFrequency Freq(UINT64_MAX);
  44. BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
  45. Freq *= Prob;
  46. EXPECT_EQ(Freq.getFrequency(), 9223372036854775807ULL);
  47. Freq = BlockFrequency(UINT64_MAX);
  48. Freq *= Prob;
  49. EXPECT_EQ(Freq.getFrequency(), 9223372036854775807ULL);
  50. }
  51. TEST(BlockFrequencyTest, BigToBig) {
  52. const uint64_t Big = 387246523487234346LL;
  53. const uint32_t P = 123456789;
  54. BlockFrequency Freq(Big);
  55. BranchProbability Prob(P, P);
  56. Freq *= Prob;
  57. EXPECT_EQ(Freq.getFrequency(), Big);
  58. Freq = BlockFrequency(Big);
  59. Freq *= Prob;
  60. EXPECT_EQ(Freq.getFrequency(), Big);
  61. }
  62. TEST(BlockFrequencyTest, MaxToMax) {
  63. BlockFrequency Freq(UINT64_MAX);
  64. BranchProbability Prob(UINT32_MAX, UINT32_MAX);
  65. Freq *= Prob;
  66. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  67. // This additionally makes sure if we have a value equal to our saturating
  68. // value, we do not signal saturation if the result equals said value, but
  69. // saturating does not occur.
  70. Freq = BlockFrequency(UINT64_MAX);
  71. Freq *= Prob;
  72. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  73. }
  74. TEST(BlockFrequencyTest, Subtract) {
  75. BlockFrequency Freq1(0), Freq2(1);
  76. EXPECT_EQ((Freq1 - Freq2).getFrequency(), 0u);
  77. EXPECT_EQ((Freq2 - Freq1).getFrequency(), 1u);
  78. }
  79. TEST(BlockFrequency, Divide) {
  80. BlockFrequency Freq(0x3333333333333333ULL);
  81. Freq /= BranchProbability(1, 2);
  82. EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
  83. }
  84. TEST(BlockFrequencyTest, Saturate) {
  85. BlockFrequency Freq(0x3333333333333333ULL);
  86. Freq /= BranchProbability(100, 300);
  87. EXPECT_EQ(Freq.getFrequency(), 0x9999999866666668ULL);
  88. Freq /= BranchProbability(1, 2);
  89. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  90. Freq = 0x1000000000000000ULL;
  91. Freq /= BranchProbability(10000, 170000);
  92. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  93. // Try to cheat the multiplication overflow check.
  94. Freq = 0x00000001f0000001ull;
  95. Freq /= BranchProbability(1000, 0xf000000f);
  96. EXPECT_EQ(33527736066704712ULL, Freq.getFrequency());
  97. }
  98. TEST(BlockFrequencyTest, SaturatingRightShift) {
  99. BlockFrequency Freq(0x10080ULL);
  100. Freq >>= 2;
  101. EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
  102. Freq >>= 20;
  103. EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
  104. }
  105. }