Index: lib/Transforms/Scalar/LoopSimplifyCFG.cpp =================================================================== --- lib/Transforms/Scalar/LoopSimplifyCFG.cpp +++ lib/Transforms/Scalar/LoopSimplifyCFG.cpp @@ -24,6 +24,8 @@ #include "llvm/Analysis/GlobalsModRef.h" #include "llvm/Analysis/LoopInfo.h" #include "llvm/Analysis/LoopPass.h" +#include "llvm/Analysis/MemorySSA.h" +#include "llvm/Analysis/MemorySSAUpdater.h" #include "llvm/Analysis/ScalarEvolution.h" #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" #include "llvm/Analysis/TargetTransformInfo.h" @@ -40,7 +42,7 @@ #define DEBUG_TYPE "loop-simplifycfg" static bool simplifyLoopCFG(Loop &L, DominatorTree &DT, LoopInfo &LI, - ScalarEvolution &SE) { + ScalarEvolution &SE, MemorySSAUpdater *MSSAU) { bool Changed = false; DomTreeUpdater DTU(DT, DomTreeUpdater::UpdateStrategy::Eager); // Copy blocks into a temporary array to avoid iterator invalidation issues @@ -59,7 +61,7 @@ continue; // Merge Succ into Pred and delete it. - MergeBlockIntoPredecessor(Succ, &DTU, &LI); + MergeBlockIntoPredecessor(Succ, &DTU, &LI, MSSAU); SE.forgetTopmostLoop(&L); @@ -72,7 +74,11 @@ PreservedAnalyses LoopSimplifyCFGPass::run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &) { - if (!simplifyLoopCFG(L, AR.DT, AR.LI, AR.SE)) + Optional MSSAU; + if (EnableMSSALoopDependency && AR.MSSA) + MSSAU = MemorySSAUpdater(AR.MSSA); + if (!simplifyLoopCFG(L, AR.DT, AR.LI, AR.SE, + MSSAU.hasValue() ? MSSAU.getPointer() : nullptr)) return PreservedAnalyses::all(); return getLoopPassPreservedAnalyses(); @@ -93,10 +99,21 @@ DominatorTree &DT = getAnalysis().getDomTree(); LoopInfo &LI = getAnalysis().getLoopInfo(); ScalarEvolution &SE = getAnalysis().getSE(); - return simplifyLoopCFG(*L, DT, LI, SE); + std::unique_ptr MSSAU; + if (EnableMSSALoopDependency) { + MemorySSA *MSSA = &getAnalysis().getMSSA(); + MSSAU = make_unique(MSSA); + if (VerifyMemorySSA) + MSSA->verifyMemorySSA(); + } + return simplifyLoopCFG(*L, DT, LI, SE, MSSAU.get()); } void getAnalysisUsage(AnalysisUsage &AU) const override { + if (EnableMSSALoopDependency) { + AU.addRequired(); + AU.addPreserved(); + } AU.addPreserved(); getLoopAnalysisUsage(AU); } @@ -107,6 +124,7 @@ INITIALIZE_PASS_BEGIN(LoopSimplifyCFGLegacyPass, "loop-simplifycfg", "Simplify loop CFG", false, false) INITIALIZE_PASS_DEPENDENCY(LoopPass) +INITIALIZE_PASS_DEPENDENCY(MemorySSAWrapperPass) INITIALIZE_PASS_END(LoopSimplifyCFGLegacyPass, "loop-simplifycfg", "Simplify loop CFG", false, false) Index: test/Transforms/LoopSimplifyCFG/merge-header.ll =================================================================== --- test/Transforms/LoopSimplifyCFG/merge-header.ll +++ test/Transforms/LoopSimplifyCFG/merge-header.ll @@ -1,5 +1,6 @@ ; RUN: opt -S -loop-simplifycfg < %s | FileCheck %s ; RUN: opt -S -passes='require,loop(simplify-cfg)' < %s | FileCheck %s +; RUN: opt -S -loop-simplifycfg -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s ; CHECK-LABEL: foo ; CHECK: entry: Index: test/Transforms/LoopSimplifyCFG/scev.ll =================================================================== --- test/Transforms/LoopSimplifyCFG/scev.ll +++ test/Transforms/LoopSimplifyCFG/scev.ll @@ -1,5 +1,6 @@ ; NOTE: Assertions have been autogenerated by utils/update_test_checks.py ; RUN: opt -S -loop-simplifycfg -verify-scev < %s | FileCheck %s +; RUN: opt -S -loop-simplifycfg -verify-scev -enable-mssa-loop-dependency=true -verify-memoryssa < %s | FileCheck %s ; Verify that the scev information is still valid. Verification should not fail