[LoopPassManager] Implement and use LoopNestAnalysis::run() instead of manually creat...
authorArthur Eubanks <aeubanks@google.com>
Wed, 24 Aug 2022 18:18:52 +0000 (11:18 -0700)
committerArthur Eubanks <aeubanks@google.com>
Fri, 2 Sep 2022 17:55:53 +0000 (10:55 -0700)
The current code is basically just emulating what the analysis manager does.

Reviewed By: asbirlea

Differential Revision: https://reviews.llvm.org/D132581

llvm/lib/Analysis/LoopNestAnalysis.cpp
llvm/lib/Passes/PassRegistry.def
llvm/lib/Transforms/Scalar/LoopPassManager.cpp
llvm/unittests/Transforms/Scalar/LoopPassManagerTest.cpp

index bff796f..17c3bc7 100644 (file)
@@ -450,6 +450,12 @@ raw_ostream &llvm::operator<<(raw_ostream &OS, const LoopNest &LN) {
   return OS;
 }
 
+LoopNestAnalysis::Result
+LoopNestAnalysis::run(Loop &L, LoopAnalysisManager &AM,
+                      LoopStandardAnalysisResults &AR) {
+  return LoopNest(L, AR.SE);
+}
+
 //===----------------------------------------------------------------------===//
 // LoopNestPrinterPass implementation
 //
index a6aa06c..a4bbe9d 100644 (file)
@@ -499,6 +499,7 @@ LOOP_ANALYSIS("access-info", LoopAccessAnalysis())
 LOOP_ANALYSIS("ddg", DDGAnalysis())
 LOOP_ANALYSIS("iv-users", IVUsersAnalysis())
 LOOP_ANALYSIS("pass-instrumentation", PassInstrumentationAnalysis(PIC))
+LOOP_ANALYSIS("loop-nest", LoopNestAnalysis())
 #undef LOOP_ANALYSIS
 
 #ifndef LOOP_PASS
index d20d275..82a44d5 100644 (file)
@@ -78,13 +78,6 @@ LoopPassManager::runWithLoopNestPasses(Loop &L, LoopAnalysisManager &AM,
 
   unsigned LoopPassIndex = 0, LoopNestPassIndex = 0;
 
-  // `LoopNestPtr` points to the `LoopNest` object for the current top-level
-  // loop and `IsLoopNestPtrValid` indicates whether the pointer is still valid.
-  // The `LoopNest` object will have to be re-constructed if the pointer is
-  // invalid when encountering a loop-nest pass.
-  std::unique_ptr<LoopNest> LoopNestPtr;
-  bool IsLoopNestPtrValid = false;
-
   for (size_t I = 0, E = IsLoopNestPass.size(); I != E; ++I) {
     Optional<PreservedAnalyses> PassPA;
     if (!IsLoopNestPass[I]) {
@@ -95,13 +88,8 @@ LoopPassManager::runWithLoopNestPasses(Loop &L, LoopAnalysisManager &AM,
       // The `I`-th pass is a loop-nest pass.
       auto &Pass = LoopNestPasses[LoopNestPassIndex++];
 
-      // If the loop-nest object calculated before is no longer valid,
-      // re-calculate it here before running the loop-nest pass.
-      if (!IsLoopNestPtrValid) {
-        LoopNestPtr = LoopNest::getLoopNest(L, AR.SE);
-        IsLoopNestPtrValid = true;
-      }
-      PassPA = runSinglePass(*LoopNestPtr, Pass, AM, AR, U, PI);
+      LoopNest &LN = AM.getResult<LoopNestAnalysis>(L, AR);
+      PassPA = runSinglePass(LN, Pass, AM, AR, U, PI);
     }
 
     // `PassPA` is `None` means that the before-pass callbacks in
@@ -124,9 +112,6 @@ LoopPassManager::runWithLoopNestPasses(Loop &L, LoopAnalysisManager &AM,
     // aggregate preserved set for this pass manager.
     PA.intersect(std::move(*PassPA));
 
-    // Check if the current pass preserved the loop-nest object or not.
-    IsLoopNestPtrValid &= PassPA->getChecker<LoopNestAnalysis>().preserved();
-
     // After running the loop pass, the parent loop might change and we need to
     // notify the updater, otherwise U.ParentL might gets outdated and triggers
     // assertion failures in addSiblingLoops and addChildLoops.
index bdabc34..16bb10f 100644 (file)
@@ -301,6 +301,8 @@ public:
     // Register our mock analysis.
     LAM.registerPass([&] { return MLAHandle.getAnalysis(); });
 
+    LAM.registerPass([&] { return LoopNestAnalysis(); });
+
     // We need DominatorTreeAnalysis for LoopAnalysis.
     FAM.registerPass([&] { return DominatorTreeAnalysis(); });
     FAM.registerPass([&] { return LoopAnalysis(); });