aboutsummaryrefslogtreecommitdiffstats
path: root/contrib/libs/llvm12/lib/CodeGen/MachineBranchProbabilityInfo.cpp
blob: 657be84a1e83c0a5531599aea7a9255921916d5e (plain) (blame)
1
2
3
4
5
6
7
8
9
10
11
12
13
14
15
16
17
18
19
20
21
22
23
24
25
26
27
28
29
30
31
32
33
34
35
36
37
38
39
40
41
42
43
44
45
46
47
48
49
50
51
52
53
54
55
56
57
58
59
60
61
62
63
64
65
66
67
68
69
70
71
72
73
74
75
76
77
78
79
80
81
82
83
84
85
86
87
88
89
90
91
92
93
94
95
96
97
98
99
//===- MachineBranchProbabilityInfo.cpp - Machine Branch Probability Info -===// 
// 
// 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 analysis uses probability info stored in Machine Basic Blocks. 
// 
//===----------------------------------------------------------------------===// 
 
#include "llvm/CodeGen/MachineBranchProbabilityInfo.h" 
#include "llvm/CodeGen/MachineBasicBlock.h" 
#include "llvm/IR/Instructions.h" 
#include "llvm/InitializePasses.h" 
#include "llvm/Support/CommandLine.h" 
#include "llvm/Support/Debug.h" 
#include "llvm/Support/raw_ostream.h" 
 
using namespace llvm; 
 
INITIALIZE_PASS_BEGIN(MachineBranchProbabilityInfo, "machine-branch-prob", 
                      "Machine Branch Probability Analysis", false, true) 
INITIALIZE_PASS_END(MachineBranchProbabilityInfo, "machine-branch-prob", 
                    "Machine Branch Probability Analysis", false, true) 
 
cl::opt<unsigned> 
    StaticLikelyProb("static-likely-prob", 
                     cl::desc("branch probability threshold in percentage" 
                              "to be considered very likely"), 
                     cl::init(80), cl::Hidden); 
 
cl::opt<unsigned> ProfileLikelyProb( 
    "profile-likely-prob", 
    cl::desc("branch probability threshold in percentage to be considered" 
             " very likely when profile is available"), 
    cl::init(51), cl::Hidden); 
 
char MachineBranchProbabilityInfo::ID = 0; 
 
MachineBranchProbabilityInfo::MachineBranchProbabilityInfo() 
    : ImmutablePass(ID) { 
  PassRegistry &Registry = *PassRegistry::getPassRegistry(); 
  initializeMachineBranchProbabilityInfoPass(Registry); 
} 
 
void MachineBranchProbabilityInfo::anchor() {} 
 
BranchProbability MachineBranchProbabilityInfo::getEdgeProbability( 
    const MachineBasicBlock *Src, 
    MachineBasicBlock::const_succ_iterator Dst) const { 
  return Src->getSuccProbability(Dst); 
} 
 
BranchProbability MachineBranchProbabilityInfo::getEdgeProbability( 
    const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const { 
  // This is a linear search. Try to use the const_succ_iterator version when 
  // possible. 
  return getEdgeProbability(Src, find(Src->successors(), Dst)); 
} 
 
bool MachineBranchProbabilityInfo::isEdgeHot( 
    const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const { 
  BranchProbability HotProb(StaticLikelyProb, 100); 
  return getEdgeProbability(Src, Dst) > HotProb; 
} 
 
MachineBasicBlock * 
MachineBranchProbabilityInfo::getHotSucc(MachineBasicBlock *MBB) const { 
  auto MaxProb = BranchProbability::getZero(); 
  MachineBasicBlock *MaxSucc = nullptr; 
  for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(), 
       E = MBB->succ_end(); I != E; ++I) { 
    auto Prob = getEdgeProbability(MBB, I); 
    if (Prob > MaxProb) { 
      MaxProb = Prob; 
      MaxSucc = *I; 
    } 
  } 
 
  BranchProbability HotProb(StaticLikelyProb, 100); 
  if (getEdgeProbability(MBB, MaxSucc) >= HotProb) 
    return MaxSucc; 
 
  return nullptr; 
} 
 
raw_ostream &MachineBranchProbabilityInfo::printEdgeProbability( 
    raw_ostream &OS, const MachineBasicBlock *Src, 
    const MachineBasicBlock *Dst) const { 
 
  const BranchProbability Prob = getEdgeProbability(Src, Dst); 
  OS << "edge " << printMBBReference(*Src) << " -> " << printMBBReference(*Dst) 
     << " probability is " << Prob 
     << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n"); 
 
  return OS; 
}