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