blob: 34fcbde23a28e9ea5ededf47eb0d5699c2457e5c [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"
Jakub Staszak49993f22011-07-25 22:24:51 +000015#include <cassert>
16
17using namespace llvm;
18
Cong Houc536bd92015-09-10 23:10:42 +000019BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000020 Frequency = Prob.scale(Frequency);
Jakub Staszak49993f22011-07-25 22:24:51 +000021 return *this;
22}
23
Cong Hou90c6cf82015-10-12 18:14:15 +000024BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {
Jakub Staszak49993f22011-07-25 22:24:51 +000025 BlockFrequency Freq(Frequency);
26 Freq *= Prob;
27 return Freq;
28}
29
Cong Houc536bd92015-09-10 23:10:42 +000030BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000031 Frequency = Prob.scaleByInverse(Frequency);
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000032 return *this;
33}
34
Cong Houc536bd92015-09-10 23:10:42 +000035BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000036 BlockFrequency Freq(Frequency);
37 Freq /= Prob;
38 return Freq;
39}
40
Cong Hou90c6cf82015-10-12 18:14:15 +000041BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) {
Jakub Staszak49993f22011-07-25 22:24:51 +000042 uint64_t Before = Freq.Frequency;
43 Frequency += Freq.Frequency;
44
45 // If overflow, set frequency to the maximum value.
46 if (Frequency < Before)
47 Frequency = UINT64_MAX;
48
49 return *this;
50}
51
Cong Hou90c6cf82015-10-12 18:14:15 +000052BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const {
53 BlockFrequency NewFreq(Frequency);
54 NewFreq += Freq;
55 return NewFreq;
Jakub Staszak49993f22011-07-25 22:24:51 +000056}
57
Cong Hou61e13de2015-10-12 18:34:00 +000058BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) {
59 // If underflow, set frequency to 0.
60 if (Frequency <= Freq.Frequency)
61 Frequency = 0;
62 else
63 Frequency -= Freq.Frequency;
64 return *this;
65}
66
67BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const {
68 BlockFrequency NewFreq(Frequency);
69 NewFreq -= Freq;
70 return NewFreq;
71}
72
Michael Gottesman8f17dcc2013-12-14 02:24:22 +000073BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
74 // Frequency can never be 0 by design.
75 assert(Frequency != 0);
76
77 // Shift right by count.
78 Frequency >>= count;
79
80 // Saturate to 1 if we are 0.
81 Frequency |= Frequency == 0;
82 return *this;
83}