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