@@ -113,6 +113,8 @@ static cl::opt<bool>
113113GVNEnableSplitBackedgeInLoadPRE (" enable-split-backedge-in-load-pre" ,
114114 cl::init (false ));
115115static cl::opt<bool > GVNEnableMemDep (" enable-gvn-memdep" , cl::init(true ));
116+ static cl::opt<bool > GVNEnableMemorySSA (" enable-gvn-memoryssa" ,
117+ cl::init (false ));
116118
117119static cl::opt<uint32_t > MaxNumDeps (
118120 " gvn-max-num-deps" , cl::Hidden, cl::init(100 ),
@@ -820,6 +822,10 @@ bool GVNPass::isMemDepEnabled() const {
820822 return Options.AllowMemDep .value_or (GVNEnableMemDep);
821823}
822824
825+ bool GVNPass::isMemorySSAEnabled () const {
826+ return Options.AllowMemorySSA .value_or (GVNEnableMemorySSA);
827+ }
828+
823829PreservedAnalyses GVNPass::run (Function &F, FunctionAnalysisManager &AM) {
824830 // FIXME: The order of evaluation of these 'getResult' calls is very
825831 // significant! Re-ordering these variables will cause GVN when run alone to
@@ -832,7 +838,10 @@ PreservedAnalyses GVNPass::run(Function &F, FunctionAnalysisManager &AM) {
832838 auto *MemDep =
833839 isMemDepEnabled () ? &AM.getResult <MemoryDependenceAnalysis>(F) : nullptr ;
834840 auto &LI = AM.getResult <LoopAnalysis>(F);
835- auto *MSSA = AM.getCachedResult <MemorySSAAnalysis>(F);
841+ auto *MSSA =
842+ isMemorySSAEnabled () ? &AM.getResult <MemorySSAAnalysis>(F) : nullptr ;
843+ assert (!(MemDep && MSSA) &&
844+ " Should not use both MemDep and MemorySSA simultaneously!" );
836845 auto &ORE = AM.getResult <OptimizationRemarkEmitterAnalysis>(F);
837846 bool Changed = runImpl (F, AC, DT, TLI, AA, MemDep, LI, &ORE,
838847 MSSA ? &MSSA->getMSSA () : nullptr );
@@ -861,7 +870,9 @@ void GVNPass::printPipeline(
861870 OS << (*Options.AllowLoadPRESplitBackedge ? " " : " no-" )
862871 << " split-backedge-load-pre;" ;
863872 if (Options.AllowMemDep != std::nullopt )
864- OS << (*Options.AllowMemDep ? " " : " no-" ) << " memdep" ;
873+ OS << (*Options.AllowMemDep ? " " : " no-" ) << " memdep;" ;
874+ if (Options.AllowMemorySSA != std::nullopt )
875+ OS << (*Options.AllowMemorySSA ? " " : " no-" ) << " memoryssa" ;
865876 OS << ' >' ;
866877}
867878
@@ -3293,16 +3304,18 @@ class llvm::gvn::GVNLegacyPass : public FunctionPass {
32933304public:
32943305 static char ID; // Pass identification, replacement for typeid
32953306
3296- explicit GVNLegacyPass (bool NoMemDepAnalysis = !GVNEnableMemDep)
3297- : FunctionPass(ID), Impl(GVNOptions().setMemDep(!NoMemDepAnalysis)) {
3307+ explicit GVNLegacyPass (bool MemDepAnalysis = GVNEnableMemDep,
3308+ bool MemSSAAnalysis = GVNEnableMemorySSA)
3309+ : FunctionPass(ID), Impl(GVNOptions()
3310+ .setMemDep(MemDepAnalysis)
3311+ .setMemorySSA(MemSSAAnalysis)) {
32983312 initializeGVNLegacyPassPass (*PassRegistry::getPassRegistry ());
32993313 }
33003314
33013315 bool runOnFunction (Function &F) override {
33023316 if (skipFunction (F))
33033317 return false ;
33043318
3305- auto *MSSAWP = getAnalysisIfAvailable<MemorySSAWrapperPass>();
33063319 return Impl.runImpl (
33073320 F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache (F),
33083321 getAnalysis<DominatorTreeWrapperPass>().getDomTree (),
@@ -3313,7 +3326,9 @@ class llvm::gvn::GVNLegacyPass : public FunctionPass {
33133326 : nullptr ,
33143327 getAnalysis<LoopInfoWrapperPass>().getLoopInfo (),
33153328 &getAnalysis<OptimizationRemarkEmitterWrapperPass>().getORE (),
3316- MSSAWP ? &MSSAWP->getMSSA () : nullptr );
3329+ Impl.isMemorySSAEnabled ()
3330+ ? &getAnalysis<MemorySSAWrapperPass>().getMSSA ()
3331+ : nullptr );
33173332 }
33183333
33193334 void getAnalysisUsage (AnalysisUsage &AU) const override {
@@ -3329,7 +3344,8 @@ class llvm::gvn::GVNLegacyPass : public FunctionPass {
33293344 AU.addPreserved <TargetLibraryInfoWrapperPass>();
33303345 AU.addPreserved <LoopInfoWrapperPass>();
33313346 AU.addRequired <OptimizationRemarkEmitterWrapperPass>();
3332- AU.addPreserved <MemorySSAWrapperPass>();
3347+ if (Impl.isMemorySSAEnabled ())
3348+ AU.addRequired <MemorySSAWrapperPass>();
33333349 }
33343350
33353351private:
@@ -3341,6 +3357,7 @@ char GVNLegacyPass::ID = 0;
33413357INITIALIZE_PASS_BEGIN (GVNLegacyPass, " gvn" , " Global Value Numbering" , false , false )
33423358INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
33433359INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass)
3360+ INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass)
33443361INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
33453362INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
33463363INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
@@ -3349,6 +3366,4 @@ INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
33493366INITIALIZE_PASS_END(GVNLegacyPass, " gvn" , " Global Value Numbering" , false , false )
33503367
33513368// The public interface to this file...
3352- FunctionPass *llvm::createGVNPass(bool NoMemDepAnalysis) {
3353- return new GVNLegacyPass (NoMemDepAnalysis);
3354- }
3369+ FunctionPass *llvm::createGVNPass() { return new GVNLegacyPass (); }
0 commit comments