text: //===- llvm/Transforms/Utils/LoopUtils.h - Loop utilities -*- C++ -*-=========//
  //
  //                     The LLVM Compiler Infrastructure
  //
  // This file is distributed under the University of Illinois Open Source
  // License. See LICENSE.TXT for details.
  //
  //===----------------------------------------------------------------------===//
  //
  // This file defines some loop transformation utilities.
  //
  //===----------------------------------------------------------------------===//
  
  #ifndef LLVM_TRANSFORMS_UTILS_LOOPUTILS_H
  #define LLVM_TRANSFORMS_UTILS_LOOPUTILS_H
  
  namespace llvm {
  class AliasAnalysis;
  class AssumptionTracker;
  class BasicBlock;
  class DataLayout;
  class DominatorTree;
  class Loop;
  class LoopInfo;
  class Pass;
  class ScalarEvolution;
  
  BasicBlock *InsertPreheaderForLoop(Loop *L, Pass *P);
  
  /// \brief Simplify each loop in a loop nest recursively.
  ///
  /// This takes a potentially un-simplified loop L (and its children) and turns
  /// it into a simplified loop nest with preheaders and single backedges. It
  /// will optionally update \c AliasAnalysis and \c ScalarEvolution analyses if
  /// passed into it.
  bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, Pass *PP,
                    AliasAnalysis *AA = nullptr, ScalarEvolution *SE = nullptr,
                    const DataLayout *DL = nullptr,
                    AssumptionTracker *AT = nullptr);
  
  /// \brief Put loop into LCSSA form.
  ///
  /// Looks at all instructions in the loop which have uses outside of the
  /// current loop. For each, an LCSSA PHI node is inserted and the uses outside
  /// the loop are rewritten to use this node.
  ///
  /// LoopInfo and DominatorTree are required and preserved.
  ///
  /// If ScalarEvolution is passed in, it will be preserved.
  ///
  /// Returns true if any modifications are made to the loop.
  bool formLCSSA(Loop &L, DominatorTree &DT, LoopInfo *LI,
                 ScalarEvolution *SE = nullptr);
  
  /// \brief Put a loop nest into LCSSA form.
  ///
  /// This recursively forms LCSSA for a loop nest.
  ///
  /// LoopInfo and DominatorTree are required and preserved.
  ///
  /// If ScalarEvolution is passed in, it will be preserved.
  ///
  /// Returns true if any modifications are made to the loop.
  bool formLCSSARecursively(Loop &L, DominatorTree &DT, LoopInfo *LI,
                            ScalarEvolution *SE = nullptr);
  }
  
  #endif
  