1//===- LCSSA.h - Loop-closed SSA transform 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 transforms loops by placing phi nodes at the end of the loops for
11// all values that are live across the loop boundary.  For example, it turns
12// the left into the right code:
13//
14// for (...)                for (...)
15//   if (c)                   if (c)
16//     X1 = ...                 X1 = ...
17//   else                     else
18//     X2 = ...                 X2 = ...
19//   X3 = phi(X1, X2)         X3 = phi(X1, X2)
20// ... = X3 + 4             X4 = phi(X3)
21//                          ... = X4 + 4
22//
23// This is still valid LLVM; the extra phi nodes are purely redundant, and will
24// be trivially eliminated by InstCombine.  The major benefit of this
25// transformation is that it makes many other loop optimizations, such as
26// LoopUnswitching, simpler.
27//
28//===----------------------------------------------------------------------===//
29
30#ifndef LLVM_TRANSFORMS_UTILS_LCSSA_H
31#define LLVM_TRANSFORMS_UTILS_LCSSA_H
32
33#include "llvm/IR/PassManager.h"
34
35namespace llvm {
36
37/// Converts loops into loop-closed SSA form.
38class LCSSAPass : public PassInfoMixin<LCSSAPass> {
39public:
40  PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
41};
42} // end namespace llvm
43
44#endif // LLVM_TRANSFORMS_UTILS_LCSSA_H
45