1//===- LCSSA.h - Loop-closed SSA transform Pass -----------------*- C++ -*-===// 2// 3// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions. 4// See https://llvm.org/LICENSE.txt for license information. 5// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception 6// 7//===----------------------------------------------------------------------===// 8// 9// This pass transforms loops by placing phi nodes at the end of the loops for 10// all values that are live across the loop boundary. For example, it turns 11// the left into the right code: 12// 13// for (...) for (...) 14// if (c) if (c) 15// X1 = ... X1 = ... 16// else else 17// X2 = ... X2 = ... 18// X3 = phi(X1, X2) X3 = phi(X1, X2) 19// ... = X3 + 4 X4 = phi(X3) 20// ... = X4 + 4 21// 22// This is still valid LLVM; the extra phi nodes are purely redundant, and will 23// be trivially eliminated by InstCombine. The major benefit of this 24// transformation is that it makes many other loop optimizations, such as 25// LoopUnswitching, simpler. 26// 27//===----------------------------------------------------------------------===// 28 29#ifndef LLVM_TRANSFORMS_UTILS_LCSSA_H 30#define LLVM_TRANSFORMS_UTILS_LCSSA_H 31 32#include "llvm/IR/PassManager.h" 33 34namespace llvm { 35 36/// Converts loops into loop-closed SSA form. 37class LCSSAPass : public PassInfoMixin<LCSSAPass> { 38public: 39 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM); 40}; 41} // end namespace llvm 42 43#endif // LLVM_TRANSFORMS_UTILS_LCSSA_H 44