diff options
Diffstat (limited to 'clang-r353983e/include/llvm/Support/BlockFrequency.h')
| -rw-r--r-- | clang-r353983e/include/llvm/Support/BlockFrequency.h | 81 |
1 files changed, 81 insertions, 0 deletions
diff --git a/clang-r353983e/include/llvm/Support/BlockFrequency.h b/clang-r353983e/include/llvm/Support/BlockFrequency.h new file mode 100644 index 00000000..18fb60e1 --- /dev/null +++ b/clang-r353983e/include/llvm/Support/BlockFrequency.h @@ -0,0 +1,81 @@ +//===-------- BlockFrequency.h - Block Frequency Wrapper --------*- C++ -*-===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// +// +// This file implements Block Frequency class. +// +//===----------------------------------------------------------------------===// + +#ifndef LLVM_SUPPORT_BLOCKFREQUENCY_H +#define LLVM_SUPPORT_BLOCKFREQUENCY_H + +#include "llvm/Support/BranchProbability.h" +#include "llvm/Support/DataTypes.h" + +namespace llvm { + +class raw_ostream; + +// This class represents Block Frequency as a 64-bit value. +class BlockFrequency { + uint64_t Frequency; + +public: + BlockFrequency(uint64_t Freq = 0) : Frequency(Freq) { } + + /// Returns the maximum possible frequency, the saturation value. + static uint64_t getMaxFrequency() { return -1ULL; } + + /// Returns the frequency as a fixpoint number scaled by the entry + /// frequency. + uint64_t getFrequency() const { return Frequency; } + + /// Multiplies with a branch probability. The computation will never + /// overflow. + BlockFrequency &operator*=(BranchProbability Prob); + BlockFrequency operator*(BranchProbability Prob) const; + + /// Divide by a non-zero branch probability using saturating + /// arithmetic. + BlockFrequency &operator/=(BranchProbability Prob); + BlockFrequency operator/(BranchProbability Prob) const; + + /// Adds another block frequency using saturating arithmetic. + BlockFrequency &operator+=(BlockFrequency Freq); + BlockFrequency operator+(BlockFrequency Freq) const; + + /// Subtracts another block frequency using saturating arithmetic. + BlockFrequency &operator-=(BlockFrequency Freq); + BlockFrequency operator-(BlockFrequency Freq) const; + + /// Shift block frequency to the right by count digits saturating to 1. + BlockFrequency &operator>>=(const unsigned count); + + bool operator<(BlockFrequency RHS) const { + return Frequency < RHS.Frequency; + } + + bool operator<=(BlockFrequency RHS) const { + return Frequency <= RHS.Frequency; + } + + bool operator>(BlockFrequency RHS) const { + return Frequency > RHS.Frequency; + } + + bool operator>=(BlockFrequency RHS) const { + return Frequency >= RHS.Frequency; + } + + bool operator==(BlockFrequency RHS) const { + return Frequency == RHS.Frequency; + } +}; + +} + +#endif |
