162c41cfbSChris Lattner //===-- SCCP.cpp ----------------------------------------------------------===//
262c41cfbSChris Lattner //
362c41cfbSChris Lattner // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
462c41cfbSChris Lattner // See https://llvm.org/LICENSE.txt for license information.
562c41cfbSChris Lattner // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
662c41cfbSChris Lattner //
762c41cfbSChris Lattner //===----------------------------------------------------------------------===//
862c41cfbSChris Lattner //
962c41cfbSChris Lattner // This file implements Interprocedural Sparse Conditional Constant Propagation.
1062c41cfbSChris Lattner //
1162c41cfbSChris Lattner //===----------------------------------------------------------------------===//
1262c41cfbSChris Lattner
133bbf5af0SDavid Blaikie #include "llvm/Transforms/IPO/SCCP.h"
143052290dSFlorian Hahn #include "llvm/Analysis/AssumptionCache.h"
159026d4eeSFlorian Hahn #include "llvm/Analysis/PostDominators.h"
163bbf5af0SDavid Blaikie #include "llvm/Analysis/TargetLibraryInfo.h"
17c4a0969bSSjoerd Meijer #include "llvm/Analysis/TargetTransformInfo.h"
1805da2fe5SReid Kleckner #include "llvm/InitializePasses.h"
193bbf5af0SDavid Blaikie #include "llvm/Transforms/IPO.h"
203bbf5af0SDavid Blaikie #include "llvm/Transforms/Scalar/SCCP.h"
2159630917Sserge-sans-paille #include "llvm/Transforms/Utils/SCCPSolver.h"
223bbf5af0SDavid Blaikie
233bbf5af0SDavid Blaikie using namespace llvm;
243bbf5af0SDavid Blaikie
run(Module & M,ModuleAnalysisManager & AM)253bbf5af0SDavid Blaikie PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) {
263bbf5af0SDavid Blaikie const DataLayout &DL = M.getDataLayout();
273052290dSFlorian Hahn auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
289c27b59cSTeresa Johnson auto GetTLI = [&FAM](Function &F) -> const TargetLibraryInfo & {
299c27b59cSTeresa Johnson return FAM.getResult<TargetLibraryAnalysis>(F);
309c27b59cSTeresa Johnson };
31a1062f4bSFlorian Hahn auto getAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn {
32a1062f4bSFlorian Hahn DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
33a1062f4bSFlorian Hahn return {
340eaee545SJonas Devlieghere std::make_unique<PredicateInfo>(F, DT, FAM.getResult<AssumptionAnalysis>(F)),
359026d4eeSFlorian Hahn &DT, FAM.getCachedResult<PostDominatorTreeAnalysis>(F)};
363052290dSFlorian Hahn };
373052290dSFlorian Hahn
389c27b59cSTeresa Johnson if (!runIPSCCP(M, DL, GetTLI, getAnalysis))
393bbf5af0SDavid Blaikie return PreservedAnalyses::all();
40a1062f4bSFlorian Hahn
41a1062f4bSFlorian Hahn PreservedAnalyses PA;
42a1062f4bSFlorian Hahn PA.preserve<DominatorTreeAnalysis>();
439026d4eeSFlorian Hahn PA.preserve<PostDominatorTreeAnalysis>();
44a1062f4bSFlorian Hahn PA.preserve<FunctionAnalysisManagerModuleProxy>();
45a1062f4bSFlorian Hahn return PA;
463bbf5af0SDavid Blaikie }
473bbf5af0SDavid Blaikie
483bbf5af0SDavid Blaikie namespace {
493bbf5af0SDavid Blaikie
503bbf5af0SDavid Blaikie //===--------------------------------------------------------------------===//
513bbf5af0SDavid Blaikie //
523bbf5af0SDavid Blaikie /// IPSCCP Class - This class implements interprocedural Sparse Conditional
533bbf5af0SDavid Blaikie /// Constant Propagation.
543bbf5af0SDavid Blaikie ///
553bbf5af0SDavid Blaikie class IPSCCPLegacyPass : public ModulePass {
563bbf5af0SDavid Blaikie public:
573bbf5af0SDavid Blaikie static char ID;
583bbf5af0SDavid Blaikie
IPSCCPLegacyPass()593bbf5af0SDavid Blaikie IPSCCPLegacyPass() : ModulePass(ID) {
603bbf5af0SDavid Blaikie initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry());
613bbf5af0SDavid Blaikie }
623bbf5af0SDavid Blaikie
runOnModule(Module & M)633bbf5af0SDavid Blaikie bool runOnModule(Module &M) override {
643bbf5af0SDavid Blaikie if (skipModule(M))
653bbf5af0SDavid Blaikie return false;
663bbf5af0SDavid Blaikie const DataLayout &DL = M.getDataLayout();
679c27b59cSTeresa Johnson auto GetTLI = [this](Function &F) -> const TargetLibraryInfo & {
689c27b59cSTeresa Johnson return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
699c27b59cSTeresa Johnson };
70a1062f4bSFlorian Hahn auto getAnalysis = [this](Function &F) -> AnalysisResultsForFn {
71a1062f4bSFlorian Hahn DominatorTree &DT =
72a1062f4bSFlorian Hahn this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
73a1062f4bSFlorian Hahn return {
740eaee545SJonas Devlieghere std::make_unique<PredicateInfo>(
75a1062f4bSFlorian Hahn F, DT,
76a1062f4bSFlorian Hahn this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
77a1062f4bSFlorian Hahn F)),
789026d4eeSFlorian Hahn nullptr, // We cannot preserve the DT or PDT with the legacy pass
799026d4eeSFlorian Hahn nullptr}; // manager, so set them to nullptr.
803052290dSFlorian Hahn };
813052290dSFlorian Hahn
829c27b59cSTeresa Johnson return runIPSCCP(M, DL, GetTLI, getAnalysis);
833bbf5af0SDavid Blaikie }
843bbf5af0SDavid Blaikie
getAnalysisUsage(AnalysisUsage & AU) const853bbf5af0SDavid Blaikie void getAnalysisUsage(AnalysisUsage &AU) const override {
863052290dSFlorian Hahn AU.addRequired<AssumptionCacheTracker>();
873052290dSFlorian Hahn AU.addRequired<DominatorTreeWrapperPass>();
883bbf5af0SDavid Blaikie AU.addRequired<TargetLibraryInfoWrapperPass>();
893bbf5af0SDavid Blaikie }
903bbf5af0SDavid Blaikie };
913bbf5af0SDavid Blaikie
923bbf5af0SDavid Blaikie } // end anonymous namespace
933bbf5af0SDavid Blaikie
943bbf5af0SDavid Blaikie char IPSCCPLegacyPass::ID = 0;
953bbf5af0SDavid Blaikie
963bbf5af0SDavid Blaikie INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp",
973bbf5af0SDavid Blaikie "Interprocedural Sparse Conditional Constant Propagation",
983bbf5af0SDavid Blaikie false, false)
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)99e90d5c8dSJustin Bogner INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
1003052290dSFlorian Hahn INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
1013bbf5af0SDavid Blaikie INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
1023bbf5af0SDavid Blaikie INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp",
1033bbf5af0SDavid Blaikie "Interprocedural Sparse Conditional Constant Propagation",
1043bbf5af0SDavid Blaikie false, false)
1053bbf5af0SDavid Blaikie
1063bbf5af0SDavid Blaikie // createIPSCCPPass - This is the public interface to this file.
1073bbf5af0SDavid Blaikie ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); }
108c4a0969bSSjoerd Meijer
run(Module & M,ModuleAnalysisManager & AM)109c4a0969bSSjoerd Meijer PreservedAnalyses FunctionSpecializationPass::run(Module &M,
110c4a0969bSSjoerd Meijer ModuleAnalysisManager &AM) {
111c4a0969bSSjoerd Meijer const DataLayout &DL = M.getDataLayout();
112c4a0969bSSjoerd Meijer auto &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager();
113c4a0969bSSjoerd Meijer auto GetTLI = [&FAM](Function &F) -> TargetLibraryInfo & {
114c4a0969bSSjoerd Meijer return FAM.getResult<TargetLibraryAnalysis>(F);
115c4a0969bSSjoerd Meijer };
116c4a0969bSSjoerd Meijer auto GetTTI = [&FAM](Function &F) -> TargetTransformInfo & {
117c4a0969bSSjoerd Meijer return FAM.getResult<TargetIRAnalysis>(F);
118c4a0969bSSjoerd Meijer };
119c4a0969bSSjoerd Meijer auto GetAC = [&FAM](Function &F) -> AssumptionCache & {
120c4a0969bSSjoerd Meijer return FAM.getResult<AssumptionAnalysis>(F);
121c4a0969bSSjoerd Meijer };
122c4a0969bSSjoerd Meijer auto GetAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn {
123c4a0969bSSjoerd Meijer DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F);
124c4a0969bSSjoerd Meijer return {std::make_unique<PredicateInfo>(
125c4a0969bSSjoerd Meijer F, DT, FAM.getResult<AssumptionAnalysis>(F)),
126c4a0969bSSjoerd Meijer &DT, FAM.getCachedResult<PostDominatorTreeAnalysis>(F)};
127c4a0969bSSjoerd Meijer };
128c4a0969bSSjoerd Meijer
129c4a0969bSSjoerd Meijer if (!runFunctionSpecialization(M, DL, GetTLI, GetTTI, GetAC, GetAnalysis))
130c4a0969bSSjoerd Meijer return PreservedAnalyses::all();
131c4a0969bSSjoerd Meijer
132c4a0969bSSjoerd Meijer PreservedAnalyses PA;
133c4a0969bSSjoerd Meijer PA.preserve<DominatorTreeAnalysis>();
134c4a0969bSSjoerd Meijer PA.preserve<PostDominatorTreeAnalysis>();
135c4a0969bSSjoerd Meijer PA.preserve<FunctionAnalysisManagerModuleProxy>();
136c4a0969bSSjoerd Meijer return PA;
137c4a0969bSSjoerd Meijer }
138c4a0969bSSjoerd Meijer
1399b8b1645SBenjamin Kramer namespace {
140c4a0969bSSjoerd Meijer struct FunctionSpecializationLegacyPass : public ModulePass {
141c4a0969bSSjoerd Meijer static char ID; // Pass identification, replacement for typeid
FunctionSpecializationLegacyPass__anon0b6597be0a11::FunctionSpecializationLegacyPass142c4a0969bSSjoerd Meijer FunctionSpecializationLegacyPass() : ModulePass(ID) {}
143c4a0969bSSjoerd Meijer
getAnalysisUsage__anon0b6597be0a11::FunctionSpecializationLegacyPass144c4a0969bSSjoerd Meijer void getAnalysisUsage(AnalysisUsage &AU) const override {
145c4a0969bSSjoerd Meijer AU.addRequired<AssumptionCacheTracker>();
146c4a0969bSSjoerd Meijer AU.addRequired<DominatorTreeWrapperPass>();
147c4a0969bSSjoerd Meijer AU.addRequired<TargetLibraryInfoWrapperPass>();
148c4a0969bSSjoerd Meijer AU.addRequired<TargetTransformInfoWrapperPass>();
149c4a0969bSSjoerd Meijer }
150c4a0969bSSjoerd Meijer
runOnModule__anon0b6597be0a11::FunctionSpecializationLegacyPass151*b5188591SKazu Hirata bool runOnModule(Module &M) override {
152c4a0969bSSjoerd Meijer if (skipModule(M))
153c4a0969bSSjoerd Meijer return false;
154c4a0969bSSjoerd Meijer
155c4a0969bSSjoerd Meijer const DataLayout &DL = M.getDataLayout();
156c4a0969bSSjoerd Meijer auto GetTLI = [this](Function &F) -> TargetLibraryInfo & {
157c4a0969bSSjoerd Meijer return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F);
158c4a0969bSSjoerd Meijer };
159c4a0969bSSjoerd Meijer auto GetTTI = [this](Function &F) -> TargetTransformInfo & {
160c4a0969bSSjoerd Meijer return this->getAnalysis<TargetTransformInfoWrapperPass>().getTTI(F);
161c4a0969bSSjoerd Meijer };
162c4a0969bSSjoerd Meijer auto GetAC = [this](Function &F) -> AssumptionCache & {
163c4a0969bSSjoerd Meijer return this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(F);
164c4a0969bSSjoerd Meijer };
165c4a0969bSSjoerd Meijer
166c4a0969bSSjoerd Meijer auto GetAnalysis = [this](Function &F) -> AnalysisResultsForFn {
167c4a0969bSSjoerd Meijer DominatorTree &DT =
168c4a0969bSSjoerd Meijer this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree();
169c4a0969bSSjoerd Meijer return {
170c4a0969bSSjoerd Meijer std::make_unique<PredicateInfo>(
171c4a0969bSSjoerd Meijer F, DT,
172c4a0969bSSjoerd Meijer this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache(
173c4a0969bSSjoerd Meijer F)),
174c4a0969bSSjoerd Meijer nullptr, // We cannot preserve the DT or PDT with the legacy pass
175c4a0969bSSjoerd Meijer nullptr}; // manager, so set them to nullptr.
176c4a0969bSSjoerd Meijer };
177c4a0969bSSjoerd Meijer return runFunctionSpecialization(M, DL, GetTLI, GetTTI, GetAC, GetAnalysis);
178c4a0969bSSjoerd Meijer }
179c4a0969bSSjoerd Meijer };
1809b8b1645SBenjamin Kramer } // namespace
181c4a0969bSSjoerd Meijer
182c4a0969bSSjoerd Meijer char FunctionSpecializationLegacyPass::ID = 0;
183c4a0969bSSjoerd Meijer
184c4a0969bSSjoerd Meijer INITIALIZE_PASS_BEGIN(
185c4a0969bSSjoerd Meijer FunctionSpecializationLegacyPass, "function-specialization",
186c4a0969bSSjoerd Meijer "Propagate constant arguments by specializing the function", false, false)
187c4a0969bSSjoerd Meijer
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)188c4a0969bSSjoerd Meijer INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
189c4a0969bSSjoerd Meijer INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
190c4a0969bSSjoerd Meijer INITIALIZE_PASS_DEPENDENCY(TargetTransformInfoWrapperPass)
191c4a0969bSSjoerd Meijer INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
192c4a0969bSSjoerd Meijer INITIALIZE_PASS_END(FunctionSpecializationLegacyPass, "function-specialization",
193c4a0969bSSjoerd Meijer "Propagate constant arguments by specializing the function",
194c4a0969bSSjoerd Meijer false, false)
195c4a0969bSSjoerd Meijer
196c4a0969bSSjoerd Meijer ModulePass *llvm::createFunctionSpecializationPass() {
197c4a0969bSSjoerd Meijer return new FunctionSpecializationLegacyPass();
198c4a0969bSSjoerd Meijer }
199