Home | History | Annotate | Download | only in Support
      1 #include "llvm/Support/BlockFrequency.h"
      2 #include "llvm/Support/BranchProbability.h"
      3 #include "llvm/Support/DataTypes.h"
      4 #include "gtest/gtest.h"
      5 #include <climits>
      6 
      7 using namespace llvm;
      8 
      9 namespace {
     10 
     11 TEST(BlockFrequencyTest, OneToZero) {
     12   BlockFrequency Freq(1);
     13   BranchProbability Prob(UINT32_MAX - 1, UINT32_MAX);
     14   Freq *= Prob;
     15   EXPECT_EQ(Freq.getFrequency(), 0u);
     16 
     17   Freq = BlockFrequency(1);
     18   Freq *= Prob;
     19   EXPECT_EQ(Freq.getFrequency(), 0u);
     20 }
     21 
     22 TEST(BlockFrequencyTest, OneToOne) {
     23   BlockFrequency Freq(1);
     24   BranchProbability Prob(UINT32_MAX, UINT32_MAX);
     25   Freq *= Prob;
     26   EXPECT_EQ(Freq.getFrequency(), 1u);
     27 
     28   Freq = BlockFrequency(1);
     29   Freq *= Prob;
     30   EXPECT_EQ(Freq.getFrequency(), 1u);
     31 }
     32 
     33 TEST(BlockFrequencyTest, ThreeToOne) {
     34   BlockFrequency Freq(3);
     35   BranchProbability Prob(3000000, 9000000);
     36   Freq *= Prob;
     37   EXPECT_EQ(Freq.getFrequency(), 1u);
     38 
     39   Freq = BlockFrequency(3);
     40   Freq *= Prob;
     41   EXPECT_EQ(Freq.getFrequency(), 1u);
     42 }
     43 
     44 TEST(BlockFrequencyTest, MaxToHalfMax) {
     45   BlockFrequency Freq(UINT64_MAX);
     46   BranchProbability Prob(UINT32_MAX / 2, UINT32_MAX);
     47   Freq *= Prob;
     48   EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
     49 
     50   Freq = BlockFrequency(UINT64_MAX);
     51   Freq *= Prob;
     52   EXPECT_EQ(Freq.getFrequency(), 9223372034707292159ULL);
     53 }
     54 
     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);
     60   Freq *= Prob;
     61   EXPECT_EQ(Freq.getFrequency(), Big);
     62 
     63   Freq = BlockFrequency(Big);
     64   Freq *= Prob;
     65   EXPECT_EQ(Freq.getFrequency(), Big);
     66 }
     67 
     68 TEST(BlockFrequencyTest, MaxToMax) {
     69   BlockFrequency Freq(UINT64_MAX);
     70   BranchProbability Prob(UINT32_MAX, UINT32_MAX);
     71   Freq *= Prob;
     72   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
     73 
     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);
     78   Freq *= Prob;
     79   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
     80 }
     81 
     82 TEST(BlockFrequency, Divide) {
     83   BlockFrequency Freq(0x3333333333333333ULL);
     84   Freq /= BranchProbability(1, 2);
     85   EXPECT_EQ(Freq.getFrequency(), 0x6666666666666666ULL);
     86 }
     87 
     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);
     94 
     95   Freq = 0x1000000000000000ULL;
     96   Freq /= BranchProbability(10000, 160000);
     97   EXPECT_EQ(Freq.getFrequency(), UINT64_MAX);
     98 
     99   // Try to cheat the multiplication overflow check.
    100   Freq = 0x00000001f0000001ull;
    101   Freq /= BranchProbability(1000, 0xf000000f);
    102   EXPECT_EQ(33506781356485509ULL, Freq.getFrequency());
    103 }
    104 
    105 TEST(BlockFrequencyTest, SaturatingRightShift) {
    106   BlockFrequency Freq(0x10080ULL);
    107   Freq >>= 2;
    108   EXPECT_EQ(Freq.getFrequency(), 0x4020ULL);
    109   Freq >>= 20;
    110   EXPECT_EQ(Freq.getFrequency(), 0x1ULL);
    111 }
    112 
    113 }
    114