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 WorkerBlockFrequency &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 WorkerBlockFrequency 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 WorkerBlockFrequency &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 WorkerBlockFrequency 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 WorkerBlockFrequency &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 WorkerBlockFrequency 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 WorkerBlockFrequency &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 WorkerBlockFrequency 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 WorkerBlockFrequency &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