DominanceFrontier.cpp revision 353358
1218885Sdim//===- DominanceFrontier.cpp - Dominance Frontier Calculation -------------===// 2218885Sdim// 3353358Sdim// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4353358Sdim// See https://llvm.org/LICENSE.txt for license information. 5353358Sdim// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6218885Sdim// 7218885Sdim//===----------------------------------------------------------------------===// 8218885Sdim 9218885Sdim#include "llvm/Analysis/DominanceFrontier.h" 10276479Sdim#include "llvm/Analysis/DominanceFrontierImpl.h" 11341825Sdim#include "llvm/Config/llvm-config.h" 12327952Sdim#include "llvm/IR/Dominators.h" 13327952Sdim#include "llvm/IR/Function.h" 14309124Sdim#include "llvm/IR/PassManager.h" 15327952Sdim#include "llvm/Pass.h" 16327952Sdim#include "llvm/Support/Compiler.h" 17327952Sdim#include "llvm/Support/Debug.h" 18327952Sdim#include "llvm/Support/raw_ostream.h" 19276479Sdim 20218885Sdimusing namespace llvm; 21218885Sdim 22276479Sdimnamespace llvm { 23327952Sdim 24321369Sdimtemplate class DominanceFrontierBase<BasicBlock, false>; 25321369Sdimtemplate class DominanceFrontierBase<BasicBlock, true>; 26276479Sdimtemplate class ForwardDominanceFrontierBase<BasicBlock>; 27276479Sdim 28327952Sdim} // end namespace llvm 29327952Sdim 30309124Sdimchar DominanceFrontierWrapperPass::ID = 0; 31276479Sdim 32309124SdimINITIALIZE_PASS_BEGIN(DominanceFrontierWrapperPass, "domfrontier", 33218885Sdim "Dominance Frontier Construction", true, true) 34276479SdimINITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 35309124SdimINITIALIZE_PASS_END(DominanceFrontierWrapperPass, "domfrontier", 36218885Sdim "Dominance Frontier Construction", true, true) 37218885Sdim 38327952SdimDominanceFrontierWrapperPass::DominanceFrontierWrapperPass() 39309124Sdim : FunctionPass(ID), DF() { 40309124Sdim initializeDominanceFrontierWrapperPassPass(*PassRegistry::getPassRegistry()); 41218885Sdim} 42218885Sdim 43309124Sdimvoid DominanceFrontierWrapperPass::releaseMemory() { 44309124Sdim DF.releaseMemory(); 45276479Sdim} 46234353Sdim 47309124Sdimbool DominanceFrontierWrapperPass::runOnFunction(Function &) { 48276479Sdim releaseMemory(); 49309124Sdim DF.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree()); 50276479Sdim return false; 51276479Sdim} 52218885Sdim 53309124Sdimvoid DominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { 54276479Sdim AU.setPreservesAll(); 55276479Sdim AU.addRequired<DominatorTreeWrapperPass>(); 56218885Sdim} 57218885Sdim 58309124Sdimvoid DominanceFrontierWrapperPass::print(raw_ostream &OS, const Module *) const { 59309124Sdim DF.print(OS); 60218885Sdim} 61218885Sdim 62243830Sdim#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 63309124SdimLLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const { 64218885Sdim print(dbgs()); 65218885Sdim} 66243830Sdim#endif 67309124Sdim 68321369Sdim/// Handle invalidation explicitly. 69321369Sdimbool DominanceFrontier::invalidate(Function &F, const PreservedAnalyses &PA, 70321369Sdim FunctionAnalysisManager::Invalidator &) { 71321369Sdim // Check whether the analysis, all analyses on functions, or the function's 72321369Sdim // CFG have been preserved. 73321369Sdim auto PAC = PA.getChecker<DominanceFrontierAnalysis>(); 74321369Sdim return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() || 75321369Sdim PAC.preservedSet<CFGAnalyses>()); 76321369Sdim} 77321369Sdim 78314564SdimAnalysisKey DominanceFrontierAnalysis::Key; 79309124Sdim 80309124SdimDominanceFrontier DominanceFrontierAnalysis::run(Function &F, 81309124Sdim FunctionAnalysisManager &AM) { 82309124Sdim DominanceFrontier DF; 83309124Sdim DF.analyze(AM.getResult<DominatorTreeAnalysis>(F)); 84309124Sdim return DF; 85309124Sdim} 86309124Sdim 87309124SdimDominanceFrontierPrinterPass::DominanceFrontierPrinterPass(raw_ostream &OS) 88309124Sdim : OS(OS) {} 89309124Sdim 90309124SdimPreservedAnalyses 91309124SdimDominanceFrontierPrinterPass::run(Function &F, FunctionAnalysisManager &AM) { 92309124Sdim OS << "DominanceFrontier for function: " << F.getName() << "\n"; 93309124Sdim AM.getResult<DominanceFrontierAnalysis>(F).print(OS); 94309124Sdim 95309124Sdim return PreservedAnalyses::all(); 96309124Sdim} 97