blob: d2c34abfc13270f25dba1203155a375cc470832f [file] [log] [blame]
David Blaikie3bbf5af2018-03-22 21:41:29 +00001#include "llvm/Transforms/IPO/SCCP.h"
Florian Hahn30522902018-08-23 11:04:00 +00002#include "llvm/Analysis/AssumptionCache.h"
Florian Hahn9026d4e2018-11-11 20:22:45 +00003#include "llvm/Analysis/PostDominators.h"
David Blaikie3bbf5af2018-03-22 21:41:29 +00004#include "llvm/Analysis/TargetLibraryInfo.h"
5#include "llvm/Transforms/IPO.h"
6#include "llvm/Transforms/Scalar/SCCP.h"
7
8using namespace llvm;
9
10PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
11 const DataLayout &DL = M.getDataLayout();
12 auto &TLI = AM.getResult<TargetLibraryAnalysis>(M);
Florian Hahn30522902018-08-23 11:04:00 +000013 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
Florian Hahna1062f42018-11-09 11:52:27 +000014 auto getAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn {
15 DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
16 return {
17 make_unique<PredicateInfo>(F, DT, FAM.getResult<AssumptionAnalysis>(F)),
Florian Hahn9026d4e2018-11-11 20:22:45 +000018 &DT, FAM.getCachedResult<PostDominatorTreeAnalysis>(F)};
Florian Hahn30522902018-08-23 11:04:00 +000019 };
20
Florian Hahna1062f42018-11-09 11:52:27 +000021 if (!runIPSCCP(M, DL, &TLI, getAnalysis))
David Blaikie3bbf5af2018-03-22 21:41:29 +000022 return PreservedAnalyses::all();
Florian Hahna1062f42018-11-09 11:52:27 +000023
24 PreservedAnalyses PA;
25 PA.preserve<DominatorTreeAnalysis>();
Florian Hahn9026d4e2018-11-11 20:22:45 +000026 PA.preserve<PostDominatorTreeAnalysis>();
Florian Hahna1062f42018-11-09 11:52:27 +000027 PA.preserve<FunctionAnalysisManagerModuleProxy>();
28 return PA;
David Blaikie3bbf5af2018-03-22 21:41:29 +000029}
30
31namespace {
32
33//===--------------------------------------------------------------------===//
34//
35/// IPSCCP Class - This class implements interprocedural Sparse Conditional
36/// Constant Propagation.
37///
38class IPSCCPLegacyPass : public ModulePass {
39public:
40 static char ID;
41
42 IPSCCPLegacyPass() : ModulePass(ID) {
43 initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
44 }
45
46 bool runOnModule(Module &M) override {
47 if (skipModule(M))
48 return false;
49 const DataLayout &DL = M.getDataLayout();
50 const TargetLibraryInfo *TLI =
51 &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
Florian Hahn30522902018-08-23 11:04:00 +000052
Florian Hahna1062f42018-11-09 11:52:27 +000053 auto getAnalysis = [this](Function &F) -> AnalysisResultsForFn {
54 DominatorTree &DT =
55 this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
56 return {
57 make_unique<PredicateInfo>(
58 F, DT,
59 this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
60 F)),
Florian Hahn9026d4e2018-11-11 20:22:45 +000061 nullptr, // We cannot preserve the DT or PDT with the legacy pass
62 nullptr}; // manager, so set them to nullptr.
Florian Hahn30522902018-08-23 11:04:00 +000063 };
64
Florian Hahna1062f42018-11-09 11:52:27 +000065 return runIPSCCP(M, DL, TLI, getAnalysis);
David Blaikie3bbf5af2018-03-22 21:41:29 +000066 }
67
68 void getAnalysisUsage(AnalysisUsage &AU) const override {
Florian Hahn30522902018-08-23 11:04:00 +000069 AU.addRequired<AssumptionCacheTracker>();
70 AU.addRequired<DominatorTreeWrapperPass>();
David Blaikie3bbf5af2018-03-22 21:41:29 +000071 AU.addRequired<TargetLibraryInfoWrapperPass>();
72 }
73};
74
75} // end anonymous namespace
76
77char IPSCCPLegacyPass::ID = 0;
78
79INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
80 "Interprocedural Sparse Conditional Constant Propagation",
81 false, false)
Florian Hahn30522902018-08-23 11:04:00 +000082INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
David Blaikie3bbf5af2018-03-22 21:41:29 +000083INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
84INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
85 "Interprocedural Sparse Conditional Constant Propagation",
86 false, false)
87
88// createIPSCCPPass - This is the public interface to this file.
89ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); }