150
|
1 //===- DominanceFrontier.cpp - Dominance Frontier Calculation -------------===//
|
|
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 #include "llvm/Analysis/DominanceFrontier.h"
|
|
10 #include "llvm/Analysis/DominanceFrontierImpl.h"
|
|
11 #include "llvm/Config/llvm-config.h"
|
|
12 #include "llvm/IR/Dominators.h"
|
|
13 #include "llvm/IR/Function.h"
|
|
14 #include "llvm/IR/PassManager.h"
|
|
15 #include "llvm/InitializePasses.h"
|
|
16 #include "llvm/Pass.h"
|
|
17 #include "llvm/Support/Compiler.h"
|
|
18 #include "llvm/Support/Debug.h"
|
|
19 #include "llvm/Support/raw_ostream.h"
|
|
20
|
|
21 using namespace llvm;
|
|
22
|
|
23 namespace llvm {
|
|
24
|
|
25 template class DominanceFrontierBase<BasicBlock, false>;
|
|
26 template class DominanceFrontierBase<BasicBlock, true>;
|
|
27 template class ForwardDominanceFrontierBase<BasicBlock>;
|
|
28
|
|
29 } // end namespace llvm
|
|
30
|
|
31 char DominanceFrontierWrapperPass::ID = 0;
|
|
32
|
|
33 INITIALIZE_PASS_BEGIN(DominanceFrontierWrapperPass, "domfrontier",
|
|
34 "Dominance Frontier Construction", true, true)
|
|
35 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
|
|
36 INITIALIZE_PASS_END(DominanceFrontierWrapperPass, "domfrontier",
|
|
37 "Dominance Frontier Construction", true, true)
|
|
38
|
|
39 DominanceFrontierWrapperPass::DominanceFrontierWrapperPass()
|
|
40 : FunctionPass(ID), DF() {
|
|
41 initializeDominanceFrontierWrapperPassPass(*PassRegistry::getPassRegistry());
|
|
42 }
|
|
43
|
|
44 void DominanceFrontierWrapperPass::releaseMemory() {
|
|
45 DF.releaseMemory();
|
|
46 }
|
|
47
|
|
48 bool DominanceFrontierWrapperPass::runOnFunction(Function &) {
|
|
49 releaseMemory();
|
|
50 DF.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree());
|
|
51 return false;
|
|
52 }
|
|
53
|
|
54 void DominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
|
|
55 AU.setPreservesAll();
|
|
56 AU.addRequired<DominatorTreeWrapperPass>();
|
|
57 }
|
|
58
|
|
59 void DominanceFrontierWrapperPass::print(raw_ostream &OS, const Module *) const {
|
|
60 DF.print(OS);
|
|
61 }
|
|
62
|
|
63 #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
|
|
64 LLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const {
|
|
65 print(dbgs());
|
|
66 }
|
|
67 #endif
|
|
68
|
|
69 /// Handle invalidation explicitly.
|
|
70 bool DominanceFrontier::invalidate(Function &F, const PreservedAnalyses &PA,
|
|
71 FunctionAnalysisManager::Invalidator &) {
|
|
72 // Check whether the analysis, all analyses on functions, or the function's
|
|
73 // CFG have been preserved.
|
|
74 auto PAC = PA.getChecker<DominanceFrontierAnalysis>();
|
|
75 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
|
|
76 PAC.preservedSet<CFGAnalyses>());
|
|
77 }
|
|
78
|
|
79 AnalysisKey DominanceFrontierAnalysis::Key;
|
|
80
|
|
81 DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
|
|
82 FunctionAnalysisManager &AM) {
|
|
83 DominanceFrontier DF;
|
|
84 DF.analyze(AM.getResult<DominatorTreeAnalysis>(F));
|
|
85 return DF;
|
|
86 }
|
|
87
|
|
88 DominanceFrontierPrinterPass::DominanceFrontierPrinterPass(raw_ostream &OS)
|
|
89 : OS(OS) {}
|
|
90
|
|
91 PreservedAnalyses
|
|
92 DominanceFrontierPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
|
|
93 OS << "DominanceFrontier for function: " << F.getName() << "\n";
|
|
94 AM.getResult<DominanceFrontierAnalysis>(F).print(OS);
|
|
95
|
|
96 return PreservedAnalyses::all();
|
|
97 }
|