mirror of
https://github.com/RPCS3/llvm.git
synced 2026-01-31 01:25:19 +01:00
to reflect the new license. We understand that people may be surprised that we're moving the header entirely to discuss the new license. We checked this carefully with the Foundation's lawyer and we believe this is the correct approach. Essentially, all code in the project is now made available by the LLVM project under our new license, so you will see that the license headers include that license only. Some of our contributors have contributed code under our old license, and accordingly, we have retained a copy of our old license notice in the top-level files in each project and repository. git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@351636 91177308-0d34-0410-b5e6-96231b3b80d8
65 lines
2.7 KiB
C++
65 lines
2.7 KiB
C++
//===- LoopSimplify.h - Loop Canonicalization Pass --------------*- C++ -*-===//
|
|
//
|
|
// Part of the LLVM Project, under the Apache License v2.0 with LLVM Exceptions.
|
|
// See https://llvm.org/LICENSE.txt for license information.
|
|
// SPDX-License-Identifier: Apache-2.0 WITH LLVM-exception
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
//
|
|
// This pass performs several transformations to transform natural loops into a
|
|
// simpler form, which makes subsequent analyses and transformations simpler and
|
|
// more effective.
|
|
//
|
|
// Loop pre-header insertion guarantees that there is a single, non-critical
|
|
// entry edge from outside of the loop to the loop header. This simplifies a
|
|
// number of analyses and transformations, such as LICM.
|
|
//
|
|
// Loop exit-block insertion guarantees that all exit blocks from the loop
|
|
// (blocks which are outside of the loop that have predecessors inside of the
|
|
// loop) only have predecessors from inside of the loop (and are thus dominated
|
|
// by the loop header). This simplifies transformations such as store-sinking
|
|
// that are built into LICM.
|
|
//
|
|
// This pass also guarantees that loops will have exactly one backedge.
|
|
//
|
|
// Indirectbr instructions introduce several complications. If the loop
|
|
// contains or is entered by an indirectbr instruction, it may not be possible
|
|
// to transform the loop and make these guarantees. Client code should check
|
|
// that these conditions are true before relying on them.
|
|
//
|
|
// Note that the simplifycfg pass will clean up blocks which are split out but
|
|
// end up being unnecessary, so usage of this pass should not pessimize
|
|
// generated code.
|
|
//
|
|
// This pass obviously modifies the CFG, but updates loop information and
|
|
// dominator information.
|
|
//
|
|
//===----------------------------------------------------------------------===//
|
|
#ifndef LLVM_TRANSFORMS_UTILS_LOOPSIMPLIFY_H
|
|
#define LLVM_TRANSFORMS_UTILS_LOOPSIMPLIFY_H
|
|
|
|
#include "llvm/Analysis/AssumptionCache.h"
|
|
#include "llvm/Analysis/ScalarEvolution.h"
|
|
#include "llvm/IR/Dominators.h"
|
|
#include "llvm/IR/PassManager.h"
|
|
|
|
namespace llvm {
|
|
|
|
/// This pass is responsible for loop canonicalization.
|
|
class LoopSimplifyPass : public PassInfoMixin<LoopSimplifyPass> {
|
|
public:
|
|
PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
|
|
};
|
|
|
|
/// 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
|
|
/// update \c AliasAnalysis and \c ScalarEvolution analyses if they're non-null.
|
|
bool simplifyLoop(Loop *L, DominatorTree *DT, LoopInfo *LI, ScalarEvolution *SE,
|
|
AssumptionCache *AC, bool PreserveLCSSA);
|
|
|
|
} // end namespace llvm
|
|
|
|
#endif // LLVM_TRANSFORMS_UTILS_LOOPSIMPLIFY_H
|