Mercurial > hg > CbC > CbC_llvm
comparison lib/Transforms/IPO/SCCP.cpp @ 147:c2174574ed3a
LLVM 10
author | Shinji KONO <kono@ie.u-ryukyu.ac.jp> |
---|---|
date | Wed, 14 Aug 2019 16:55:33 +0900 |
parents | |
children |
comparison
equal
deleted
inserted
replaced
134:3a76565eade5 | 147:c2174574ed3a |
---|---|
1 #include "llvm/Transforms/IPO/SCCP.h" | |
2 #include "llvm/Analysis/AssumptionCache.h" | |
3 #include "llvm/Analysis/PostDominators.h" | |
4 #include "llvm/Analysis/TargetLibraryInfo.h" | |
5 #include "llvm/Transforms/IPO.h" | |
6 #include "llvm/Transforms/Scalar/SCCP.h" | |
7 | |
8 using namespace llvm; | |
9 | |
10 PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) { | |
11 const DataLayout &DL = M.getDataLayout(); | |
12 auto &TLI = AM.getResult<TargetLibraryAnalysis>(M); | |
13 auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); | |
14 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)), | |
18 &DT, FAM.getCachedResult<PostDominatorTreeAnalysis>(F)}; | |
19 }; | |
20 | |
21 if (!runIPSCCP(M, DL, &TLI, getAnalysis)) | |
22 return PreservedAnalyses::all(); | |
23 | |
24 PreservedAnalyses PA; | |
25 PA.preserve<DominatorTreeAnalysis>(); | |
26 PA.preserve<PostDominatorTreeAnalysis>(); | |
27 PA.preserve<FunctionAnalysisManagerModuleProxy>(); | |
28 return PA; | |
29 } | |
30 | |
31 namespace { | |
32 | |
33 //===--------------------------------------------------------------------===// | |
34 // | |
35 /// IPSCCP Class - This class implements interprocedural Sparse Conditional | |
36 /// Constant Propagation. | |
37 /// | |
38 class IPSCCPLegacyPass : public ModulePass { | |
39 public: | |
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(); | |
52 | |
53 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)), | |
61 nullptr, // We cannot preserve the DT or PDT with the legacy pass | |
62 nullptr}; // manager, so set them to nullptr. | |
63 }; | |
64 | |
65 return runIPSCCP(M, DL, TLI, getAnalysis); | |
66 } | |
67 | |
68 void getAnalysisUsage(AnalysisUsage &AU) const override { | |
69 AU.addRequired<AssumptionCacheTracker>(); | |
70 AU.addRequired<DominatorTreeWrapperPass>(); | |
71 AU.addRequired<TargetLibraryInfoWrapperPass>(); | |
72 } | |
73 }; | |
74 | |
75 } // end anonymous namespace | |
76 | |
77 char IPSCCPLegacyPass::ID = 0; | |
78 | |
79 INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp", | |
80 "Interprocedural Sparse Conditional Constant Propagation", | |
81 false, false) | |
82 INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker) | |
83 INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) | |
84 INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) | |
85 INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp", | |
86 "Interprocedural Sparse Conditional Constant Propagation", | |
87 false, false) | |
88 | |
89 // createIPSCCPPass - This is the public interface to this file. | |
90 ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); } |