Details | Last modification | View Log | RSS feed
Rev | Author | Line No. | Line |
---|---|---|---|
14 | pmbaty | 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 |