107 lines · cpp
1//===- MachineBranchProbabilityInfo.cpp - Machine Branch Probability Info -===//2//3// 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-exception6//7//===----------------------------------------------------------------------===//8//9// This analysis uses probability info stored in Machine Basic Blocks.10//11//===----------------------------------------------------------------------===//12 13#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"14#include "llvm/CodeGen/MachineBasicBlock.h"15#include "llvm/InitializePasses.h"16#include "llvm/Support/CommandLine.h"17#include "llvm/Support/raw_ostream.h"18 19using namespace llvm;20 21INITIALIZE_PASS(MachineBranchProbabilityInfoWrapperPass, "machine-branch-prob",22 "Machine Branch Probability Analysis", false, true)23namespace llvm {24cl::opt<unsigned>25 StaticLikelyProb("static-likely-prob",26 cl::desc("branch probability threshold in percentage"27 " to be considered very likely"),28 cl::init(80), cl::Hidden);29 30cl::opt<unsigned> ProfileLikelyProb(31 "profile-likely-prob",32 cl::desc("branch probability threshold in percentage to be considered"33 " very likely when profile is available"),34 cl::init(51), cl::Hidden);35} // namespace llvm36 37MachineBranchProbabilityAnalysis::Result38MachineBranchProbabilityAnalysis::run(MachineFunction &,39 MachineFunctionAnalysisManager &) {40 return MachineBranchProbabilityInfo();41}42 43PreservedAnalyses44MachineBranchProbabilityPrinterPass::run(MachineFunction &MF,45 MachineFunctionAnalysisManager &MFAM) {46 OS << "Printing analysis 'Machine Branch Probability Analysis' for machine "47 "function '"48 << MF.getName() << "':\n";49 auto &MBPI = MFAM.getResult<MachineBranchProbabilityAnalysis>(MF);50 for (const MachineBasicBlock &MBB : MF) {51 for (const MachineBasicBlock *Succ : MBB.successors())52 MBPI.printEdgeProbability(OS << " ", &MBB, Succ);53 }54 return PreservedAnalyses::all();55}56 57char MachineBranchProbabilityInfoWrapperPass::ID = 0;58 59MachineBranchProbabilityInfoWrapperPass::60 MachineBranchProbabilityInfoWrapperPass()61 : ImmutablePass(ID) {62 PassRegistry &Registry = *PassRegistry::getPassRegistry();63 initializeMachineBranchProbabilityInfoWrapperPassPass(Registry);64}65 66void MachineBranchProbabilityInfoWrapperPass::anchor() {}67 68AnalysisKey MachineBranchProbabilityAnalysis::Key;69 70bool MachineBranchProbabilityInfo::invalidate(71 MachineFunction &, const PreservedAnalyses &PA,72 MachineFunctionAnalysisManager::Invalidator &) {73 auto PAC = PA.getChecker<MachineBranchProbabilityAnalysis>();74 return !PAC.preservedWhenStateless();75}76 77BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(78 const MachineBasicBlock *Src,79 MachineBasicBlock::const_succ_iterator Dst) const {80 return Src->getSuccProbability(Dst);81}82 83BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(84 const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {85 // This is a linear search. Try to use the const_succ_iterator version when86 // possible.87 return getEdgeProbability(Src, find(Src->successors(), Dst));88}89 90bool MachineBranchProbabilityInfo::isEdgeHot(91 const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {92 BranchProbability HotProb(StaticLikelyProb, 100);93 return getEdgeProbability(Src, Dst) > HotProb;94}95 96raw_ostream &MachineBranchProbabilityInfo::printEdgeProbability(97 raw_ostream &OS, const MachineBasicBlock *Src,98 const MachineBasicBlock *Dst) const {99 100 const BranchProbability Prob = getEdgeProbability(Src, Dst);101 OS << "edge " << printMBBReference(*Src) << " -> " << printMBBReference(*Dst)102 << " probability is " << Prob103 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");104 105 return OS;106}107