/Users/buildslave/jenkins/sharedspace/clang-stage2-coverage-R@2/llvm/lib/Support/BlockFrequency.cpp
Line | Count | Source |
1 | | //====--------------- 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 | | |
14 | | #include "llvm/Support/BlockFrequency.h" |
15 | | #include "llvm/Support/raw_ostream.h" |
16 | | #include <cassert> |
17 | | |
18 | | using namespace llvm; |
19 | | |
20 | 10.1M | BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) { |
21 | 10.1M | Frequency = Prob.scale(Frequency); |
22 | 10.1M | return *this; |
23 | 10.1M | } |
24 | | |
25 | 9.72M | BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const { |
26 | 9.72M | BlockFrequency Freq(Frequency); |
27 | 9.72M | Freq *= Prob; |
28 | 9.72M | return Freq; |
29 | 9.72M | } |
30 | | |
31 | 202k | BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) { |
32 | 202k | Frequency = Prob.scaleByInverse(Frequency); |
33 | 202k | return *this; |
34 | 202k | } |
35 | | |
36 | 184k | BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const { |
37 | 184k | BlockFrequency Freq(Frequency); |
38 | 184k | Freq /= Prob; |
39 | 184k | return Freq; |
40 | 184k | } |
41 | | |
42 | 973M | BlockFrequency &BlockFrequency::operator+=(BlockFrequency Freq) { |
43 | 973M | uint64_t Before = Freq.Frequency; |
44 | 973M | Frequency += Freq.Frequency; |
45 | 973M | |
46 | 973M | // If overflow, set frequency to the maximum value. |
47 | 973M | if (Frequency < Before) |
48 | 1.67M | Frequency = UINT64_MAX; |
49 | 973M | |
50 | 973M | return *this; |
51 | 973M | } |
52 | | |
53 | 368M | BlockFrequency BlockFrequency::operator+(BlockFrequency Freq) const { |
54 | 368M | BlockFrequency NewFreq(Frequency); |
55 | 368M | NewFreq += Freq; |
56 | 368M | return NewFreq; |
57 | 368M | } |
58 | | |
59 | 291k | BlockFrequency &BlockFrequency::operator-=(BlockFrequency Freq) { |
60 | 291k | // If underflow, set frequency to 0. |
61 | 291k | if (Frequency <= Freq.Frequency) |
62 | 58.5k | Frequency = 0; |
63 | 291k | else |
64 | 233k | Frequency -= Freq.Frequency; |
65 | 291k | return *this; |
66 | 291k | } |
67 | | |
68 | 291k | BlockFrequency BlockFrequency::operator-(BlockFrequency Freq) const { |
69 | 291k | BlockFrequency NewFreq(Frequency); |
70 | 291k | NewFreq -= Freq; |
71 | 291k | return NewFreq; |
72 | 291k | } |
73 | | |
74 | 2 | BlockFrequency &BlockFrequency::operator>>=(const unsigned count) { |
75 | 2 | // Frequency can never be 0 by design. |
76 | 2 | assert(Frequency != 0); |
77 | 2 | |
78 | 2 | // Shift right by count. |
79 | 2 | Frequency >>= count; |
80 | 2 | |
81 | 2 | // Saturate to 1 if we are 0. |
82 | 2 | Frequency |= Frequency == 0; |
83 | 2 | return *this; |
84 | 2 | } |