1//=- MachineLoopUtils.h - Helper functions for manipulating loops -*- 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#ifndef LLVM_CODEGEN_MACHINELOOPUTILS_H
10#define LLVM_CODEGEN_MACHINELOOPUTILS_H
11
12namespace llvm {
13class MachineBasicBlock;
14class MachineRegisterInfo;
15class TargetInstrInfo;
16
17enum LoopPeelDirection {
18 LPD_Front, ///< Peel the first iteration of the loop.
19 LPD_Back ///< Peel the last iteration of the loop.
20};
21
22/// Peels a single block loop. Loop must have two successors, one of which
23/// must be itself. Similarly it must have two predecessors, one of which must
24/// be itself.
25///
26/// The loop block is copied and inserted into the CFG such that two copies of
27/// the loop follow on from each other. The copy is inserted either before or
28/// after the loop based on Direction.
29///
30/// Phis are updated and an unconditional branch inserted at the end of the
31/// clone so as to execute a single iteration.
32///
33/// The trip count of Loop is not updated.
34MachineBasicBlock *PeelSingleBlockLoop(LoopPeelDirection Direction,
35 MachineBasicBlock *Loop,
36 MachineRegisterInfo &MRI,
37 const TargetInstrInfo *TII);
38
39} // namespace llvm
40
41#endif // LLVM_CODEGEN_MACHINELOOPUTILS_H
42