1336809Sdim#include "llvm/Transforms/IPO/SCCP.h"
2344779Sdim#include "llvm/Analysis/AssumptionCache.h"
3344779Sdim#include "llvm/Analysis/PostDominators.h"
4336809Sdim#include "llvm/Analysis/TargetLibraryInfo.h"
5360784Sdim#include "llvm/InitializePasses.h"
6336809Sdim#include "llvm/Transforms/IPO.h"
7336809Sdim#include "llvm/Transforms/Scalar/SCCP.h"
8336809Sdim
9336809Sdimusing namespace llvm;
10336809Sdim
11336809SdimPreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
12336809Sdim  const DataLayout &DL = M.getDataLayout();
13344779Sdim  auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
14360784Sdim  auto GetTLI = [&FAM](Function &F) -> const TargetLibraryInfo & {
15360784Sdim    return FAM.getResult<TargetLibraryAnalysis>(F);
16360784Sdim  };
17344779Sdim  auto getAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn {
18344779Sdim    DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
19344779Sdim    return {
20360784Sdim        std::make_unique<PredicateInfo>(F, DT, FAM.getResult<AssumptionAnalysis>(F)),
21344779Sdim        &DT, FAM.getCachedResult<PostDominatorTreeAnalysis>(F)};
22344779Sdim  };
23344779Sdim
24360784Sdim  if (!runIPSCCP(M, DL, GetTLI, getAnalysis))
25336809Sdim    return PreservedAnalyses::all();
26344779Sdim
27344779Sdim  PreservedAnalyses PA;
28344779Sdim  PA.preserve<DominatorTreeAnalysis>();
29344779Sdim  PA.preserve<PostDominatorTreeAnalysis>();
30344779Sdim  PA.preserve<FunctionAnalysisManagerModuleProxy>();
31344779Sdim  return PA;
32336809Sdim}
33336809Sdim
34336809Sdimnamespace {
35336809Sdim
36336809Sdim//===--------------------------------------------------------------------===//
37336809Sdim//
38336809Sdim/// IPSCCP Class - This class implements interprocedural Sparse Conditional
39336809Sdim/// Constant Propagation.
40336809Sdim///
41336809Sdimclass IPSCCPLegacyPass : public ModulePass {
42336809Sdimpublic:
43336809Sdim  static char ID;
44336809Sdim
45336809Sdim  IPSCCPLegacyPass() : ModulePass(ID) {
46336809Sdim    initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
47336809Sdim  }
48336809Sdim
49336809Sdim  bool runOnModule(Module &M) override {
50336809Sdim    if (skipModule(M))
51336809Sdim      return false;
52336809Sdim    const DataLayout &DL = M.getDataLayout();
53360784Sdim    auto GetTLI = [this](Function &F) -> const TargetLibraryInfo & {
54360784Sdim      return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
55360784Sdim    };
56344779Sdim    auto getAnalysis = [this](Function &F) -> AnalysisResultsForFn {
57344779Sdim      DominatorTree &DT =
58344779Sdim          this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
59344779Sdim      return {
60360784Sdim          std::make_unique<PredicateInfo>(
61344779Sdim              F, DT,
62344779Sdim              this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
63344779Sdim                  F)),
64344779Sdim          nullptr,  // We cannot preserve the DT or PDT with the legacy pass
65344779Sdim          nullptr}; // manager, so set them to nullptr.
66344779Sdim    };
67344779Sdim
68360784Sdim    return runIPSCCP(M, DL, GetTLI, getAnalysis);
69336809Sdim  }
70336809Sdim
71336809Sdim  void getAnalysisUsage(AnalysisUsage &AU) const override {
72344779Sdim    AU.addRequired<AssumptionCacheTracker>();
73344779Sdim    AU.addRequired<DominatorTreeWrapperPass>();
74336809Sdim    AU.addRequired<TargetLibraryInfoWrapperPass>();
75336809Sdim  }
76336809Sdim};
77336809Sdim
78336809Sdim} // end anonymous namespace
79336809Sdim
80336809Sdimchar IPSCCPLegacyPass::ID = 0;
81336809Sdim
82336809SdimINITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
83336809Sdim                      "Interprocedural Sparse Conditional Constant Propagation",
84336809Sdim                      false, false)
85353358SdimINITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
86344779SdimINITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
87336809SdimINITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
88336809SdimINITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
89336809Sdim                    "Interprocedural Sparse Conditional Constant Propagation",
90336809Sdim                    false, false)
91336809Sdim
92336809Sdim// createIPSCCPPass - This is the public interface to this file.
93336809SdimModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); }
94