brintos

brintos / llvm-project-archived public Read only

0
0
Text · 3.9 KiB · 7ca4582 Raw
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