blob: cf6d4018cb703ad1967407aab2bac6258ebea171 [file] [log] [blame]
Jakub Staszak12a43bd2011-06-16 20:22:37 +00001//===- MachineBranchProbabilityInfo.cpp - Machine Branch Probability Info -===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9//
10// This analysis uses probability info stored in Machine Basic Blocks.
11//
12//===----------------------------------------------------------------------===//
13
Jakub Staszak12a43bd2011-06-16 20:22:37 +000014#include "llvm/CodeGen/MachineBranchProbabilityInfo.h"
15#include "llvm/CodeGen/MachineBasicBlock.h"
Chandler Carruth9fb823b2013-01-02 11:36:10 +000016#include "llvm/IR/Instructions.h"
Jakub Staszak12a43bd2011-06-16 20:22:37 +000017#include "llvm/Support/Debug.h"
18#include "llvm/Support/raw_ostream.h"
19
20using namespace llvm;
21
22INITIALIZE_PASS_BEGIN(MachineBranchProbabilityInfo, "machine-branch-prob",
23 "Machine Branch Probability Analysis", false, true)
24INITIALIZE_PASS_END(MachineBranchProbabilityInfo, "machine-branch-prob",
25 "Machine Branch Probability Analysis", false, true)
26
27char MachineBranchProbabilityInfo::ID = 0;
28
David Blaikiea379b1812011-12-20 02:50:00 +000029void MachineBranchProbabilityInfo::anchor() { }
30
Cong Houd97c1002015-12-01 05:29:22 +000031BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
32 const MachineBasicBlock *Src,
33 MachineBasicBlock::const_succ_iterator Dst) const {
34 return Src->getSuccProbability(Dst);
35}
36
37BranchProbability MachineBranchProbabilityInfo::getEdgeProbability(
38 const MachineBasicBlock *Src, const MachineBasicBlock *Dst) const {
39 // This is a linear search. Try to use the const_succ_iterator version when
40 // possible.
41 return getEdgeProbability(Src,
42 std::find(Src->succ_begin(), Src->succ_end(), Dst));
43}
44
Duncan P. N. Exon Smith936aef92014-03-25 18:01:32 +000045bool
46MachineBranchProbabilityInfo::isEdgeHot(const MachineBasicBlock *Src,
47 const MachineBasicBlock *Dst) const {
Jakub Staszak12a43bd2011-06-16 20:22:37 +000048 // Hot probability is at least 4/5 = 80%
Cong Houd97c1002015-12-01 05:29:22 +000049 static BranchProbability HotProb(4, 5);
50 return getEdgeProbability(Src, Dst) > HotProb;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000051}
52
53MachineBasicBlock *
54MachineBranchProbabilityInfo::getHotSucc(MachineBasicBlock *MBB) const {
Cong Houd97c1002015-12-01 05:29:22 +000055 auto MaxProb = BranchProbability::getZero();
Craig Topperc0196b12014-04-14 00:51:57 +000056 MachineBasicBlock *MaxSucc = nullptr;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000057 for (MachineBasicBlock::const_succ_iterator I = MBB->succ_begin(),
58 E = MBB->succ_end(); I != E; ++I) {
Cong Houd97c1002015-12-01 05:29:22 +000059 auto Prob = getEdgeProbability(MBB, I);
60 if (Prob > MaxProb) {
61 MaxProb = Prob;
Chandler Carrutha9e71fa2011-11-14 08:55:59 +000062 MaxSucc = *I;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000063 }
64 }
65
Cong Houd97c1002015-12-01 05:29:22 +000066 static BranchProbability HotProb(4, 5);
67 if (getEdgeProbability(MBB, MaxSucc) >= HotProb)
Jakub Staszak12a43bd2011-06-16 20:22:37 +000068 return MaxSucc;
69
Craig Topperc0196b12014-04-14 00:51:57 +000070 return nullptr;
Jakub Staszak12a43bd2011-06-16 20:22:37 +000071}
72
Duncan P. N. Exon Smith936aef92014-03-25 18:01:32 +000073raw_ostream &MachineBranchProbabilityInfo::printEdgeProbability(
74 raw_ostream &OS, const MachineBasicBlock *Src,
75 const MachineBasicBlock *Dst) const {
Jakub Staszak12a43bd2011-06-16 20:22:37 +000076
77 const BranchProbability Prob = getEdgeProbability(Src, Dst);
78 OS << "edge MBB#" << Src->getNumber() << " -> MBB#" << Dst->getNumber()
Duncan P. N. Exon Smith936aef92014-03-25 18:01:32 +000079 << " probability is " << Prob
Jakub Staszak12a43bd2011-06-16 20:22:37 +000080 << (isEdgeHot(Src, Dst) ? " [HOT edge]\n" : "\n");
81
82 return OS;
83}