| //====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====// | |
| // | |
| // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. | |
| // See https://llvm.org/LICENSE.txt for license information. | |
| // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception | |
| // | |
| //===----------------------------------------------------------------------===// | |
| // | |
| // This file implements Block Frequency class. | |
| // | |
| //===----------------------------------------------------------------------===// | |
| #include "llvm/Support/BlockFrequency.h" | |
| #include "llvm/Support/BranchProbability.h" | |
| #include "llvm/Support/MathExtras.h" | |
| #include "llvm/Support/ScaledNumber.h" | |
| #include "llvm/Support/raw_ostream.h" | |
| using namespace llvm; | |
| BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) { | |
| Frequency = Prob.scale(Frequency); | |
| return *this; | |
| } | |
| BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const { | |
| BlockFrequency Freq(Frequency); | |
| Freq *= Prob; | |
| return Freq; | |
| } | |
| BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) { | |
| Frequency = Prob.scaleByInverse(Frequency); | |
| return *this; | |
| } | |
| BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const { | |
| BlockFrequency Freq(Frequency); | |
| Freq /= Prob; | |
| return Freq; | |
| } | |
| std::optional<BlockFrequency> BlockFrequency::mul(uint64_t Factor) const { | |
| bool Overflow; | |
| uint64_t ResultFrequency = SaturatingMultiply(Frequency, Factor, &Overflow); | |
| if (Overflow) | |
| return {}; | |
| return BlockFrequency(ResultFrequency); | |
| } | |
| raw_ostream &llvm::operator<<(raw_ostream &OS, BlockFrequency Freq) { | |
| OS << Freq.getFrequency(); | |
| return OS; | |
| } | |
| void llvm::printRelativeBlockFreq(raw_ostream &OS, BlockFrequency EntryFreq, | |
| BlockFrequency Freq) { | |
| if (Freq == BlockFrequency(0)) { | |
| OS << "0"; | |
| return; | |
| } | |
| if (EntryFreq == BlockFrequency(0)) { | |
| OS << "<invalid BFI>"; | |
| return; | |
| } | |
| ScaledNumber<uint64_t> Block(Freq.getFrequency(), 0); | |
| ScaledNumber<uint64_t> Entry(EntryFreq.getFrequency(), 0); | |
| OS << Block / Entry; | |
| } |