blob: 7cb7cdc0ebbceec759f1c267045985b406125f27 [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"
David Blaikie3bbf5af2018-03-22 21:41:29 +00003#include "llvm/Analysis/TargetLibraryInfo.h"
4#include "llvm/Transforms/IPO.h"
5#include "llvm/Transforms/Scalar/SCCP.h"
6
7using namespace llvm;
8
9PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
10 const DataLayout &DL = M.getDataLayout();
11 auto &TLI = AM.getResult<TargetLibraryAnalysis>(M);
Florian Hahn30522902018-08-23 11:04:00 +000012 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
Florian Hahna1062f42018-11-09 11:52:27 +000013 auto getAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn {
14 DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
15 return {
16 make_unique<PredicateInfo>(F, DT, FAM.getResult<AssumptionAnalysis>(F)),
17 &DT};
Florian Hahn30522902018-08-23 11:04:00 +000018 };
19
Florian Hahna1062f42018-11-09 11:52:27 +000020 if (!runIPSCCP(M, DL, &TLI, getAnalysis))
David Blaikie3bbf5af2018-03-22 21:41:29 +000021 return PreservedAnalyses::all();
Florian Hahna1062f42018-11-09 11:52:27 +000022
23 PreservedAnalyses PA;
24 PA.preserve<DominatorTreeAnalysis>();
25 PA.preserve<FunctionAnalysisManagerModuleProxy>();
26 return PA;
David Blaikie3bbf5af2018-03-22 21:41:29 +000027}
28
29namespace {
30
31//===--------------------------------------------------------------------===//
32//
33/// IPSCCP Class - This class implements interprocedural Sparse Conditional
34/// Constant Propagation.
35///
36class IPSCCPLegacyPass : public ModulePass {
37public:
38 static char ID;
39
40 IPSCCPLegacyPass() : ModulePass(ID) {
41 initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
42 }
43
44 bool runOnModule(Module &M) override {
45 if (skipModule(M))
46 return false;
47 const DataLayout &DL = M.getDataLayout();
48 const TargetLibraryInfo *TLI =
49 &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI();
Florian Hahn30522902018-08-23 11:04:00 +000050
Florian Hahna1062f42018-11-09 11:52:27 +000051 auto getAnalysis = [this](Function &F) -> AnalysisResultsForFn {
52 DominatorTree &DT =
53 this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
54 return {
55 make_unique<PredicateInfo>(
56 F, DT,
57 this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
58 F)),
59 nullptr}; // We cannot preserve the DT with the legacy pass manager,
60 // so so set it to nullptr.
Florian Hahn30522902018-08-23 11:04:00 +000061 };
62
Florian Hahna1062f42018-11-09 11:52:27 +000063 return runIPSCCP(M, DL, TLI, getAnalysis);
David Blaikie3bbf5af2018-03-22 21:41:29 +000064 }
65
66 void getAnalysisUsage(AnalysisUsage &AU) const override {
Florian Hahn30522902018-08-23 11:04:00 +000067 AU.addRequired<AssumptionCacheTracker>();
68 AU.addRequired<DominatorTreeWrapperPass>();
David Blaikie3bbf5af2018-03-22 21:41:29 +000069 AU.addRequired<TargetLibraryInfoWrapperPass>();
70 }
71};
72
73} // end anonymous namespace
74
75char IPSCCPLegacyPass::ID = 0;
76
77INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
78 "Interprocedural Sparse Conditional Constant Propagation",
79 false, false)
Florian Hahn30522902018-08-23 11:04:00 +000080INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
David Blaikie3bbf5af2018-03-22 21:41:29 +000081INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
82INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
83 "Interprocedural Sparse Conditional Constant Propagation",
84 false, false)
85
86// createIPSCCPPass - This is the public interface to this file.
87ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); }