1 //===- PostDominators.cpp - Post-Dominator Calculation --------------------===//
3 // The LLVM Compiler Infrastructure
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
8 //===----------------------------------------------------------------------===//
10 // This file implements the post-dominator construction algorithms.
12 //===----------------------------------------------------------------------===//
14 #include "llvm/Analysis/PostDominators.h"
15 #include "llvm/IR/Function.h"
16 #include "llvm/IR/PassManager.h"
17 #include "llvm/Pass.h"
18 #include "llvm/Support/raw_ostream.h"
22 #define DEBUG_TYPE "postdomtree"
24 #ifdef EXPENSIVE_CHECKS
25 static constexpr bool ExpensiveChecksEnabled
= true;
27 static constexpr bool ExpensiveChecksEnabled
= false;
30 //===----------------------------------------------------------------------===//
31 // PostDominatorTree Implementation
32 //===----------------------------------------------------------------------===//
34 char PostDominatorTreeWrapperPass::ID
= 0;
36 INITIALIZE_PASS(PostDominatorTreeWrapperPass
, "postdomtree",
37 "Post-Dominator Tree Construction", true, true)
39 bool PostDominatorTree::invalidate(Function
&F
, const PreservedAnalyses
&PA
,
40 FunctionAnalysisManager::Invalidator
&) {
41 // Check whether the analysis, all analyses on functions, or the function's
42 // CFG have been preserved.
43 auto PAC
= PA
.getChecker
<PostDominatorTreeAnalysis
>();
44 return !(PAC
.preserved() || PAC
.preservedSet
<AllAnalysesOn
<Function
>>() ||
45 PAC
.preservedSet
<CFGAnalyses
>());
48 bool PostDominatorTreeWrapperPass::runOnFunction(Function
&F
) {
53 void PostDominatorTreeWrapperPass::verifyAnalysis() const {
55 assert(DT
.verify(PostDominatorTree::VerificationLevel::Full
));
56 else if (ExpensiveChecksEnabled
)
57 assert(DT
.verify(PostDominatorTree::VerificationLevel::Basic
));
60 void PostDominatorTreeWrapperPass::print(raw_ostream
&OS
, const Module
*) const {
64 FunctionPass
* llvm::createPostDomTree() {
65 return new PostDominatorTreeWrapperPass();
68 AnalysisKey
PostDominatorTreeAnalysis::Key
;
70 PostDominatorTree
PostDominatorTreeAnalysis::run(Function
&F
,
71 FunctionAnalysisManager
&) {
72 PostDominatorTree
PDT(F
);
76 PostDominatorTreePrinterPass::PostDominatorTreePrinterPass(raw_ostream
&OS
)
80 PostDominatorTreePrinterPass::run(Function
&F
, FunctionAnalysisManager
&AM
) {
81 OS
<< "PostDominatorTree for function: " << F
.getName() << "\n";
82 AM
.getResult
<PostDominatorTreeAnalysis
>(F
).print(OS
);
84 return PreservedAnalyses::all();