File indexing completed on 2026-05-10 08:44:42
0001
0002
0003
0004
0005
0006
0007
0008
0009 #ifndef LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
0010 #define LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
0011
0012 #include "llvm/Analysis/LoopAnalysisManager.h"
0013 #include "llvm/IR/PassManager.h"
0014 #include "llvm/Support/CommandLine.h"
0015 #include <optional>
0016
0017 namespace llvm {
0018
0019 extern cl::opt<bool> ForgetSCEVInLoopUnroll;
0020
0021 class Function;
0022 class Loop;
0023 class LPMUpdater;
0024
0025
0026 class LoopFullUnrollPass : public PassInfoMixin<LoopFullUnrollPass> {
0027 const int OptLevel;
0028
0029
0030
0031
0032 const bool OnlyWhenForced;
0033
0034
0035
0036
0037 const bool ForgetSCEV;
0038
0039 public:
0040 explicit LoopFullUnrollPass(int OptLevel = 2, bool OnlyWhenForced = false,
0041 bool ForgetSCEV = false)
0042 : OptLevel(OptLevel), OnlyWhenForced(OnlyWhenForced),
0043 ForgetSCEV(ForgetSCEV) {}
0044
0045 PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM,
0046 LoopStandardAnalysisResults &AR, LPMUpdater &U);
0047 };
0048
0049
0050
0051
0052
0053
0054
0055
0056
0057
0058
0059
0060
0061 struct LoopUnrollOptions {
0062 std::optional<bool> AllowPartial;
0063 std::optional<bool> AllowPeeling;
0064 std::optional<bool> AllowRuntime;
0065 std::optional<bool> AllowUpperBound;
0066 std::optional<bool> AllowProfileBasedPeeling;
0067 std::optional<unsigned> FullUnrollMaxCount;
0068 int OptLevel;
0069
0070
0071
0072
0073 bool OnlyWhenForced;
0074
0075
0076
0077
0078 const bool ForgetSCEV;
0079
0080 LoopUnrollOptions(int OptLevel = 2, bool OnlyWhenForced = false,
0081 bool ForgetSCEV = false)
0082 : OptLevel(OptLevel), OnlyWhenForced(OnlyWhenForced),
0083 ForgetSCEV(ForgetSCEV) {}
0084
0085
0086
0087 LoopUnrollOptions &setPartial(bool Partial) {
0088 AllowPartial = Partial;
0089 return *this;
0090 }
0091
0092
0093 LoopUnrollOptions &setRuntime(bool Runtime) {
0094 AllowRuntime = Runtime;
0095 return *this;
0096 }
0097
0098
0099 LoopUnrollOptions &setPeeling(bool Peeling) {
0100 AllowPeeling = Peeling;
0101 return *this;
0102 }
0103
0104
0105
0106 LoopUnrollOptions &setUpperBound(bool UpperBound) {
0107 AllowUpperBound = UpperBound;
0108 return *this;
0109 }
0110
0111
0112 LoopUnrollOptions &setOptLevel(int O) {
0113 OptLevel = O;
0114 return *this;
0115 }
0116
0117
0118 LoopUnrollOptions &setProfileBasedPeeling(int O) {
0119 AllowProfileBasedPeeling = O;
0120 return *this;
0121 }
0122
0123
0124 LoopUnrollOptions &setFullUnrollMaxCount(unsigned O) {
0125 FullUnrollMaxCount = O;
0126 return *this;
0127 }
0128 };
0129
0130
0131
0132
0133 class LoopUnrollPass : public PassInfoMixin<LoopUnrollPass> {
0134 LoopUnrollOptions UnrollOpts;
0135
0136 public:
0137
0138
0139 explicit LoopUnrollPass(LoopUnrollOptions UnrollOpts = {})
0140 : UnrollOpts(UnrollOpts) {}
0141
0142 PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
0143 void printPipeline(raw_ostream &OS,
0144 function_ref<StringRef(StringRef)> MapClassName2PassName);
0145 };
0146
0147 }
0148
0149 #endif