149993f26SJakub Staszak //====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====//
249993f26SJakub Staszak //
32946cd70SChandler Carruth // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
42946cd70SChandler Carruth // See https://llvm.org/LICENSE.txt for license information.
52946cd70SChandler Carruth // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
649993f26SJakub Staszak //
749993f26SJakub Staszak //===----------------------------------------------------------------------===//
849993f26SJakub Staszak //
949993f26SJakub Staszak // This file implements Block Frequency class.
1049993f26SJakub Staszak //
1149993f26SJakub Staszak //===----------------------------------------------------------------------===//
1249993f26SJakub Staszak 
1349993f26SJakub Staszak #include "llvm/Support/BlockFrequency.h"
14*75e164f6Sserge-sans-paille #include "llvm/Support/BranchProbability.h"
1549993f26SJakub Staszak #include <cassert>
1649993f26SJakub Staszak 
1749993f26SJakub Staszak using namespace llvm;
1849993f26SJakub Staszak 
operator *=(BranchProbability Prob)19c536bd9eSCong Hou BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {
20547183bfSDuncan P. N. Exon Smith   Frequency = Prob.scale(Frequency);
2149993f26SJakub Staszak   return *this;
2249993f26SJakub Staszak }
2349993f26SJakub Staszak 
operator *(BranchProbability Prob) const2490c6cf8eSCong Hou BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {
2549993f26SJakub Staszak   BlockFrequency Freq(Frequency);
2649993f26SJakub Staszak   Freq *= Prob;
2749993f26SJakub Staszak   return Freq;
2849993f26SJakub Staszak }
2949993f26SJakub Staszak 
operator /=(BranchProbability Prob)30c536bd9eSCong Hou BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {
31547183bfSDuncan P. N. Exon Smith   Frequency = Prob.scaleByInverse(Frequency);
32c506e5d9SJakob Stoklund Olesen   return *this;
33c506e5d9SJakob Stoklund Olesen }
34c506e5d9SJakob Stoklund Olesen 
operator /(BranchProbability Prob) const35c536bd9eSCong Hou BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {
36c506e5d9SJakob Stoklund Olesen   BlockFrequency Freq(Frequency);
37c506e5d9SJakob Stoklund Olesen   Freq /= Prob;
38c506e5d9SJakob Stoklund Olesen   return Freq;
39c506e5d9SJakob Stoklund Olesen }
40c506e5d9SJakob Stoklund Olesen 
operator +=(BlockFrequency Freq)4190c6cf8eSCong Hou BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) {
4249993f26SJakub Staszak   uint64_t Before = Freq.Frequency;
4349993f26SJakub Staszak   Frequency += Freq.Frequency;
4449993f26SJakub Staszak 
4549993f26SJakub Staszak   // If overflow, set frequency to the maximum value.
4649993f26SJakub Staszak   if (Frequency < Before)
4749993f26SJakub Staszak     Frequency = UINT64_MAX;
4849993f26SJakub Staszak 
4949993f26SJakub Staszak   return *this;
5049993f26SJakub Staszak }
5149993f26SJakub Staszak 
operator +(BlockFrequency Freq) const5290c6cf8eSCong Hou BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const {
5390c6cf8eSCong Hou   BlockFrequency NewFreq(Frequency);
5490c6cf8eSCong Hou   NewFreq += Freq;
5590c6cf8eSCong Hou   return NewFreq;
5649993f26SJakub Staszak }
5749993f26SJakub Staszak 
operator -=(BlockFrequency Freq)5861e13de4SCong Hou BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) {
5961e13de4SCong Hou   // If underflow, set frequency to 0.
6061e13de4SCong Hou   if (Frequency <= Freq.Frequency)
6161e13de4SCong Hou     Frequency = 0;
6261e13de4SCong Hou   else
6361e13de4SCong Hou     Frequency -= Freq.Frequency;
6461e13de4SCong Hou   return *this;
6561e13de4SCong Hou }
6661e13de4SCong Hou 
operator -(BlockFrequency Freq) const6761e13de4SCong Hou BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const {
6861e13de4SCong Hou   BlockFrequency NewFreq(Frequency);
6961e13de4SCong Hou   NewFreq -= Freq;
7061e13de4SCong Hou   return NewFreq;
7161e13de4SCong Hou }
7261e13de4SCong Hou 
operator >>=(const unsigned count)738f17dccdSMichael Gottesman BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
748f17dccdSMichael Gottesman   // Frequency can never be 0 by design.
758f17dccdSMichael Gottesman   assert(Frequency != 0);
768f17dccdSMichael Gottesman 
778f17dccdSMichael Gottesman   // Shift right by count.
788f17dccdSMichael Gottesman   Frequency >>= count;
798f17dccdSMichael Gottesman 
808f17dccdSMichael Gottesman   // Saturate to 1 if we are 0.
818f17dccdSMichael Gottesman   Frequency |= Frequency == 0;
828f17dccdSMichael Gottesman   return *this;
838f17dccdSMichael Gottesman }
84