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 HouBlockFrequency &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 HouBlockFrequency 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 HouBlockFrequency &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 HouBlockFrequency 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 HouBlockFrequency &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 HouBlockFrequency 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 HouBlockFrequency &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 HouBlockFrequency 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 GottesmanBlockFrequency &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