blob: c08c6cfe0c3bc3b36dd6b4a12430f2fd89aa63d0 [file] [log] [blame]
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +00001//===- DominanceFrontier.cpp - Dominance Frontier Calculation -------------===//
2//
3// The LLVM Compiler Infrastructure
4//
5// This file is distributed under the University of Illinois Open Source
6// License. See LICENSE.TXT for details.
7//
8//===----------------------------------------------------------------------===//
9
10#include "llvm/Analysis/DominanceFrontier.h"
Matt Arsenault4181ea32014-07-12 21:59:52 +000011#include "llvm/Analysis/DominanceFrontierImpl.h"
Hongbin Zheng751337f2016-02-25 17:54:15 +000012#include "llvm/IR/PassManager.h"
Matt Arsenault4181ea32014-07-12 21:59:52 +000013
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000014using namespace llvm;
15
Matt Arsenault4181ea32014-07-12 21:59:52 +000016namespace llvm {
Jakub Kuderskib292c222017-07-14 18:26:09 +000017template class DominanceFrontierBase<BasicBlock, false>;
18template class DominanceFrontierBase<BasicBlock, true>;
Matt Arsenault4181ea32014-07-12 21:59:52 +000019template class ForwardDominanceFrontierBase<BasicBlock>;
20}
21
Hongbin Zheng751337f2016-02-25 17:54:15 +000022char DominanceFrontierWrapperPass::ID = 0;
Matt Arsenault4181ea32014-07-12 21:59:52 +000023
Hongbin Zheng751337f2016-02-25 17:54:15 +000024INITIALIZE_PASS_BEGIN(DominanceFrontierWrapperPass, "domfrontier",
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000025 "Dominance Frontier Construction", true, true)
Chandler Carruth73523022014-01-13 13:07:17 +000026INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
Hongbin Zheng751337f2016-02-25 17:54:15 +000027INITIALIZE_PASS_END(DominanceFrontierWrapperPass, "domfrontier",
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000028 "Dominance Frontier Construction", true, true)
29
Hongbin Zheng751337f2016-02-25 17:54:15 +000030 DominanceFrontierWrapperPass::DominanceFrontierWrapperPass()
31 : FunctionPass(ID), DF() {
32 initializeDominanceFrontierWrapperPassPass(*PassRegistry::getPassRegistry());
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000033}
34
Hongbin Zheng751337f2016-02-25 17:54:15 +000035void DominanceFrontierWrapperPass::releaseMemory() {
36 DF.releaseMemory();
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000037}
38
Hongbin Zheng751337f2016-02-25 17:54:15 +000039bool DominanceFrontierWrapperPass::runOnFunction(Function &) {
Matt Arsenault4181ea32014-07-12 21:59:52 +000040 releaseMemory();
Hongbin Zheng751337f2016-02-25 17:54:15 +000041 DF.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree());
Matt Arsenault4181ea32014-07-12 21:59:52 +000042 return false;
43}
44
Hongbin Zheng751337f2016-02-25 17:54:15 +000045void DominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
Matt Arsenault4181ea32014-07-12 21:59:52 +000046 AU.setPreservesAll();
47 AU.addRequired<DominatorTreeWrapperPass>();
48}
49
Hongbin Zheng751337f2016-02-25 17:54:15 +000050void DominanceFrontierWrapperPass::print(raw_ostream &OS, const Module *) const {
51 DF.print(OS);
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000052}
53
Manman Ren49d684e2012-09-12 05:06:18 +000054#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
Hongbin Zheng751337f2016-02-25 17:54:15 +000055LLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const {
Cameron Zwarich6b0c4c92011-01-18 06:06:27 +000056 print(dbgs());
57}
Manman Renc3366cc2012-09-06 19:55:56 +000058#endif
Hongbin Zheng751337f2016-02-25 17:54:15 +000059
Chandler Carruthca68a3e2017-01-15 06:32:49 +000060/// Handle invalidation explicitly.
61bool DominanceFrontier::invalidate(Function &F, const PreservedAnalyses &PA,
62 FunctionAnalysisManager::Invalidator &) {
63 // Check whether the analysis, all analyses on functions, or the function's
64 // CFG have been preserved.
65 auto PAC = PA.getChecker<DominanceFrontierAnalysis>();
66 return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
67 PAC.preservedSet<CFGAnalyses>());
68}
69
Chandler Carruthdab4eae2016-11-23 17:53:26 +000070AnalysisKey DominanceFrontierAnalysis::Key;
NAKAMURA Takumidf0cd722016-02-28 17:17:00 +000071
Hongbin Zheng751337f2016-02-25 17:54:15 +000072DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
Chandler Carruthb47f8012016-03-11 11:05:24 +000073 FunctionAnalysisManager &AM) {
Hongbin Zheng751337f2016-02-25 17:54:15 +000074 DominanceFrontier DF;
Chandler Carruthb47f8012016-03-11 11:05:24 +000075 DF.analyze(AM.getResult<DominatorTreeAnalysis>(F));
Hongbin Zheng751337f2016-02-25 17:54:15 +000076 return DF;
77}
78
79DominanceFrontierPrinterPass::DominanceFrontierPrinterPass(raw_ostream &OS)
80 : OS(OS) {}
81
82PreservedAnalyses
Chandler Carruthb47f8012016-03-11 11:05:24 +000083DominanceFrontierPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
Hongbin Zheng751337f2016-02-25 17:54:15 +000084 OS << "DominanceFrontier for function: " << F.getName() << "\n";
Chandler Carruthb47f8012016-03-11 11:05:24 +000085 AM.getResult<DominanceFrontierAnalysis>(F).print(OS);
Hongbin Zheng751337f2016-02-25 17:54:15 +000086
87 return PreservedAnalyses::all();
88}