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" 15360784Sdim#include "llvm/InitializePasses.h" 16327952Sdim#include "llvm/Pass.h" 17327952Sdim#include "llvm/Support/Compiler.h" 18327952Sdim#include "llvm/Support/Debug.h" 19327952Sdim#include "llvm/Support/raw_ostream.h" 20276479Sdim 21218885Sdimusing namespace llvm; 22218885Sdim 23276479Sdimnamespace llvm { 24327952Sdim 25321369Sdimtemplate class DominanceFrontierBase<BasicBlock, false>; 26321369Sdimtemplate class DominanceFrontierBase<BasicBlock, true>; 27276479Sdimtemplate class ForwardDominanceFrontierBase<BasicBlock>; 28276479Sdim 29327952Sdim} // end namespace llvm 30327952Sdim 31309124Sdimchar DominanceFrontierWrapperPass::ID = 0; 32276479Sdim 33309124SdimINITIALIZE_PASS_BEGIN(DominanceFrontierWrapperPass, "domfrontier", 34218885Sdim "Dominance Frontier Construction", true, true) 35276479SdimINITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) 36309124SdimINITIALIZE_PASS_END(DominanceFrontierWrapperPass, "domfrontier", 37218885Sdim "Dominance Frontier Construction", true, true) 38218885Sdim 39327952SdimDominanceFrontierWrapperPass::DominanceFrontierWrapperPass() 40309124Sdim : FunctionPass(ID), DF() { 41309124Sdim initializeDominanceFrontierWrapperPassPass(*PassRegistry::getPassRegistry()); 42218885Sdim} 43218885Sdim 44309124Sdimvoid DominanceFrontierWrapperPass::releaseMemory() { 45309124Sdim DF.releaseMemory(); 46276479Sdim} 47234353Sdim 48309124Sdimbool DominanceFrontierWrapperPass::runOnFunction(Function &) { 49276479Sdim releaseMemory(); 50309124Sdim DF.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree()); 51276479Sdim return false; 52276479Sdim} 53218885Sdim 54309124Sdimvoid DominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { 55276479Sdim AU.setPreservesAll(); 56276479Sdim AU.addRequired<DominatorTreeWrapperPass>(); 57218885Sdim} 58218885Sdim 59309124Sdimvoid DominanceFrontierWrapperPass::print(raw_ostream &OS, const Module *) const { 60309124Sdim DF.print(OS); 61218885Sdim} 62218885Sdim 63243830Sdim#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) 64309124SdimLLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const { 65218885Sdim print(dbgs()); 66218885Sdim} 67243830Sdim#endif 68309124Sdim 69321369Sdim/// Handle invalidation explicitly. 70321369Sdimbool DominanceFrontier::invalidate(Function &F, const PreservedAnalyses &PA, 71321369Sdim FunctionAnalysisManager::Invalidator &) { 72321369Sdim // Check whether the analysis, all analyses on functions, or the function's 73321369Sdim // CFG have been preserved. 74321369Sdim auto PAC = PA.getChecker<DominanceFrontierAnalysis>(); 75321369Sdim return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() || 76321369Sdim PAC.preservedSet<CFGAnalyses>()); 77321369Sdim} 78321369Sdim 79314564SdimAnalysisKey DominanceFrontierAnalysis::Key; 80309124Sdim 81309124SdimDominanceFrontier DominanceFrontierAnalysis::run(Function &F, 82309124Sdim FunctionAnalysisManager &AM) { 83309124Sdim DominanceFrontier DF; 84309124Sdim DF.analyze(AM.getResult<DominatorTreeAnalysis>(F)); 85309124Sdim return DF; 86309124Sdim} 87309124Sdim 88309124SdimDominanceFrontierPrinterPass::DominanceFrontierPrinterPass(raw_ostream &OS) 89309124Sdim : OS(OS) {} 90309124Sdim 91309124SdimPreservedAnalyses 92309124SdimDominanceFrontierPrinterPass::run(Function &F, FunctionAnalysisManager &AM) { 93309124Sdim OS << "DominanceFrontier for function: " << F.getName() << "\n"; 94309124Sdim AM.getResult<DominanceFrontierAnalysis>(F).print(OS); 95309124Sdim 96309124Sdim return PreservedAnalyses::all(); 97309124Sdim} 98