Path: blob/main/contrib/llvm-project/llvm/lib/Support/BlockFrequency.cpp
35232 views
//====--------------- lib/Support/BlockFrequency.cpp -----------*- C++ -*-====//1//2// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.3// See https://llvm.org/LICENSE.txt for license information.4// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception5//6//===----------------------------------------------------------------------===//7//8// This file implements Block Frequency class.9//10//===----------------------------------------------------------------------===//1112#include "llvm/Support/BlockFrequency.h"13#include "llvm/Support/BranchProbability.h"14#include "llvm/Support/MathExtras.h"15#include "llvm/Support/ScaledNumber.h"16#include "llvm/Support/raw_ostream.h"1718using namespace llvm;1920BlockFrequency &BlockFrequency::operator*=(BranchProbability Prob) {21Frequency = Prob.scale(Frequency);22return *this;23}2425BlockFrequency BlockFrequency::operator*(BranchProbability Prob) const {26BlockFrequency Freq(Frequency);27Freq *= Prob;28return Freq;29}3031BlockFrequency &BlockFrequency::operator/=(BranchProbability Prob) {32Frequency = Prob.scaleByInverse(Frequency);33return *this;34}3536BlockFrequency BlockFrequency::operator/(BranchProbability Prob) const {37BlockFrequency Freq(Frequency);38Freq /= Prob;39return Freq;40}4142std::optional<BlockFrequency> BlockFrequency::mul(uint64_t Factor) const {43bool Overflow;44uint64_t ResultFrequency = SaturatingMultiply(Frequency, Factor, &Overflow);45if (Overflow)46return {};47return BlockFrequency(ResultFrequency);48}4950void llvm::printRelativeBlockFreq(raw_ostream &OS, BlockFrequency EntryFreq,51BlockFrequency Freq) {52if (Freq == BlockFrequency(0)) {53OS << "0";54return;55}56if (EntryFreq == BlockFrequency(0)) {57OS << "<invalid BFI>";58return;59}60ScaledNumber<uint64_t> Block(Freq.getFrequency(), 0);61ScaledNumber<uint64_t> Entry(EntryFreq.getFrequency(), 0);62OS << Block / Entry;63}646566