1 //===-------- BlockFrequency.h - Block Frequency Wrapper --------*- C++ -*-===// 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 // 9 // This file implements Block Frequency class. 10 // 11 //===----------------------------------------------------------------------===// 12 13 #ifndef LLVM_SUPPORT_BLOCKFREQUENCY_H 14 #define LLVM_SUPPORT_BLOCKFREQUENCY_H 15 16 #include <cstdint> 17 18 namespace llvm { 19 20 class BranchProbability; 21 22 // This class represents Block Frequency as a 64-bit value. 23 class BlockFrequency { 24 uint64_t Frequency; 25 26 public: Frequency(Freq)27 BlockFrequency(uint64_t Freq = 0) : Frequency(Freq) { } 28 29 /// Returns the maximum possible frequency, the saturation value. getMaxFrequency()30 static uint64_t getMaxFrequency() { return -1ULL; } 31 32 /// Returns the frequency as a fixpoint number scaled by the entry 33 /// frequency. getFrequency()34 uint64_t getFrequency() const { return Frequency; } 35 36 /// Multiplies with a branch probability. The computation will never 37 /// overflow. 38 BlockFrequency &operator*=(BranchProbability Prob); 39 BlockFrequency operator*(BranchProbability Prob) const; 40 41 /// Divide by a non-zero branch probability using saturating 42 /// arithmetic. 43 BlockFrequency &operator/=(BranchProbability Prob); 44 BlockFrequency operator/(BranchProbability Prob) const; 45 46 /// Adds another block frequency using saturating arithmetic. 47 BlockFrequency &operator+=(BlockFrequency Freq); 48 BlockFrequency operator+(BlockFrequency Freq) const; 49 50 /// Subtracts another block frequency using saturating arithmetic. 51 BlockFrequency &operator-=(BlockFrequency Freq); 52 BlockFrequency operator-(BlockFrequency Freq) const; 53 54 /// Shift block frequency to the right by count digits saturating to 1. 55 BlockFrequency &operator>>=(const unsigned count); 56 57 bool operator<(BlockFrequency RHS) const { 58 return Frequency < RHS.Frequency; 59 } 60 61 bool operator<=(BlockFrequency RHS) const { 62 return Frequency <= RHS.Frequency; 63 } 64 65 bool operator>(BlockFrequency RHS) const { 66 return Frequency > RHS.Frequency; 67 } 68 69 bool operator>=(BlockFrequency RHS) const { 70 return Frequency >= RHS.Frequency; 71 } 72 73 bool operator==(BlockFrequency RHS) const { 74 return Frequency == RHS.Frequency; 75 } 76 }; 77 78 } 79 80 #endif 81