Subversion Repositories QNX 8.QNX8 LLVM/Clang compiler suite

Rev

Blame | Last modification | View Log | Download | RSS feed

  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.