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