blob: d2277ce517462fd506d880cee9ac5c5850b770fd [file] [log] [blame]
Jakub Staszak12a43bd2011-06-16 20:22:37 +00001//===- MachineBranchProbabilityInfo.cpp - Machine Branch Probability Info -===//
2//
Chandler Carruth2946cd72019-01-19 08:50:56 +00003// 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-exception
Jakub Staszak12a43bd2011-06-16 20:22:37 +00006//
7//===----------------------------------------------------------------------===//
8//
9// This analysis uses probability info stored in Machine Basic Blocks.
10//
11//===----------------------------------------------------------------------===//
12
Jakub Staszak12a43bd2011-06-16 20:22:37 +000013#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
14#include "llvm/CodeGen/MachineBasicBlock.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000015#include "llvm/IR/Instructions.h"
Jakub Staszak12a43bd2011-06-16 20:22:37 +000016#include "llvm/Support/Debug.h"
17#include "llvm/Support/raw_ostream.h"
18
19using namespace llvm;
20
21INITIALIZE_PASS_BEGIN(MachineBranchProbabilityInfo, "machine-branch-prob",
22 "Machine Branch Probability Analysis", false, true)
23INITIALIZE_PASS_END(MachineBranchProbabilityInfo, "machine-branch-prob",
24 "Machine Branch Probability Analysis", false, true)
25
Xinliang David Lie34ed832016-06-15 03:03:30 +000026cl::opt<unsigned>
27 StaticLikelyProb("static-likely-prob",
28 cl::desc("branch probability threshold in percentage"
29 "to be considered very likely"),
30 cl::init(80), cl::Hidden);
Xinliang David Liff287372016-06-03 23:48:36 +000031
Dehao Chen9f2bdfb2016-06-14 22:27:17 +000032cl::opt<unsigned> ProfileLikelyProb(
33 "profile-likely-prob",
Xinliang David Lie34ed832016-06-15 03:03:30 +000034 cl::desc("branch probability threshold in percentage to be considered"
35 " very likely when profile is available"),
Dehao Chen9f2bdfb2016-06-14 22:27:17 +000036 cl::init(51), cl::Hidden);
37
Jakub Staszak12a43bd2011-06-16 20:22:37 +000038char MachineBranchProbabilityInfo::ID = 0;
39
Xinliang David Liff287372016-06-03 23:48:36 +000040void MachineBranchProbabilityInfo::anchor() {}
David Blaikiea379b1812011-12-20 02:50:00 +000041
Cong Houd97c1002015-12-01 05:29:22 +000042BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
43 const MachineBasicBlock *Src,
44 MachineBasicBlock::const_succ_iterator Dst) const {
45 return Src->getSuccProbability(Dst);
46}
47
48BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
49 const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {
50 // This is a linear search. Try to use the const_succ_iterator version when
51 // possible.
David Majnemer42531262016-08-12 03:55:06 +000052 return getEdgeProbability(Src, find(Src->successors(), Dst));
Cong Houd97c1002015-12-01 05:29:22 +000053}
54
Xinliang David Liff287372016-06-03 23:48:36 +000055bool MachineBranchProbabilityInfo::isEdgeHot(
56 const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {
57 BranchProbability HotProb(StaticLikelyProb, 100);
Cong Houd97c1002015-12-01 05:29:22 +000058 return getEdgeProbability(Src, Dst) > HotProb;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000059}
60
61MachineBasicBlock *
62MachineBranchProbabilityInfo::getHotSucc(MachineBasicBlock *MBB) const {
Cong Houd97c1002015-12-01 05:29:22 +000063 auto MaxProb = BranchProbability::getZero();
Craig Topperc0196b12014-04-14 00:51:57 +000064 MachineBasicBlock *MaxSucc = nullptr;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000065 for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
66 E = MBB->succ_end(); I != E; ++I) {
Cong Houd97c1002015-12-01 05:29:22 +000067 auto Prob = getEdgeProbability(MBB, I);
68 if (Prob > MaxProb) {
69 MaxProb = Prob;
Chandler Carrutha9e71fa2011-11-14 08:55:59 +000070 MaxSucc = *I;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000071 }
72 }
73
Xinliang David Liff287372016-06-03 23:48:36 +000074 BranchProbability HotProb(StaticLikelyProb, 100);
Cong Houd97c1002015-12-01 05:29:22 +000075 if (getEdgeProbability(MBB, MaxSucc) >= HotProb)
Jakub Staszak12a43bd2011-06-16 20:22:37 +000076 return MaxSucc;
77
Craig Topperc0196b12014-04-14 00:51:57 +000078 return nullptr;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000079}
80
Duncan P. N. Exon Smith936aef92014-03-25 18:01:32 +000081raw_ostream &MachineBranchProbabilityInfo::printEdgeProbability(
82 raw_ostream &OS, const MachineBasicBlock *Src,
83 const MachineBasicBlock *Dst) const {
Jakub Staszak12a43bd2011-06-16 20:22:37 +000084
85 const BranchProbability Prob = getEdgeProbability(Src, Dst);
Francis Visoiu Mistrih25528d62017-12-04 17:18:51 +000086 OS << "edge " << printMBBReference(*Src) << " -> " << printMBBReference(*Dst)
Duncan P. N. Exon Smith936aef92014-03-25 18:01:32 +000087 << " probability is " << Prob
Jakub Staszak12a43bd2011-06-16 20:22:37 +000088 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
89
90 return OS;
91}