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