LLVM  8.0.0svn
LICM.h
Go to the documentation of this file.
1 //===- LICM.h - Loop Invariant Code Motion Pass -------*- C++ -*-===//
2 //
3 // The LLVM Compiler Infrastructure
4 //
5 // This file is distributed under the University of Illinois Open Source
6 // License. See LICENSE.TXT for details.
7 //
8 //===----------------------------------------------------------------------===//
9 //
10 // This pass performs loop invariant code motion, attempting to remove as much
11 // code from the body of a loop as possible. It does this by either hoisting
12 // code into the preheader block, or by sinking code to the exit blocks if it is
13 // safe. This pass also promotes must-aliased memory locations in the loop to
14 // live in registers, thus hoisting and sinking "invariant" loads and stores.
15 //
16 // This pass uses alias analysis for two purposes:
17 //
18 // 1. Moving loop invariant loads and calls out of loops. If we can determine
19 // that a load or call inside of a loop never aliases anything stored to,
20 // we can hoist it or sink it like any other instruction.
21 // 2. Scalar Promotion of Memory - If there is a store instruction inside of
22 // the loop, we try to move the store to happen AFTER the loop instead of
23 // inside of the loop. This can only happen if a few conditions are true:
24 // A. The pointer stored through is loop invariant
25 // B. There are no stores or loads in the loop which _may_ alias the
26 // pointer. There are no calls in the loop which mod/ref the pointer.
27 // If these conditions are true, we can promote the loads and stores in the
28 // loop of the pointer to use a temporary alloca'd variable. We then use
29 // the SSAUpdater to construct the appropriate SSA form for the value.
30 //
31 //===----------------------------------------------------------------------===//
32 
33 #ifndef LLVM_TRANSFORMS_SCALAR_LICM_H
34 #define LLVM_TRANSFORMS_SCALAR_LICM_H
35 
36 #include "llvm/Analysis/LoopInfo.h"
37 #include "llvm/IR/PassManager.h"
39 
40 namespace llvm {
41 
42 /// Performs Loop Invariant Code Motion Pass.
43 class LICMPass : public PassInfoMixin<LICMPass> {
44 public:
47 };
48 } // end namespace llvm
49 
50 #endif // LLVM_TRANSFORMS_SCALAR_LICM_H
Compute iterated dominance frontiers using a linear time algorithm.
Definition: AllocatorList.h:24
This header provides classes for managing a pipeline of passes over loops in LLVM IR...
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
Performs Loop Invariant Code Motion Pass.
Definition: LICM.h:43
A CRTP mix-in to automatically provide informational APIs needed for passes.
Definition: PassManager.h:366
A set of analyses that are preserved following a run of a transformation pass.
Definition: PassManager.h:154
PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
Definition: LICM.cpp:219
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
Represents a single loop in the control flow graph.
Definition: LoopInfo.h:459
A container for analyses that lazily runs them and caches their results.
This header defines various interfaces for pass management in LLVM.