blob: e7f3e1764c52d3a6131f022b081227b2f0887f06 [file] [log] [blame]
Jakub Staszak49993f22011-07-25 22:24:51 +00001//====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This file implements Block Frequency class.
11//
12//===----------------------------------------------------------------------===//
13
Jakub Staszak49993f22011-07-25 22:24:51 +000014#include "llvm/Support/BlockFrequency.h"
15#include "llvm/Support/raw_ostream.h"
16#include <cassert>
17
18using namespace llvm;
19
Cong Houc536bd92015-09-10 23:10:42 +000020BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000021 Frequency = Prob.scale(Frequency);
Jakub Staszak49993f22011-07-25 22:24:51 +000022 return *this;
23}
24
Cong Hou90c6cf82015-10-12 18:14:15 +000025BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {
Jakub Staszak49993f22011-07-25 22:24:51 +000026 BlockFrequency Freq(Frequency);
27 Freq *= Prob;
28 return Freq;
29}
30
Cong Houc536bd92015-09-10 23:10:42 +000031BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000032 Frequency = Prob.scaleByInverse(Frequency);
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000033 return *this;
34}
35
Cong Houc536bd92015-09-10 23:10:42 +000036BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000037 BlockFrequency Freq(Frequency);
38 Freq /= Prob;
39 return Freq;
40}
41
Cong Hou90c6cf82015-10-12 18:14:15 +000042BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) {
Jakub Staszak49993f22011-07-25 22:24:51 +000043 uint64_t Before = Freq.Frequency;
44 Frequency += Freq.Frequency;
45
46 // If overflow, set frequency to the maximum value.
47 if (Frequency < Before)
48 Frequency = UINT64_MAX;
49
50 return *this;
51}
52
Cong Hou90c6cf82015-10-12 18:14:15 +000053BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const {
54 BlockFrequency NewFreq(Frequency);
55 NewFreq += Freq;
56 return NewFreq;
Jakub Staszak49993f22011-07-25 22:24:51 +000057}
58
Cong Hou61e13de2015-10-12 18:34:00 +000059BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) {
60 // If underflow, set frequency to 0.
61 if (Frequency <= Freq.Frequency)
62 Frequency = 0;
63 else
64 Frequency -= Freq.Frequency;
65 return *this;
66}
67
68BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const {
69 BlockFrequency NewFreq(Frequency);
70 NewFreq -= Freq;
71 return NewFreq;
72}
73
Michael Gottesman8f17dcc2013-12-14 02:24:22 +000074BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
75 // Frequency can never be 0 by design.
76 assert(Frequency != 0);
77
78 // Shift right by count.
79 Frequency >>= count;
80
81 // Saturate to 1 if we are 0.
82 Frequency |= Frequency == 0;
83 return *this;
84}