blob: e0430c199eb86e2b9fec33224d8a1521805598b3 [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
Michael Gottesman8f17dcc2013-12-14 02:24:22 +000059BlockFrequency &BlockFrequency::operator>>=(const unsigned count) {
60 // Frequency can never be 0 by design.
61 assert(Frequency != 0);
62
63 // Shift right by count.
64 Frequency >>= count;
65
66 // Saturate to 1 if we are 0.
67 Frequency |= Frequency == 0;
68 return *this;
69}