blob: 2b63294f3789e4c4a4db8ad5112fa09e4bdd2ac2 [file] [log] [blame]
Jakub Staszak49993f22011-07-25 22:24:51 +00001//====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
4// See https://llvm.org/LICENSE.txt for license information.
5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
Jakub Staszak49993f22011-07-25 22:24:51 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This file implements Block Frequency class.
10//
11//===----------------------------------------------------------------------===//
12
Jakub Staszak49993f22011-07-25 22:24:51 +000013#include "llvm/Support/BlockFrequency.h"
Jakub Staszak49993f22011-07-25 22:24:51 +000014#include <cassert>
15
16using namespace llvm;
17
Cong Houc536bd92015-09-10 23:10:42 +000018BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000019 Frequency = Prob.scale(Frequency);
Jakub Staszak49993f22011-07-25 22:24:51 +000020 return *this;
21}
22
Cong Hou90c6cf82015-10-12 18:14:15 +000023BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {
Jakub Staszak49993f22011-07-25 22:24:51 +000024 BlockFrequency Freq(Frequency);
25 Freq *= Prob;
26 return Freq;
27}
28
Cong Houc536bd92015-09-10 23:10:42 +000029BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {
Duncan P. N. Exon Smith547183b2014-04-29 16:31:29 +000030 Frequency = Prob.scaleByInverse(Frequency);
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000031 return *this;
32}
33
Cong Houc536bd92015-09-10 23:10:42 +000034BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {
Jakob Stoklund Olesenc506e5d2013-06-28 18:23:42 +000035 BlockFrequency Freq(Frequency);
36 Freq /= Prob;
37 return Freq;
38}
39
Cong Hou90c6cf82015-10-12 18:14:15 +000040BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) {
Jakub Staszak49993f22011-07-25 22:24:51 +000041 uint64_t Before = Freq.Frequency;
42 Frequency += Freq.Frequency;
43
44 // If overflow, set frequency to the maximum value.
45 if (Frequency < Before)
46 Frequency = UINT64_MAX;
47
48 return *this;
49}
50
Cong Hou90c6cf82015-10-12 18:14:15 +000051BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const {
52 BlockFrequency NewFreq(Frequency);
53 NewFreq += Freq;
54 return NewFreq;
Jakub Staszak49993f22011-07-25 22:24:51 +000055}
56
Cong Hou61e13de2015-10-12 18:34:00 +000057BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) {
58 // If underflow, set frequency to 0.
59 if (Frequency <= Freq.Frequency)
60 Frequency = 0;
61 else
62 Frequency -= Freq.Frequency;
63 return *this;
64}
65
66BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const {
67 BlockFrequency NewFreq(Frequency);
68 NewFreq -= Freq;
69 return NewFreq;
70}
71
Michael Gottesman8f17dcc2013-12-14 02:24:22 +000072BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
73 // Frequency can never be 0 by design.
74 assert(Frequency != 0);
75
76 // Shift right by count.
77 Frequency >>= count;
78
79 // Saturate to 1 if we are 0.
80 Frequency |= Frequency == 0;
81 return *this;
82}