1 | //===- LazyBranchProbabilityInfo.cpp - Lazy Branch Probability Analysis ---===// |
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-exception |
6 | // |
7 | //===----------------------------------------------------------------------===// |
8 | // |
9 | // This is an alternative analysis pass to BranchProbabilityInfoWrapperPass. |
10 | // The difference is that with this pass the branch probabilities are not |
11 | // computed when the analysis pass is executed but rather when the BPI results |
12 | // is explicitly requested by the analysis client. |
13 | // |
14 | //===----------------------------------------------------------------------===// |
15 | |
16 | #include "llvm/Analysis/LazyBranchProbabilityInfo.h" |
17 | #include "llvm/Analysis/LoopInfo.h" |
18 | #include "llvm/Analysis/TargetLibraryInfo.h" |
19 | #include "llvm/IR/Dominators.h" |
20 | #include "llvm/InitializePasses.h" |
21 | |
22 | using namespace llvm; |
23 | |
24 | #define DEBUG_TYPE "lazy-branch-prob" |
25 | |
26 | INITIALIZE_PASS_BEGIN(LazyBranchProbabilityInfoPass, DEBUG_TYPE, |
27 | "Lazy Branch Probability Analysis" , true, true) |
28 | INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass) |
29 | INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) |
30 | INITIALIZE_PASS_END(LazyBranchProbabilityInfoPass, DEBUG_TYPE, |
31 | "Lazy Branch Probability Analysis" , true, true) |
32 | |
33 | char LazyBranchProbabilityInfoPass::ID = 0; |
34 | |
35 | LazyBranchProbabilityInfoPass::LazyBranchProbabilityInfoPass() |
36 | : FunctionPass(ID) { |
37 | initializeLazyBranchProbabilityInfoPassPass(Registry&: *PassRegistry::getPassRegistry()); |
38 | } |
39 | |
40 | void LazyBranchProbabilityInfoPass::print(raw_ostream &OS, |
41 | const Module *) const { |
42 | LBPI->getCalculated().print(OS); |
43 | } |
44 | |
45 | void LazyBranchProbabilityInfoPass::getAnalysisUsage(AnalysisUsage &AU) const { |
46 | // We require DT so it's available when LI is available. The LI updating code |
47 | // asserts that DT is also present so if we don't make sure that we have DT |
48 | // here, that assert will trigger. |
49 | AU.addRequiredTransitive<DominatorTreeWrapperPass>(); |
50 | AU.addRequiredTransitive<LoopInfoWrapperPass>(); |
51 | AU.addRequiredTransitive<TargetLibraryInfoWrapperPass>(); |
52 | AU.setPreservesAll(); |
53 | } |
54 | |
55 | void LazyBranchProbabilityInfoPass::releaseMemory() { LBPI.reset(); } |
56 | |
57 | bool LazyBranchProbabilityInfoPass::runOnFunction(Function &F) { |
58 | LoopInfo &LI = getAnalysis<LoopInfoWrapperPass>().getLoopInfo(); |
59 | TargetLibraryInfo &TLI = |
60 | getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); |
61 | LBPI = std::make_unique<LazyBranchProbabilityInfo>(args: &F, args: &LI, args: &TLI); |
62 | return false; |
63 | } |
64 | |
65 | void LazyBranchProbabilityInfoPass::getLazyBPIAnalysisUsage(AnalysisUsage &AU) { |
66 | AU.addRequiredTransitive<LazyBranchProbabilityInfoPass>(); |
67 | AU.addRequiredTransitive<LoopInfoWrapperPass>(); |
68 | AU.addRequiredTransitive<TargetLibraryInfoWrapperPass>(); |
69 | } |
70 | |
71 | void llvm::initializeLazyBPIPassPass(PassRegistry &Registry) { |
72 | INITIALIZE_PASS_DEPENDENCY(LazyBranchProbabilityInfoPass); |
73 | INITIALIZE_PASS_DEPENDENCY(LoopInfoWrapperPass); |
74 | INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass); |
75 | } |
76 | |