xref: /freebsd-src/contrib/llvm-project/llvm/lib/Analysis/DominanceFrontier.cpp (revision 81ad626541db97eb356e2c1d4a20eb2a26a766ab)
10b57cec5SDimitry Andric //===- DominanceFrontier.cpp - Dominance Frontier Calculation -------------===//
20b57cec5SDimitry Andric //
30b57cec5SDimitry Andric // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
40b57cec5SDimitry Andric // See https://llvm.org/LICENSE.txt for license information.
50b57cec5SDimitry Andric // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
60b57cec5SDimitry Andric //
70b57cec5SDimitry Andric //===----------------------------------------------------------------------===//
80b57cec5SDimitry Andric 
90b57cec5SDimitry Andric #include "llvm/Analysis/DominanceFrontier.h"
100b57cec5SDimitry Andric #include "llvm/Analysis/DominanceFrontierImpl.h"
110b57cec5SDimitry Andric #include "llvm/Config/llvm-config.h"
120b57cec5SDimitry Andric #include "llvm/IR/Dominators.h"
130b57cec5SDimitry Andric #include "llvm/IR/Function.h"
140b57cec5SDimitry Andric #include "llvm/IR/PassManager.h"
15480093f4SDimitry Andric #include "llvm/InitializePasses.h"
160b57cec5SDimitry Andric #include "llvm/Pass.h"
170b57cec5SDimitry Andric #include "llvm/Support/Compiler.h"
180b57cec5SDimitry Andric #include "llvm/Support/raw_ostream.h"
190b57cec5SDimitry Andric 
200b57cec5SDimitry Andric using namespace llvm;
210b57cec5SDimitry Andric 
220b57cec5SDimitry Andric namespace llvm {
230b57cec5SDimitry Andric 
240b57cec5SDimitry Andric template class DominanceFrontierBase<BasicBlock, false>;
250b57cec5SDimitry Andric template class DominanceFrontierBase<BasicBlock, true>;
260b57cec5SDimitry Andric template class ForwardDominanceFrontierBase<BasicBlock>;
270b57cec5SDimitry Andric 
280b57cec5SDimitry Andric } // end namespace llvm
290b57cec5SDimitry Andric 
300b57cec5SDimitry Andric char DominanceFrontierWrapperPass::ID = 0;
310b57cec5SDimitry Andric 
320b57cec5SDimitry Andric INITIALIZE_PASS_BEGIN(DominanceFrontierWrapperPass, "domfrontier",
330b57cec5SDimitry Andric                 "Dominance Frontier Construction", true, true)
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)340b57cec5SDimitry Andric INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
350b57cec5SDimitry Andric INITIALIZE_PASS_END(DominanceFrontierWrapperPass, "domfrontier",
360b57cec5SDimitry Andric                 "Dominance Frontier Construction", true, true)
370b57cec5SDimitry Andric 
380b57cec5SDimitry Andric DominanceFrontierWrapperPass::DominanceFrontierWrapperPass()
39*04eeddc0SDimitry Andric     : FunctionPass(ID) {
400b57cec5SDimitry Andric   initializeDominanceFrontierWrapperPassPass(*PassRegistry::getPassRegistry());
410b57cec5SDimitry Andric }
420b57cec5SDimitry Andric 
releaseMemory()430b57cec5SDimitry Andric void DominanceFrontierWrapperPass::releaseMemory() {
440b57cec5SDimitry Andric   DF.releaseMemory();
450b57cec5SDimitry Andric }
460b57cec5SDimitry Andric 
runOnFunction(Function &)470b57cec5SDimitry Andric bool DominanceFrontierWrapperPass::runOnFunction(Function &) {
480b57cec5SDimitry Andric   releaseMemory();
490b57cec5SDimitry Andric   DF.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree());
500b57cec5SDimitry Andric   return false;
510b57cec5SDimitry Andric }
520b57cec5SDimitry Andric 
getAnalysisUsage(AnalysisUsage & AU) const530b57cec5SDimitry Andric void DominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const {
540b57cec5SDimitry Andric   AU.setPreservesAll();
550b57cec5SDimitry Andric   AU.addRequired<DominatorTreeWrapperPass>();
560b57cec5SDimitry Andric }
570b57cec5SDimitry Andric 
print(raw_ostream & OS,const Module *) const580b57cec5SDimitry Andric void DominanceFrontierWrapperPass::print(raw_ostream &OS, const Module *) const {
590b57cec5SDimitry Andric   DF.print(OS);
600b57cec5SDimitry Andric }
610b57cec5SDimitry Andric 
620b57cec5SDimitry Andric #if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP)
dump() const630b57cec5SDimitry Andric LLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const {
640b57cec5SDimitry Andric   print(dbgs());
650b57cec5SDimitry Andric }
660b57cec5SDimitry Andric #endif
670b57cec5SDimitry Andric 
680b57cec5SDimitry Andric /// Handle invalidation explicitly.
invalidate(Function & F,const PreservedAnalyses & PA,FunctionAnalysisManager::Invalidator &)690b57cec5SDimitry Andric bool DominanceFrontier::invalidate(Function &F, const PreservedAnalyses &PA,
700b57cec5SDimitry Andric                                    FunctionAnalysisManager::Invalidator &) {
710b57cec5SDimitry Andric   // Check whether the analysis, all analyses on functions, or the function's
720b57cec5SDimitry Andric   // CFG have been preserved.
730b57cec5SDimitry Andric   auto PAC = PA.getChecker<DominanceFrontierAnalysis>();
740b57cec5SDimitry Andric   return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() ||
750b57cec5SDimitry Andric            PAC.preservedSet<CFGAnalyses>());
760b57cec5SDimitry Andric }
770b57cec5SDimitry Andric 
780b57cec5SDimitry Andric AnalysisKey DominanceFrontierAnalysis::Key;
790b57cec5SDimitry Andric 
run(Function & F,FunctionAnalysisManager & AM)800b57cec5SDimitry Andric DominanceFrontier DominanceFrontierAnalysis::run(Function &F,
810b57cec5SDimitry Andric                                                  FunctionAnalysisManager &AM) {
820b57cec5SDimitry Andric   DominanceFrontier DF;
830b57cec5SDimitry Andric   DF.analyze(AM.getResult<DominatorTreeAnalysis>(F));
840b57cec5SDimitry Andric   return DF;
850b57cec5SDimitry Andric }
860b57cec5SDimitry Andric 
DominanceFrontierPrinterPass(raw_ostream & OS)870b57cec5SDimitry Andric DominanceFrontierPrinterPass::DominanceFrontierPrinterPass(raw_ostream &OS)
880b57cec5SDimitry Andric   : OS(OS) {}
890b57cec5SDimitry Andric 
900b57cec5SDimitry Andric PreservedAnalyses
run(Function & F,FunctionAnalysisManager & AM)910b57cec5SDimitry Andric DominanceFrontierPrinterPass::run(Function &F, FunctionAnalysisManager &AM) {
920b57cec5SDimitry Andric   OS << "DominanceFrontier for function: " << F.getName() << "\n";
930b57cec5SDimitry Andric   AM.getResult<DominanceFrontierAnalysis>(F).print(OS);
940b57cec5SDimitry Andric 
950b57cec5SDimitry Andric   return PreservedAnalyses::all();
960b57cec5SDimitry Andric }
97