@@ -113,6 +113,8 @@ static cl::opt<bool>
113
113
GVNEnableSplitBackedgeInLoadPRE (" enable-split-backedge-in-load-pre" ,
114
114
cl::init (false ));
115
115
static cl::opt<bool > GVNEnableMemDep (" enable-gvn-memdep" , cl::init(true ));
116
+ static cl::opt<bool > GVNEnableMemorySSA (" enable-gvn-memoryssa" ,
117
+ cl::init (false ));
116
118
117
119
static cl::opt<uint32_t > MaxNumDeps (
118
120
" gvn-max-num-deps" , cl::Hidden, cl::init(100 ),
@@ -820,6 +822,10 @@ bool GVNPass::isMemDepEnabled() const {
820
822
return Options.AllowMemDep .value_or (GVNEnableMemDep);
821
823
}
822
824
825
+ bool GVNPass::isMemorySSAEnabled () const {
826
+ return Options.AllowMemorySSA .value_or (GVNEnableMemorySSA);
827
+ }
828
+
823
829
PreservedAnalyses GVNPass::run (Function &F, FunctionAnalysisManager &AM) {
824
830
// FIXME: The order of evaluation of these 'getResult' calls is very
825
831
// significant! Re-ordering these variables will cause GVN when run alone to
@@ -833,6 +839,11 @@ PreservedAnalyses GVNPass::run(Function &F, FunctionAnalysisManager &AM) {
833
839
isMemDepEnabled () ? &AM.getResult <MemoryDependenceAnalysis>(F) : nullptr ;
834
840
auto &LI = AM.getResult <LoopAnalysis>(F);
835
841
auto *MSSA = AM.getCachedResult <MemorySSAAnalysis>(F);
842
+ if (isMemorySSAEnabled () && !MSSA) {
843
+ assert (!MemDep &&
844
+ " On-demand computation of MemSSA implies that MemDep is disabled!" );
845
+ MSSA = &AM.getResult <MemorySSAAnalysis>(F);
846
+ }
836
847
auto &ORE = AM.getResult <OptimizationRemarkEmitterAnalysis>(F);
837
848
bool Changed = runImpl (F, AC, DT, TLI, AA, MemDep, LI, &ORE,
838
849
MSSA ? &MSSA->getMSSA () : nullptr );
@@ -861,7 +872,9 @@ void GVNPass::printPipeline(
861
872
OS << (*Options.AllowLoadPRESplitBackedge ? " " : " no-" )
862
873
<< " split-backedge-load-pre;" ;
863
874
if (Options.AllowMemDep != std::nullopt)
864
- OS << (*Options.AllowMemDep ? " " : " no-" ) << " memdep" ;
875
+ OS << (*Options.AllowMemDep ? " " : " no-" ) << " memdep;" ;
876
+ if (Options.AllowMemorySSA != std::nullopt)
877
+ OS << (*Options.AllowMemorySSA ? " " : " no-" ) << " memoryssa" ;
865
878
OS << ' >' ;
866
879
}
867
880
@@ -3293,8 +3306,11 @@ class llvm::gvn::GVNLegacyPass : public FunctionPass {
3293
3306
public:
3294
3307
static char ID; // Pass identification, replacement for typeid
3295
3308
3296
- explicit GVNLegacyPass (bool NoMemDepAnalysis = !GVNEnableMemDep)
3297
- : FunctionPass(ID), Impl(GVNOptions().setMemDep(!NoMemDepAnalysis)) {
3309
+ explicit GVNLegacyPass (bool MemDepAnalysis = GVNEnableMemDep,
3310
+ bool MemSSAAnalysis = GVNEnableMemorySSA)
3311
+ : FunctionPass(ID), Impl(GVNOptions()
3312
+ .setMemDep(MemDepAnalysis)
3313
+ .setMemorySSA(MemSSAAnalysis)) {
3298
3314
initializeGVNLegacyPassPass (*PassRegistry::getPassRegistry ());
3299
3315
}
3300
3316
@@ -3303,6 +3319,9 @@ class llvm::gvn::GVNLegacyPass : public FunctionPass {
3303
3319
return false ;
3304
3320
3305
3321
auto *MSSAWP = getAnalysisIfAvailable<MemorySSAWrapperPass>();
3322
+ if (Impl.isMemorySSAEnabled () && !MSSAWP)
3323
+ MSSAWP = &getAnalysis<MemorySSAWrapperPass>();
3324
+
3306
3325
return Impl.runImpl (
3307
3326
F, getAnalysis<AssumptionCacheTracker>().getAssumptionCache (F),
3308
3327
getAnalysis<DominatorTreeWrapperPass>().getDomTree (),
@@ -3330,6 +3349,8 @@ class llvm::gvn::GVNLegacyPass : public FunctionPass {
3330
3349
AU.addPreserved <LoopInfoWrapperPass>();
3331
3350
AU.addRequired <OptimizationRemarkEmitterWrapperPass>();
3332
3351
AU.addPreserved <MemorySSAWrapperPass>();
3352
+ if (Impl.isMemorySSAEnabled ())
3353
+ AU.addRequired <MemorySSAWrapperPass>();
3333
3354
}
3334
3355
3335
3356
private:
@@ -3341,6 +3362,7 @@ char GVNLegacyPass::ID = 0;
3341
3362
INITIALIZE_PASS_BEGIN (GVNLegacyPass, " gvn" , " Global Value Numbering" , false , false )
3342
3363
INITIALIZE_PASS_DEPENDENCY(AssumptionCacheTracker)
3343
3364
INITIALIZE_PASS_DEPENDENCY(MemoryDependenceWrapperPass)
3365
+ INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass)
3344
3366
INITIALIZE_PASS_DEPENDENCY(DominatorTreeWrapperPass)
3345
3367
INITIALIZE_PASS_DEPENDENCY(TargetLibraryInfoWrapperPass)
3346
3368
INITIALIZE_PASS_DEPENDENCY(AAResultsWrapperPass)
@@ -3349,6 +3371,4 @@ INITIALIZE_PASS_DEPENDENCY(OptimizationRemarkEmitterWrapperPass)
3349
3371
INITIALIZE_PASS_END(GVNLegacyPass, " gvn" , " Global Value Numbering" , false , false )
3350
3372
3351
3373
// The public interface to this file...
3352
- FunctionPass *llvm::createGVNPass(bool NoMemDepAnalysis) {
3353
- return new GVNLegacyPass (NoMemDepAnalysis);
3354
- }
3374
+ FunctionPass *llvm::createGVNPass() { return new GVNLegacyPass (); }
0 commit comments