xref: /aosp_15_r20/external/llvm/lib/Support/BlockFrequency.cpp (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker //====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====//
2*9880d681SAndroid Build Coastguard Worker //
3*9880d681SAndroid Build Coastguard Worker //                     The LLVM Compiler Infrastructure
4*9880d681SAndroid Build Coastguard Worker //
5*9880d681SAndroid Build Coastguard Worker // This file is distributed under the University of Illinois Open Source
6*9880d681SAndroid Build Coastguard Worker // License. See LICENSE.TXT for details.
7*9880d681SAndroid Build Coastguard Worker //
8*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
9*9880d681SAndroid Build Coastguard Worker //
10*9880d681SAndroid Build Coastguard Worker // This file implements Block Frequency class.
11*9880d681SAndroid Build Coastguard Worker //
12*9880d681SAndroid Build Coastguard Worker //===----------------------------------------------------------------------===//
13*9880d681SAndroid Build Coastguard Worker 
14*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/BlockFrequency.h"
15*9880d681SAndroid Build Coastguard Worker #include "llvm/Support/raw_ostream.h"
16*9880d681SAndroid Build Coastguard Worker #include <cassert>
17*9880d681SAndroid Build Coastguard Worker 
18*9880d681SAndroid Build Coastguard Worker using namespace llvm;
19*9880d681SAndroid Build Coastguard Worker 
operator *=(BranchProbability Prob)20*9880d681SAndroid Build Coastguard Worker BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {
21*9880d681SAndroid Build Coastguard Worker   Frequency = Prob.scale(Frequency);
22*9880d681SAndroid Build Coastguard Worker   return *this;
23*9880d681SAndroid Build Coastguard Worker }
24*9880d681SAndroid Build Coastguard Worker 
operator *(BranchProbability Prob) const25*9880d681SAndroid Build Coastguard Worker BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {
26*9880d681SAndroid Build Coastguard Worker   BlockFrequency Freq(Frequency);
27*9880d681SAndroid Build Coastguard Worker   Freq *= Prob;
28*9880d681SAndroid Build Coastguard Worker   return Freq;
29*9880d681SAndroid Build Coastguard Worker }
30*9880d681SAndroid Build Coastguard Worker 
operator /=(BranchProbability Prob)31*9880d681SAndroid Build Coastguard Worker BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {
32*9880d681SAndroid Build Coastguard Worker   Frequency = Prob.scaleByInverse(Frequency);
33*9880d681SAndroid Build Coastguard Worker   return *this;
34*9880d681SAndroid Build Coastguard Worker }
35*9880d681SAndroid Build Coastguard Worker 
operator /(BranchProbability Prob) const36*9880d681SAndroid Build Coastguard Worker BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {
37*9880d681SAndroid Build Coastguard Worker   BlockFrequency Freq(Frequency);
38*9880d681SAndroid Build Coastguard Worker   Freq /= Prob;
39*9880d681SAndroid Build Coastguard Worker   return Freq;
40*9880d681SAndroid Build Coastguard Worker }
41*9880d681SAndroid Build Coastguard Worker 
operator +=(BlockFrequency Freq)42*9880d681SAndroid Build Coastguard Worker BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) {
43*9880d681SAndroid Build Coastguard Worker   uint64_t Before = Freq.Frequency;
44*9880d681SAndroid Build Coastguard Worker   Frequency += Freq.Frequency;
45*9880d681SAndroid Build Coastguard Worker 
46*9880d681SAndroid Build Coastguard Worker   // If overflow, set frequency to the maximum value.
47*9880d681SAndroid Build Coastguard Worker   if (Frequency < Before)
48*9880d681SAndroid Build Coastguard Worker     Frequency = UINT64_MAX;
49*9880d681SAndroid Build Coastguard Worker 
50*9880d681SAndroid Build Coastguard Worker   return *this;
51*9880d681SAndroid Build Coastguard Worker }
52*9880d681SAndroid Build Coastguard Worker 
operator +(BlockFrequency Freq) const53*9880d681SAndroid Build Coastguard Worker BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const {
54*9880d681SAndroid Build Coastguard Worker   BlockFrequency NewFreq(Frequency);
55*9880d681SAndroid Build Coastguard Worker   NewFreq += Freq;
56*9880d681SAndroid Build Coastguard Worker   return NewFreq;
57*9880d681SAndroid Build Coastguard Worker }
58*9880d681SAndroid Build Coastguard Worker 
operator -=(BlockFrequency Freq)59*9880d681SAndroid Build Coastguard Worker BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) {
60*9880d681SAndroid Build Coastguard Worker   // If underflow, set frequency to 0.
61*9880d681SAndroid Build Coastguard Worker   if (Frequency <= Freq.Frequency)
62*9880d681SAndroid Build Coastguard Worker     Frequency = 0;
63*9880d681SAndroid Build Coastguard Worker   else
64*9880d681SAndroid Build Coastguard Worker     Frequency -= Freq.Frequency;
65*9880d681SAndroid Build Coastguard Worker   return *this;
66*9880d681SAndroid Build Coastguard Worker }
67*9880d681SAndroid Build Coastguard Worker 
operator -(BlockFrequency Freq) const68*9880d681SAndroid Build Coastguard Worker BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const {
69*9880d681SAndroid Build Coastguard Worker   BlockFrequency NewFreq(Frequency);
70*9880d681SAndroid Build Coastguard Worker   NewFreq -= Freq;
71*9880d681SAndroid Build Coastguard Worker   return NewFreq;
72*9880d681SAndroid Build Coastguard Worker }
73*9880d681SAndroid Build Coastguard Worker 
operator >>=(const unsigned count)74*9880d681SAndroid Build Coastguard Worker BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
75*9880d681SAndroid Build Coastguard Worker   // Frequency can never be 0 by design.
76*9880d681SAndroid Build Coastguard Worker   assert(Frequency != 0);
77*9880d681SAndroid Build Coastguard Worker 
78*9880d681SAndroid Build Coastguard Worker   // Shift right by count.
79*9880d681SAndroid Build Coastguard Worker   Frequency >>= count;
80*9880d681SAndroid Build Coastguard Worker 
81*9880d681SAndroid Build Coastguard Worker   // Saturate to 1 if we are 0.
82*9880d681SAndroid Build Coastguard Worker   Frequency |= Frequency == 0;
83*9880d681SAndroid Build Coastguard Worker   return *this;
84*9880d681SAndroid Build Coastguard Worker }
85