BlockFrequencyTest.cpp 3.3 KB

123456789101112131415161718192021222324252627282930313233343536373839404142434445464748495051525354555657585960616263646566676869707172737475767778798081828384858687888990919293949596979899100101102103104105106107108109110111112113114115116117118119120121122
  1. //===- 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. #include "llvm/Support/BlockFrequency.h"
  10. #include "llvm/Support/BranchProbability.h"
  11. #include "llvm/Support/DataTypes.h"
  12. #include "gtest/gtest.h"
  13. #include <climits>
  14. using namespace llvm;
  15. namespace {
  16. TEST(BlockFrequencyTest, OneToZero) {
  17. BlockFrequency Freq(1);
  18. BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX);
  19. Freq *= Prob;
  20. EXPECT_EQ(Freq.getFrequency(), 0u);
  21. Freq = BlockFrequency(1);
  22. Freq *= Prob;
  23. EXPECT_EQ(Freq.getFrequency(), 0u);
  24. }
  25. TEST(BlockFrequencyTest, OneToOne) {
  26. BlockFrequency Freq(1);
  27. BranchProbability Prob(UINT32_MAX, UINT32_MAX);
  28. Freq *= Prob;
  29. EXPECT_EQ(Freq.getFrequency(), 1u);
  30. Freq = BlockFrequency(1);
  31. Freq *= Prob;
  32. EXPECT_EQ(Freq.getFrequency(), 1u);
  33. }
  34. TEST(BlockFrequencyTest, ThreeToOne) {
  35. BlockFrequency Freq(3);
  36. BranchProbability Prob(3000000, 9000000);
  37. Freq *= Prob;
  38. EXPECT_EQ(Freq.getFrequency(), 1u);
  39. Freq = BlockFrequency(3);
  40. Freq *= Prob;
  41. EXPECT_EQ(Freq.getFrequency(), 1u);
  42. }
  43. TEST(BlockFrequencyTest, MaxToHalfMax) {
  44. BlockFrequency Freq(UINT64_MAX);
  45. BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
  46. Freq *= Prob;
  47. EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
  48. Freq = BlockFrequency(UINT64_MAX);
  49. Freq *= Prob;
  50. EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
  51. }
  52. TEST(BlockFrequencyTest, BigToBig) {
  53. const uint64_t Big = 387246523487234346LL;
  54. const uint32_t P = 123456789;
  55. BlockFrequency Freq(Big);
  56. BranchProbability Prob(P, P);
  57. Freq *= Prob;
  58. EXPECT_EQ(Freq.getFrequency(), Big);
  59. Freq = BlockFrequency(Big);
  60. Freq *= Prob;
  61. EXPECT_EQ(Freq.getFrequency(), Big);
  62. }
  63. TEST(BlockFrequencyTest, MaxToMax) {
  64. BlockFrequency Freq(UINT64_MAX);
  65. BranchProbability Prob(UINT32_MAX, UINT32_MAX);
  66. Freq *= Prob;
  67. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  68. // This additionally makes sure if we have a value equal to our saturating
  69. // value, we do not signal saturation if the result equals said value, but
  70. // saturating does not occur.
  71. Freq = BlockFrequency(UINT64_MAX);
  72. Freq *= Prob;
  73. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  74. }
  75. TEST(BlockFrequency, Divide) {
  76. BlockFrequency Freq(0x3333333333333333ULL);
  77. Freq /= BranchProbability(1, 2);
  78. EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
  79. }
  80. TEST(BlockFrequencyTest, Saturate) {
  81. BlockFrequency Freq(0x3333333333333333ULL);
  82. Freq /= BranchProbability(100, 300);
  83. EXPECT_EQ(Freq.getFrequency(), 0x9999999999999999ULL);
  84. Freq /= BranchProbability(1, 2);
  85. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  86. Freq = 0x1000000000000000ULL;
  87. Freq /= BranchProbability(10000, 160000);
  88. EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
  89. // Try to cheat the multiplication overflow check.
  90. Freq = 0x00000001f0000001ull;
  91. Freq /= BranchProbability(1000, 0xf000000f);
  92. EXPECT_EQ(33506781356485509ULL, Freq.getFrequency());
  93. }
  94. TEST(BlockFrequencyTest, SaturatingRightShift) {
  95. BlockFrequency Freq(0x10080ULL);
  96. Freq >>= 2;
  97. EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
  98. Freq >>= 20;
  99. EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
  100. }
  101. }