1 //===- LoopPassManager.h - Loop pass management -----------------*- C++ -*-===// 2 // 3 // Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4 // See https://llvm.org/LICENSE.txt for license information. 5 // SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6 // 7 //===----------------------------------------------------------------------===// 8 /// \file 9 /// 10 /// This header provides classes for managing a pipeline of passes over loops 11 /// in LLVM IR. 12 /// 13 /// The primary loop pass pipeline is managed in a very particular way to 14 /// provide a set of core guarantees: 15 /// 1) Loops are, where possible, in simplified form. 16 /// 2) Loops are *always* in LCSSA form. 17 /// 3) A collection of Loop-specific analysis results are available: 18 /// - LoopInfo 19 /// - DominatorTree 20 /// - ScalarEvolution 21 /// - AAManager 22 /// 4) All loop passes preserve #1 (where possible), #2, and #3. 23 /// 5) Loop passes run over each loop in the loop nest from the innermost to 24 /// the outermost. Specifically, all inner loops are processed before 25 /// passes run over outer loops. When running the pipeline across an inner 26 /// loop creates new inner loops, those are added and processed in this 27 /// order as well. 28 /// 29 /// This process is designed to facilitate transformations which simplify, 30 /// reduce, and remove loops. For passes which are more oriented towards 31 /// optimizing loops, especially optimizing loop *nests* instead of single 32 /// loops in isolation, this framework is less interesting. 33 /// 34 //===----------------------------------------------------------------------===// 35 36 #ifndef LLVM_TRANSFORMS_SCALAR_LOOPPASSMANAGER_H 37 #define LLVM_TRANSFORMS_SCALAR_LOOPPASSMANAGER_H 38 39 #include "llvm/ADT/PostOrderIterator.h" 40 #include "llvm/ADT/PriorityWorklist.h" 41 #include "llvm/ADT/STLExtras.h" 42 #include "llvm/Analysis/AliasAnalysis.h" 43 #include "llvm/Analysis/BasicAliasAnalysis.h" 44 #include "llvm/Analysis/GlobalsModRef.h" 45 #include "llvm/Analysis/LoopAnalysisManager.h" 46 #include "llvm/Analysis/LoopInfo.h" 47 #include "llvm/Analysis/ScalarEvolution.h" 48 #include "llvm/Analysis/ScalarEvolutionAliasAnalysis.h" 49 #include "llvm/Analysis/TargetLibraryInfo.h" 50 #include "llvm/Analysis/TargetTransformInfo.h" 51 #include "llvm/IR/Dominators.h" 52 #include "llvm/IR/PassManager.h" 53 #include "llvm/Transforms/Utils/LCSSA.h" 54 #include "llvm/Transforms/Utils/LoopSimplify.h" 55 56 namespace llvm { 57 58 // Forward declarations of an update tracking API used in the pass manager. 59 class LPMUpdater; 60 61 // Explicit specialization and instantiation declarations for the pass manager. 62 // See the comments on the definition of the specialization for details on how 63 // it differs from the primary template. 64 template <> 65 PreservedAnalyses 66 PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, 67 LPMUpdater &>::run(Loop &InitialL, LoopAnalysisManager &AM, 68 LoopStandardAnalysisResults &AnalysisResults, 69 LPMUpdater &U); 70 extern template class PassManager<Loop, LoopAnalysisManager, 71 LoopStandardAnalysisResults &, LPMUpdater &>; 72 73 /// The Loop pass manager. 74 /// 75 /// See the documentation for the PassManager template for details. It runs 76 /// a sequence of Loop passes over each Loop that the manager is run over. This 77 /// typedef serves as a convenient way to refer to this construct. 78 typedef PassManager<Loop, LoopAnalysisManager, LoopStandardAnalysisResults &, 79 LPMUpdater &> 80 LoopPassManager; 81 82 /// A partial specialization of the require analysis template pass to forward 83 /// the extra parameters from a transformation's run method to the 84 /// AnalysisManager's getResult. 85 template <typename AnalysisT> 86 struct RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager, 87 LoopStandardAnalysisResults &, LPMUpdater &> 88 : PassInfoMixin< 89 RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager, 90 LoopStandardAnalysisResults &, LPMUpdater &>> { 91 PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, 92 LoopStandardAnalysisResults &AR, LPMUpdater &) { 93 (void)AM.template getResult<AnalysisT>(L, AR); 94 return PreservedAnalyses::all(); 95 } 96 }; 97 98 /// An alias template to easily name a require analysis loop pass. 99 template <typename AnalysisT> 100 using RequireAnalysisLoopPass = 101 RequireAnalysisPass<AnalysisT, Loop, LoopAnalysisManager, 102 LoopStandardAnalysisResults &, LPMUpdater &>; 103 104 namespace internal { 105 /// Helper to implement appending of loops onto a worklist. 106 /// 107 /// We want to process loops in postorder, but the worklist is a LIFO data 108 /// structure, so we append to it in *reverse* postorder. 109 /// 110 /// For trees, a preorder traversal is a viable reverse postorder, so we 111 /// actually append using a preorder walk algorithm. 112 template <typename RangeT> 113 inline void appendLoopsToWorklist(RangeT &&Loops, 114 SmallPriorityWorklist<Loop *, 4> &Worklist) { 115 // We use an internal worklist to build up the preorder traversal without 116 // recursion. 117 SmallVector<Loop *, 4> PreOrderLoops, PreOrderWorklist; 118 119 // We walk the initial sequence of loops in reverse because we generally want 120 // to visit defs before uses and the worklist is LIFO. 121 for (Loop *RootL : reverse(Loops)) { 122 assert(PreOrderLoops.empty() && "Must start with an empty preorder walk."); 123 assert(PreOrderWorklist.empty() && 124 "Must start with an empty preorder walk worklist."); 125 PreOrderWorklist.push_back(RootL); 126 do { 127 Loop *L = PreOrderWorklist.pop_back_val(); 128 PreOrderWorklist.append(L->begin(), L->end()); 129 PreOrderLoops.push_back(L); 130 } while (!PreOrderWorklist.empty()); 131 132 Worklist.insert(std::move(PreOrderLoops)); 133 PreOrderLoops.clear(); 134 } 135 } 136 } 137 138 template <typename LoopPassT> class FunctionToLoopPassAdaptor; 139 140 /// This class provides an interface for updating the loop pass manager based 141 /// on mutations to the loop nest. 142 /// 143 /// A reference to an instance of this class is passed as an argument to each 144 /// Loop pass, and Loop passes should use it to update LPM infrastructure if 145 /// they modify the loop nest structure. 146 class LPMUpdater { 147 public: 148 /// This can be queried by loop passes which run other loop passes (like pass 149 /// managers) to know whether the loop needs to be skipped due to updates to 150 /// the loop nest. 151 /// 152 /// If this returns true, the loop object may have been deleted, so passes 153 /// should take care not to touch the object. 154 bool skipCurrentLoop() const { return SkipCurrentLoop; } 155 156 /// Loop passes should use this method to indicate they have deleted a loop 157 /// from the nest. 158 /// 159 /// Note that this loop must either be the current loop or a subloop of the 160 /// current loop. This routine must be called prior to removing the loop from 161 /// the loop nest. 162 /// 163 /// If this is called for the current loop, in addition to clearing any 164 /// state, this routine will mark that the current loop should be skipped by 165 /// the rest of the pass management infrastructure. 166 void markLoopAsDeleted(Loop &L, llvm::StringRef Name) { 167 LAM.clear(L, Name); 168 assert((&L == CurrentL || CurrentL->contains(&L)) && 169 "Cannot delete a loop outside of the " 170 "subloop tree currently being processed."); 171 if (&L == CurrentL) 172 SkipCurrentLoop = true; 173 } 174 175 /// Loop passes should use this method to indicate they have added new child 176 /// loops of the current loop. 177 /// 178 /// \p NewChildLoops must contain only the immediate children. Any nested 179 /// loops within them will be visited in postorder as usual for the loop pass 180 /// manager. 181 void addChildLoops(ArrayRef<Loop *> NewChildLoops) { 182 // Insert ourselves back into the worklist first, as this loop should be 183 // revisited after all the children have been processed. 184 Worklist.insert(CurrentL); 185 186 #ifndef NDEBUG 187 for (Loop *NewL : NewChildLoops) 188 assert(NewL->getParentLoop() == CurrentL && "All of the new loops must " 189 "be immediate children of " 190 "the current loop!"); 191 #endif 192 193 internal::appendLoopsToWorklist(NewChildLoops, Worklist); 194 195 // Also skip further processing of the current loop--it will be revisited 196 // after all of its newly added children are accounted for. 197 SkipCurrentLoop = true; 198 } 199 200 /// Loop passes should use this method to indicate they have added new 201 /// sibling loops to the current loop. 202 /// 203 /// \p NewSibLoops must only contain the immediate sibling loops. Any nested 204 /// loops within them will be visited in postorder as usual for the loop pass 205 /// manager. 206 void addSiblingLoops(ArrayRef<Loop *> NewSibLoops) { 207 #ifndef NDEBUG 208 for (Loop *NewL : NewSibLoops) 209 assert(NewL->getParentLoop() == ParentL && 210 "All of the new loops must be siblings of the current loop!"); 211 #endif 212 213 internal::appendLoopsToWorklist(NewSibLoops, Worklist); 214 215 // No need to skip the current loop or revisit it, as sibling loops 216 // shouldn't impact anything. 217 } 218 219 /// Restart the current loop. 220 /// 221 /// Loop passes should call this method to indicate the current loop has been 222 /// sufficiently changed that it should be re-visited from the begining of 223 /// the loop pass pipeline rather than continuing. 224 void revisitCurrentLoop() { 225 // Tell the currently in-flight pipeline to stop running. 226 SkipCurrentLoop = true; 227 228 // And insert ourselves back into the worklist. 229 Worklist.insert(CurrentL); 230 } 231 232 private: 233 template <typename LoopPassT> friend class llvm::FunctionToLoopPassAdaptor; 234 235 /// The \c FunctionToLoopPassAdaptor's worklist of loops to process. 236 SmallPriorityWorklist<Loop *, 4> &Worklist; 237 238 /// The analysis manager for use in the current loop nest. 239 LoopAnalysisManager &LAM; 240 241 Loop *CurrentL; 242 bool SkipCurrentLoop; 243 244 #ifndef NDEBUG 245 // In debug builds we also track the parent loop to implement asserts even in 246 // the face of loop deletion. 247 Loop *ParentL; 248 #endif 249 250 LPMUpdater(SmallPriorityWorklist<Loop *, 4> &Worklist, 251 LoopAnalysisManager &LAM) 252 : Worklist(Worklist), LAM(LAM) {} 253 }; 254 255 /// Adaptor that maps from a function to its loops. 256 /// 257 /// Designed to allow composition of a LoopPass(Manager) and a 258 /// FunctionPassManager. Note that if this pass is constructed with a \c 259 /// FunctionAnalysisManager it will run the \c LoopAnalysisManagerFunctionProxy 260 /// analysis prior to running the loop passes over the function to enable a \c 261 /// LoopAnalysisManager to be used within this run safely. 262 template <typename LoopPassT> 263 class FunctionToLoopPassAdaptor 264 : public PassInfoMixin<FunctionToLoopPassAdaptor<LoopPassT>> { 265 public: 266 explicit FunctionToLoopPassAdaptor(LoopPassT Pass, bool UseMemorySSA = false, 267 bool DebugLogging = false) 268 : Pass(std::move(Pass)), LoopCanonicalizationFPM(DebugLogging), 269 UseMemorySSA(UseMemorySSA) { 270 LoopCanonicalizationFPM.addPass(LoopSimplifyPass()); 271 LoopCanonicalizationFPM.addPass(LCSSAPass()); 272 } 273 274 /// Runs the loop passes across every loop in the function. 275 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM) { 276 // Before we even compute any loop analyses, first run a miniature function 277 // pass pipeline to put loops into their canonical form. Note that we can 278 // directly build up function analyses after this as the function pass 279 // manager handles all the invalidation at that layer. 280 PassInstrumentation PI = AM.getResult<PassInstrumentationAnalysis>(F); 281 282 PreservedAnalyses PA = PreservedAnalyses::all(); 283 // Check the PassInstrumentation's BeforePass callbacks before running the 284 // canonicalization pipeline. 285 if (PI.runBeforePass<Function>(LoopCanonicalizationFPM, F)) { 286 PA = LoopCanonicalizationFPM.run(F, AM); 287 PI.runAfterPass<Function>(LoopCanonicalizationFPM, F); 288 } 289 290 // Get the loop structure for this function 291 LoopInfo &LI = AM.getResult<LoopAnalysis>(F); 292 293 // If there are no loops, there is nothing to do here. 294 if (LI.empty()) 295 return PA; 296 297 // Get the analysis results needed by loop passes. 298 MemorySSA *MSSA = UseMemorySSA 299 ? (&AM.getResult<MemorySSAAnalysis>(F).getMSSA()) 300 : nullptr; 301 LoopStandardAnalysisResults LAR = {AM.getResult<AAManager>(F), 302 AM.getResult<AssumptionAnalysis>(F), 303 AM.getResult<DominatorTreeAnalysis>(F), 304 AM.getResult<LoopAnalysis>(F), 305 AM.getResult<ScalarEvolutionAnalysis>(F), 306 AM.getResult<TargetLibraryAnalysis>(F), 307 AM.getResult<TargetIRAnalysis>(F), 308 MSSA}; 309 310 // Setup the loop analysis manager from its proxy. It is important that 311 // this is only done when there are loops to process and we have built the 312 // LoopStandardAnalysisResults object. The loop analyses cached in this 313 // manager have access to those analysis results and so it must invalidate 314 // itself when they go away. 315 auto &LAMFP = AM.getResult<LoopAnalysisManagerFunctionProxy>(F); 316 if (UseMemorySSA) 317 LAMFP.markMSSAUsed(); 318 LoopAnalysisManager &LAM = LAMFP.getManager(); 319 320 // A postorder worklist of loops to process. 321 SmallPriorityWorklist<Loop *, 4> Worklist; 322 323 // Register the worklist and loop analysis manager so that loop passes can 324 // update them when they mutate the loop nest structure. 325 LPMUpdater Updater(Worklist, LAM); 326 327 // Add the loop nests in the reverse order of LoopInfo. For some reason, 328 // they are stored in RPO w.r.t. the control flow graph in LoopInfo. For 329 // the purpose of unrolling, loop deletion, and LICM, we largely want to 330 // work forward across the CFG so that we visit defs before uses and can 331 // propagate simplifications from one loop nest into the next. 332 // FIXME: Consider changing the order in LoopInfo. 333 internal::appendLoopsToWorklist(reverse(LI), Worklist); 334 335 do { 336 Loop *L = Worklist.pop_back_val(); 337 338 // Reset the update structure for this loop. 339 Updater.CurrentL = L; 340 Updater.SkipCurrentLoop = false; 341 342 #ifndef NDEBUG 343 // Save a parent loop pointer for asserts. 344 Updater.ParentL = L->getParentLoop(); 345 346 // Verify the loop structure and LCSSA form before visiting the loop. 347 L->verifyLoop(); 348 assert(L->isRecursivelyLCSSAForm(LAR.DT, LI) && 349 "Loops must remain in LCSSA form!"); 350 #endif 351 // Check the PassInstrumentation's BeforePass callbacks before running the 352 // pass, skip its execution completely if asked to (callback returns 353 // false). 354 if (!PI.runBeforePass<Loop>(Pass, *L)) 355 continue; 356 PreservedAnalyses PassPA = Pass.run(*L, LAM, LAR, Updater); 357 358 // Do not pass deleted Loop into the instrumentation. 359 if (Updater.skipCurrentLoop()) 360 PI.runAfterPassInvalidated<Loop>(Pass); 361 else 362 PI.runAfterPass<Loop>(Pass, *L); 363 364 // FIXME: We should verify the set of analyses relevant to Loop passes 365 // are preserved. 366 367 // If the loop hasn't been deleted, we need to handle invalidation here. 368 if (!Updater.skipCurrentLoop()) 369 // We know that the loop pass couldn't have invalidated any other 370 // loop's analyses (that's the contract of a loop pass), so directly 371 // handle the loop analysis manager's invalidation here. 372 LAM.invalidate(*L, PassPA); 373 374 // Then intersect the preserved set so that invalidation of module 375 // analyses will eventually occur when the module pass completes. 376 PA.intersect(std::move(PassPA)); 377 } while (!Worklist.empty()); 378 379 // By definition we preserve the proxy. We also preserve all analyses on 380 // Loops. This precludes *any* invalidation of loop analyses by the proxy, 381 // but that's OK because we've taken care to invalidate analyses in the 382 // loop analysis manager incrementally above. 383 PA.preserveSet<AllAnalysesOn<Loop>>(); 384 PA.preserve<LoopAnalysisManagerFunctionProxy>(); 385 // We also preserve the set of standard analyses. 386 PA.preserve<DominatorTreeAnalysis>(); 387 PA.preserve<LoopAnalysis>(); 388 PA.preserve<ScalarEvolutionAnalysis>(); 389 if (UseMemorySSA) 390 PA.preserve<MemorySSAAnalysis>(); 391 // FIXME: What we really want to do here is preserve an AA category, but 392 // that concept doesn't exist yet. 393 PA.preserve<AAManager>(); 394 PA.preserve<BasicAA>(); 395 PA.preserve<GlobalsAA>(); 396 PA.preserve<SCEVAA>(); 397 return PA; 398 } 399 400 private: 401 LoopPassT Pass; 402 403 FunctionPassManager LoopCanonicalizationFPM; 404 405 bool UseMemorySSA = false; 406 }; 407 408 /// A function to deduce a loop pass type and wrap it in the templated 409 /// adaptor. 410 template <typename LoopPassT> 411 FunctionToLoopPassAdaptor<LoopPassT> 412 createFunctionToLoopPassAdaptor(LoopPassT Pass, bool UseMemorySSA = false, 413 bool DebugLogging = false) { 414 return FunctionToLoopPassAdaptor<LoopPassT>(std::move(Pass), UseMemorySSA, 415 DebugLogging); 416 } 417 418 /// Pass for printing a loop's contents as textual IR. 419 class PrintLoopPass : public PassInfoMixin<PrintLoopPass> { 420 raw_ostream &OS; 421 std::string Banner; 422 423 public: 424 PrintLoopPass(); 425 PrintLoopPass(raw_ostream &OS, const std::string &Banner = ""); 426 427 PreservedAnalyses run(Loop &L, LoopAnalysisManager &, 428 LoopStandardAnalysisResults &, LPMUpdater &); 429 }; 430 } 431 432 #endif // LLVM_TRANSFORMS_SCALAR_LOOPPASSMANAGER_H 433