diff options
| author | David Blaikie <dblaikie@gmail.com> | 2018-03-22 21:41:29 +0000 |
|---|---|---|
| committer | David Blaikie <dblaikie@gmail.com> | 2018-03-22 21:41:29 +0000 |
| commit | 3bbf5af0ac2e9b5564dfecee64ec7b0df1da4edb (patch) | |
| tree | 5acc8cb268ea6e9f96ba0599f6b1fcd22cf9589a /llvm/lib/Transforms/IPO | |
| parent | 2c2344e32779459cb04d3c0eea7d221953af0201 (diff) | |
| download | bcm5719-llvm-3bbf5af0ac2e9b5564dfecee64ec7b0df1da4edb.tar.gz bcm5719-llvm-3bbf5af0ac2e9b5564dfecee64ec7b0df1da4edb.zip | |
Fix layering between SCCP and IPO SCCP
Transforms/Scalar/SCCP.cpp implemented both the Scalar and IPO SCCP, but
this meant Transforms/Scalar including Transfroms/IPO headers, creating
a circular dependency. (IPO depends on Scalar already) - so move the IPO
SCCP shims out into IPO and the basic library implementation accessible
from Scalar/SCCP.h to be used from the IPO/SCCP.cpp implementation.
llvm-svn: 328250
Diffstat (limited to 'llvm/lib/Transforms/IPO')
| -rw-r--r-- | llvm/lib/Transforms/IPO/CMakeLists.txt | 1 | ||||
| -rw-r--r-- | llvm/lib/Transforms/IPO/SCCP.cpp | 58 |
2 files changed, 59 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/IPO/CMakeLists.txt b/llvm/lib/Transforms/IPO/CMakeLists.txt index fc22c74e535..8d819669bf5 100644 --- a/llvm/lib/Transforms/IPO/CMakeLists.txt +++ b/llvm/lib/Transforms/IPO/CMakeLists.txt @@ -29,6 +29,7 @@ add_llvm_library(LLVMipo PassManagerBuilder.cpp PruneEH.cpp SampleProfile.cpp + SCCP.cpp StripDeadPrototypes.cpp StripSymbols.cpp SyntheticCountsPropagation.cpp diff --git a/llvm/lib/Transforms/IPO/SCCP.cpp b/llvm/lib/Transforms/IPO/SCCP.cpp new file mode 100644 index 00000000000..cc53c4b8c46 --- /dev/null +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -0,0 +1,58 @@ +#include "llvm/Transforms/IPO/SCCP.h" +#include "llvm/Analysis/TargetLibraryInfo.h" +#include "llvm/Transforms/IPO.h" +#include "llvm/Transforms/Scalar/SCCP.h" + +using namespace llvm; + +PreservedAnalyses IPSCCPPass::run(Module &M, ModuleAnalysisManager &AM) { + const DataLayout &DL = M.getDataLayout(); + auto &TLI = AM.getResult<TargetLibraryAnalysis>(M); + if (!runIPSCCP(M, DL, &TLI)) + return PreservedAnalyses::all(); + return PreservedAnalyses::none(); +} + +namespace { + +//===--------------------------------------------------------------------===// +// +/// IPSCCP Class - This class implements interprocedural Sparse Conditional +/// Constant Propagation. +/// +class IPSCCPLegacyPass : public ModulePass { +public: + static char ID; + + IPSCCPLegacyPass() : ModulePass(ID) { + initializeIPSCCPLegacyPassPass(*PassRegistry::getPassRegistry()); + } + + bool runOnModule(Module &M) override { + if (skipModule(M)) + return false; + const DataLayout &DL = M.getDataLayout(); + const TargetLibraryInfo *TLI = + &getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(); + return runIPSCCP(M, DL, TLI); + } + + void getAnalysisUsage(AnalysisUsage &AU) const override { + AU.addRequired<TargetLibraryInfoWrapperPass>(); + } +}; + +} // end anonymous namespace + +char IPSCCPLegacyPass::ID = 0; + +INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp", + "Interprocedural Sparse Conditional Constant Propagation", + false, false) +INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass) +INITIALIZE_PASS_END(IPSCCPLegacyPass, "ipsccp", + "Interprocedural Sparse Conditional Constant Propagation", + false, false) + +// createIPSCCPPass - This is the public interface to this file. +ModulePass *llvm::createIPSCCPPass() { return new IPSCCPLegacyPass(); } |

