| //===- 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 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); |
| |
| /// \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, 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, |
| ScalarEvolution *SE = nullptr); |
| } |
| |
| #endif |