Mercurial > hg > CbC > CbC_llvm
comparison llvm/lib/Analysis/DominanceFrontier.cpp @ 150:1d019706d866
LLVM10
author | anatofuz |
---|---|
date | Thu, 13 Feb 2020 15:10:13 +0900 |
parents | |
children | c4bab56944e8 |
comparison
equal
deleted
inserted
replaced
147:c2174574ed3a | 150:1d019706d866 |
---|---|
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 } |