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) { 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 } 98