1//===- LoopUnrollPass.h -----------------------------------------*- 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#ifndef LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
11#define LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
12
13#include "llvm/Analysis/LoopInfo.h"
14#include "llvm/IR/PassManager.h"
15#include "llvm/Transforms/Scalar/LoopPassManager.h"
16
17namespace llvm {
18
19class LoopUnrollPass : public PassInfoMixin<LoopUnrollPass> {
20  const bool AllowPartialUnrolling;
21  const int OptLevel;
22
23  explicit LoopUnrollPass(bool AllowPartialUnrolling, int OptLevel)
24      : AllowPartialUnrolling(AllowPartialUnrolling), OptLevel(OptLevel) {}
25
26public:
27  /// Create an instance of the loop unroll pass that will support both full
28  /// and partial unrolling.
29  ///
30  /// This uses the target information (or flags) to control the thresholds for
31  /// different unrolling stategies but supports all of them.
32  static LoopUnrollPass create(int OptLevel = 2) {
33    return LoopUnrollPass(/*AllowPartialUnrolling*/ true, OptLevel);
34  }
35
36  /// Create an instance of the loop unroll pass that only does full loop
37  /// unrolling.
38  ///
39  /// This will disable any runtime or partial unrolling.
40  static LoopUnrollPass createFull(int OptLevel = 2) {
41    return LoopUnrollPass(/*AllowPartialUnrolling*/ false, OptLevel);
42  }
43
44  PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
45                        LoopStandardAnalysisResults &AR, LPMUpdater &U);
46};
47} // end namespace llvm
48
49#endif // LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
50