1//===- BranchProbability.h - Branch Probability Wrapper ---------*- C++ -*-===// 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 7//===----------------------------------------------------------------------===// 9// Definition of BranchProbability shared by IR and Machine Instructions. 11//===----------------------------------------------------------------------===// 13#ifndef LLVM_SUPPORT_BRANCHPROBABILITY_H 14#define LLVM_SUPPORT_BRANCHPROBABILITY_H 26// This class represents Branch Probability as a non-negative fraction that is 27// no greater than 1. It uses a fixed-point-like implementation, in which the 28// denominator is always a constant value (here we use 1<<31 for maximum 34// Denominator, which is a constant value. 36staticconstexpruint32_t UnknownN = UINT32_MAX;
38// Construct a BranchProbability with only numerator assuming the denominator 39// is 1<<31. For internal use only. 52// Create a BranchProbability object with the given numerator and 1<<31 55// Create a BranchProbability object from 64-bit integers. 59// Normalize given probabilties so that the sum of them becomes approximate 61template <
class ProbabilityIter>
68// Return (1 - Probability). 75 /// Scale a large integer. 77 /// Scales \c Num. Guarantees full precision. Returns the floor of the 80 /// \return \c Num times \c this. 83 /// Scale a large integer by the inverse. 85 /// Scales \c Num by the inverse of \c this. Guarantees full precision. 86 /// Returns the floor of the result. 88 /// \return \c Num divided by \c this. 93"Unknown probability cannot participate in arithmetics.");
94// Saturate the result in case of overflow. 101"Unknown probability cannot participate in arithmetics.");
102// Saturate the result in case of underflow. 109"Unknown probability cannot participate in arithmetics.");
116"Unknown probability cannot participate in arithmetics.");
123"Unknown probability cannot participate in arithmetics.");
130"Unknown probability cannot participate in arithmetics.");
131assert(
RHS > 0 &&
"The divider cannot be zero.");
177"Unknown probability cannot participate in comparisons.");
183"Unknown probability cannot participate in comparisons.");
189"Unknown probability cannot participate in comparisons.");
190return !(
RHS < *
this);
195"Unknown probability cannot participate in comparisons.");
204template <
class ProbabilityIter>
206 ProbabilityIter
End) {
210unsigned UnknownProbCount = 0;
219if (UnknownProbCount > 0) {
221// If the sum of all known probabilities is less than one, evenly distribute 222// the complement of sum to unknown probabilities. Otherwise, set unknown 223// probabilities to zeros and continue to normalize known probabilities. 228 std::replace_if(Begin,
End,
238 std::fill(Begin,
End, BP);
242for (
autoI = Begin;
I !=
End; ++
I)
assert(ImpDefSCC.getReg()==AMDGPU::SCC &&ImpDefSCC.isDef())
static BranchProbability getBranchProbability(uint64_t Numerator, uint64_t Denominator)
BranchProbability operator-(BranchProbability RHS) const
BranchProbability & operator-=(BranchProbability RHS)
static uint32_t getDenominator()
bool operator<(BranchProbability RHS) const
bool operator!=(BranchProbability RHS) const
static BranchProbability getRaw(uint32_t N)
bool operator==(BranchProbability RHS) const
BranchProbability operator/(uint32_t RHS) const
BranchProbability & operator/=(BranchProbability RHS)
bool operator<=(BranchProbability RHS) const
static BranchProbability getOne()
raw_ostream & print(raw_ostream &OS) const
BranchProbability & operator*=(BranchProbability RHS)
uint64_t scaleByInverse(uint64_t Num) const
Scale a large integer by the inverse.
BranchProbability operator*(BranchProbability RHS) const
static BranchProbability getUnknown()
BranchProbability operator/(BranchProbability RHS) const
uint32_t getNumerator() const
uint64_t scale(uint64_t Num) const
Scale a large integer.
BranchProbability operator+(BranchProbability RHS) const
bool operator>=(BranchProbability RHS) const
BranchProbability operator*(uint32_t RHS) const
BranchProbability & operator*=(uint32_t RHS)
BranchProbability getCompl() const
BranchProbability & operator+=(BranchProbability RHS)
BranchProbability & operator/=(uint32_t RHS)
static BranchProbability getZero()
bool operator>(BranchProbability RHS) const
static void normalizeProbabilities(ProbabilityIter Begin, ProbabilityIter End)
This class implements an extremely fast bulk output stream that can only output to a stream.
This is an optimization pass for GlobalISel generic memory operations.
raw_ostream & operator<<(raw_ostream &OS, const APFixedPoint &FX)