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