1 //====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements Block Frequency class.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Support/BlockFrequency.h"
19 BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {
20 Frequency = Prob.scale(Frequency);
24 BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {
25 BlockFrequency Freq(Frequency);
30 BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {
31 Frequency = Prob.scaleByInverse(Frequency);
35 BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {
36 BlockFrequency Freq(Frequency);
41 BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) {
42 uint64_t Before = Freq.Frequency;
43 Frequency += Freq.Frequency;
45 // If overflow, set frequency to the maximum value.
46 if (Frequency < Before)
47 Frequency = UINT64_MAX;
52 BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const {
53 BlockFrequency NewFreq(Frequency);
58 BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) {
59 // If underflow, set frequency to 0.
60 if (Frequency <= Freq.Frequency)
63 Frequency -= Freq.Frequency;
67 BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const {
68 BlockFrequency NewFreq(Frequency);
73 BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
74 // Frequency can never be 0 by design.
75 assert(Frequency != 0);
77 // Shift right by count.
80 // Saturate to 1 if we are 0.
81 Frequency |= Frequency == 0;