diff options
Diffstat (limited to 'llvm/lib/Transforms/IPO/SCCP.cpp')
| -rw-r--r-- | llvm/lib/Transforms/IPO/SCCP.cpp | 92 | 
1 files changed, 92 insertions, 0 deletions
| diff --git a/llvm/lib/Transforms/IPO/SCCP.cpp b/llvm/lib/Transforms/IPO/SCCP.cpp new file mode 100644 index 0000000000000..307690729b141 --- /dev/null +++ b/llvm/lib/Transforms/IPO/SCCP.cpp @@ -0,0 +1,92 @@ +#include "llvm/Transforms/IPO/SCCP.h" +#include "llvm/Analysis/AssumptionCache.h" +#include "llvm/Analysis/PostDominators.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 &FAM = AM.getResult<FunctionAnalysisManagerModuleProxy>(M).getManager(); +  auto GetTLI = [&FAM](Function &F) -> const TargetLibraryInfo & { +    return FAM.getResult<TargetLibraryAnalysis>(F); +  }; +  auto getAnalysis = [&FAM](Function &F) -> AnalysisResultsForFn { +    DominatorTree &DT = FAM.getResult<DominatorTreeAnalysis>(F); +    return { +        std::make_unique<PredicateInfo>(F, DT, FAM.getResult<AssumptionAnalysis>(F)), +        &DT, FAM.getCachedResult<PostDominatorTreeAnalysis>(F)}; +  }; + +  if (!runIPSCCP(M, DL, GetTLI, getAnalysis)) +    return PreservedAnalyses::all(); + +  PreservedAnalyses PA; +  PA.preserve<DominatorTreeAnalysis>(); +  PA.preserve<PostDominatorTreeAnalysis>(); +  PA.preserve<FunctionAnalysisManagerModuleProxy>(); +  return PA; +} + +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(); +    auto GetTLI = [this](Function &F) -> const TargetLibraryInfo & { +      return this->getAnalysis<TargetLibraryInfoWrapperPass>().getTLI(F); +    }; +    auto getAnalysis = [this](Function &F) -> AnalysisResultsForFn { +      DominatorTree &DT = +          this->getAnalysis<DominatorTreeWrapperPass>(F).getDomTree(); +      return { +          std::make_unique<PredicateInfo>( +              F, DT, +              this->getAnalysis<AssumptionCacheTracker>().getAssumptionCache( +                  F)), +          nullptr,  // We cannot preserve the DT or PDT with the legacy pass +          nullptr}; // manager, so set them to nullptr. +    }; + +    return runIPSCCP(M, DL, GetTLI, getAnalysis); +  } + +  void getAnalysisUsage(AnalysisUsage &AU) const override { +    AU.addRequired<AssumptionCacheTracker>(); +    AU.addRequired<DominatorTreeWrapperPass>(); +    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(AssumptionCacheTracker) +INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass) +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(); } | 
