| //===- LICM.h - Loop Invariant Code Motion Pass -------*- C++ -*-===// |
| // |
| // The LLVM Compiler Infrastructure |
| // |
| // This file is distributed under the University of Illinois Open Source |
| // License. See LICENSE.TXT for details. |
| // |
| //===----------------------------------------------------------------------===// |
| // |
| // This pass performs loop invariant code motion, attempting to remove as much |
| // code from the body of a loop as possible. It does this by either hoisting |
| // code into the preheader block, or by sinking code to the exit blocks if it is |
| // safe. This pass also promotes must-aliased memory locations in the loop to |
| // live in registers, thus hoisting and sinking "invariant" loads and stores. |
| // |
| // This pass uses alias analysis for two purposes: |
| // |
| // 1. Moving loop invariant loads and calls out of loops. If we can determine |
| // that a load or call inside of a loop never aliases anything stored to, |
| // we can hoist it or sink it like any other instruction. |
| // 2. Scalar Promotion of Memory - If there is a store instruction inside of |
| // the loop, we try to move the store to happen AFTER the loop instead of |
| // inside of the loop. This can only happen if a few conditions are true: |
| // A. The pointer stored through is loop invariant |
| // B. There are no stores or loads in the loop which _may_ alias the |
| // pointer. There are no calls in the loop which mod/ref the pointer. |
| // If these conditions are true, we can promote the loads and stores in the |
| // loop of the pointer to use a temporary alloca'd variable. We then use |
| // the SSAUpdater to construct the appropriate SSA form for the value. |
| // |
| //===----------------------------------------------------------------------===// |
| |
| #ifndef LLVM_TRANSFORMS_SCALAR_LICM_H |
| #define LLVM_TRANSFORMS_SCALAR_LICM_H |
| |
| #include "llvm/Analysis/LoopInfo.h" |
| #include "llvm/IR/PassManager.h" |
| #include "llvm/Transforms/Scalar/LoopPassManager.h" |
| |
| namespace llvm { |
| |
| /// Performs Loop Invariant Code Motion Pass. |
| class LICMPass : public PassInfoMixin<LICMPass> { |
| public: |
| PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, |
| LoopStandardAnalysisResults &AR, LPMUpdater &U); |
| }; |
| } // end namespace llvm |
| |
| #endif // LLVM_TRANSFORMS_SCALAR_LICM_H |