#include "llvm/Transforms/IPO/SCCP.h" #include "llvm/Analysis/AssumptionCache.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(M); auto &FAM = AM.getResult(M).getManager(); auto getPredicateInfo = [&FAM](Function &F) -> std::unique_ptr { return make_unique(F, FAM.getResult(F), FAM.getResult(F)); }; if (!runIPSCCP(M, DL, &TLI, getPredicateInfo)) 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().getTLI(); auto getPredicateInfo = [this](Function &F) -> std::unique_ptr { return make_unique( F, this->getAnalysis(F).getDomTree(), this->getAnalysis().getAssumptionCache(F)); }; return runIPSCCP(M, DL, TLI, getPredicateInfo); } void getAnalysisUsage(AnalysisUsage &AU) const override { AU.addRequired(); AU.addRequired(); AU.addRequired(); } }; } // end anonymous namespace char IPSCCPLegacyPass::ID = 0; INITIALIZE_PASS_BEGIN(IPSCCPLegacyPass, "ipsccp", "Interprocedural Sparse Conditional Constant Propagation", false, false) 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(); }