1 //===- LoopSimplify.h - Loop Canonicalization Pass --------------*- 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 // 9 // This pass performs several transformations to transform natural loops into a 10 // simpler form, which makes subsequent analyses and transformations simpler and 11 // more effective. 12 // 13 // Loop pre-header insertion guarantees that there is a single, non-critical 14 // entry edge from outside of the loop to the loop header. This simplifies a 15 // number of analyses and transformations, such as LICM. 16 // 17 // Loop exit-block insertion guarantees that all exit blocks from the loop 18 // (blocks which are outside of the loop that have predecessors inside of the 19 // loop) only have predecessors from inside of the loop (and are thus dominated 20 // by the loop header). This simplifies transformations such as store-sinking 21 // that are built into LICM. 22 // 23 // This pass also guarantees that loops will have exactly one backedge. 24 // 25 // Indirectbr instructions introduce several complications. If the loop 26 // contains or is entered by an indirectbr instruction, it may not be possible 27 // to transform the loop and make these guarantees. Client code should check 28 // that these conditions are true before relying on them. 29 // 30 // Note that the simplifycfg pass will clean up blocks which are split out but 31 // end up being unnecessary, so usage of this pass should not pessimize 32 // generated code. 33 // 34 // This pass obviously modifies the CFG, but updates loop information and 35 // dominator information. 36 // 37 //===----------------------------------------------------------------------===// 38 #ifndef LLVM_TRANSFORMS_UTILS_LOOPSIMPLIFY_H 39 #define LLVM_TRANSFORMS_UTILS_LOOPSIMPLIFY_H 40 41 #include "llvm/IR/PassManager.h" 42 43 namespace llvm { 44 45 class AssumptionCache; 46 class DominatorTree; 47 class Loop; 48 class LoopInfo; 49 class MemorySSAUpdater; 50 class ScalarEvolution; 51 52 /// This pass is responsible for loop canonicalization. 53 class LoopSimplifyPass : public PassInfoMixin<LoopSimplifyPass> { 54 public: 55 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 56 }; 57 58 /// Simplify each loop in a loop nest recursively. 59 /// 60 /// This takes a potentially un-simplified loop L (and its children) and turns 61 /// it into a simplified loop nest with preheaders and single backedges. It will 62 /// update \c DominatorTree, \c LoopInfo, \c ScalarEvolution and \c MemorySSA 63 /// analyses if they're non-null, and LCSSA if \c PreserveLCSSA is true. 64 bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE, 65 AssumptionCache *AC, MemorySSAUpdater *MSSAU, 66 bool PreserveLCSSA); 67 68 } // end namespace llvm 69 70 #endif // LLVM_TRANSFORMS_UTILS_LOOPSIMPLIFY_H 71