mirror of
https://github.com/RPCSX/llvm.git
synced 2024-12-11 05:35:11 +00:00
10dd00ced5
a function's CFG when that CFG is unchanged. This allows transformation passes to simply claim they preserve the CFG and analysis passes to check for the CFG being preserved to remove the fanout of all analyses being listed in all passes. I've gone through and removed or cleaned up as many of the comments reminding us to do this as I could. Differential Revision: https://reviews.llvm.org/D28627 git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@292054 91177308-0d34-0410-b5e6-96231b3b80d8
88 lines
2.8 KiB
C++
88 lines
2.8 KiB
C++
//===- DominanceFrontier.cpp - Dominance Frontier Calculation -------------===//
|
|
//
|
|
// The LLVM Compiler Infrastructure
|
|
//
|
|
// This file is distributed under the University of Illinois Open Source
|
|
// License. See LICENSE.TXT for details.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
|
|
#include "llvm/Analysis/DominanceFrontier.h"
|
|
#include "llvm/Analysis/DominanceFrontierImpl.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
|
|
using namespace llvm;
|
|
|
|
namespace llvm {
|
|
template class DominanceFrontierBase<BasicBlock>;
|
|
template class ForwardDominanceFrontierBase<BasicBlock>;
|
|
}
|
|
|
|
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();
|
|
}
|