diff options
Diffstat (limited to 'llvm/lib/Analysis/DominanceFrontier.cpp')
-rw-r--r-- | llvm/lib/Analysis/DominanceFrontier.cpp | 96 |
1 files changed, 96 insertions, 0 deletions
diff --git a/llvm/lib/Analysis/DominanceFrontier.cpp b/llvm/lib/Analysis/DominanceFrontier.cpp new file mode 100644 index 000000000000..f9a554acb7ea --- /dev/null +++ b/llvm/lib/Analysis/DominanceFrontier.cpp @@ -0,0 +1,96 @@ +//===- DominanceFrontier.cpp - Dominance Frontier Calculation -------------===// +// +// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. +// See https://llvm.org/LICENSE.txt for license information. +// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception +// +//===----------------------------------------------------------------------===// + +#include "llvm/Analysis/DominanceFrontier.h" +#include "llvm/Analysis/DominanceFrontierImpl.h" +#include "llvm/Config/llvm-config.h" +#include "llvm/IR/Dominators.h" +#include "llvm/IR/Function.h" +#include "llvm/IR/PassManager.h" +#include "llvm/Pass.h" +#include "llvm/Support/Compiler.h" +#include "llvm/Support/Debug.h" +#include "llvm/Support/raw_ostream.h" + +using namespace llvm; + +namespace llvm { + +template class DominanceFrontierBase<BasicBlock, false>; +template class DominanceFrontierBase<BasicBlock, true>; +template class ForwardDominanceFrontierBase<BasicBlock>; + +} // end namespace llvm + +char DominanceFrontierWrapperPass::ID = 0; + +INITIALIZE_PASS_BEGIN(DominanceFrontierWrapperPass, "domfrontier", + "Dominance Frontier Construction", true, true) +INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) +INITIALIZE_PASS_END(DominanceFrontierWrapperPass, "domfrontier", + "Dominance Frontier Construction", true, true) + +DominanceFrontierWrapperPass::DominanceFrontierWrapperPass() + : FunctionPass(ID), DF() { + initializeDominanceFrontierWrapperPassPass(*PassRegistry::getPassRegistry()); +} + +void DominanceFrontierWrapperPass::releaseMemory() { + DF.releaseMemory(); +} + +bool DominanceFrontierWrapperPass::runOnFunction(Function &) { + releaseMemory(); + DF.analyze(getAnalysis<DominatorTreeWrapperPass>().getDomTree()); + return false; +} + +void DominanceFrontierWrapperPass::getAnalysisUsage(AnalysisUsage &AU) const { + AU.setPreservesAll(); + AU.addRequired<DominatorTreeWrapperPass>(); +} + +void DominanceFrontierWrapperPass::print(raw_ostream &OS, const Module *) const { + DF.print(OS); +} + +#if !defined(NDEBUG) || defined(LLVM_ENABLE_DUMP) +LLVM_DUMP_METHOD void DominanceFrontierWrapperPass::dump() const { + print(dbgs()); +} +#endif + +/// Handle invalidation explicitly. +bool DominanceFrontier::invalidate(Function &F, const PreservedAnalyses &PA, + FunctionAnalysisManager::Invalidator &) { + // Check whether the analysis, all analyses on functions, or the function's + // CFG have been preserved. + auto PAC = PA.getChecker<DominanceFrontierAnalysis>(); + return !(PAC.preserved() || PAC.preservedSet<AllAnalysesOn<Function>>() || + PAC.preservedSet<CFGAnalyses>()); +} + +AnalysisKey DominanceFrontierAnalysis::Key; + +DominanceFrontier DominanceFrontierAnalysis::run(Function &F, + FunctionAnalysisManager &AM) { + DominanceFrontier DF; + DF.analyze(AM.getResult<DominatorTreeAnalysis>(F)); + return DF; +} + +DominanceFrontierPrinterPass::DominanceFrontierPrinterPass(raw_ostream &OS) + : OS(OS) {} + +PreservedAnalyses +DominanceFrontierPrinterPass::run(Function &F, FunctionAnalysisManager &AM) { + OS << "DominanceFrontier for function: " << F.getName() << "\n"; + AM.getResult<DominanceFrontierAnalysis>(F).print(OS); + + return PreservedAnalyses::all(); +} |