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