LLVM 24.0.0git
LoopUnrollPass.h
Go to the documentation of this file.
1//===- LoopUnrollPass.h -----------------------------------------*- 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_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
10#define LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
11
13#include "llvm/IR/PassManager.h"
14#include <optional>
15
16namespace llvm {
17
18namespace cl {
20} // namespace cl
21
22/// Returns -forget-scev-loop-unroll of LibraryOptions, or its global value if
23/// null.
24LLVM_ABI bool
26
27class Function;
28class Loop;
29class LPMUpdater;
30
31/// Loop unroll pass that only does full loop unrolling and peeling.
32class LoopFullUnrollPass : public OptionalPassInfoMixin<LoopFullUnrollPass> {
33 const int OptLevel;
34
35 /// If false, use a cost model to determine whether unrolling of a loop is
36 /// profitable. If true, only loops that explicitly request unrolling via
37 /// metadata are considered. All other loops are skipped.
38 const bool OnlyWhenForced;
39
40 /// If true, forget all loops when unrolling. If false, forget top-most loop
41 /// of the currently processed loops, which removes one entry at a time from
42 /// the internal SCEV records. For large loops, the former is faster.
43 const bool ForgetSCEV;
44
45 /// If true, consider calls as inline candidates and defer unrolling so that
46 /// LTO post-link inlining can consider them first.
47 const bool PrepareForLTO;
48
49public:
50 explicit LoopFullUnrollPass(int OptLevel = 2, bool OnlyWhenForced = false,
51 bool ForgetSCEV = false,
52 bool PrepareForLTO = false)
53 : OptLevel(OptLevel), OnlyWhenForced(OnlyWhenForced),
54 ForgetSCEV(ForgetSCEV), PrepareForLTO(PrepareForLTO) {}
55
58 LPMUpdater &U);
59};
60
61/// A set of parameters used to control various transforms performed by the
62/// LoopUnroll pass. Each of the boolean parameters can be set to:
63/// true - enabling the transformation.
64/// false - disabling the transformation.
65/// None - relying on a global default.
66///
67/// There is also OptLevel parameter, which is used for additional loop unroll
68/// tuning.
69///
70/// Intended use is to create a default object, modify parameters with
71/// additional setters and then pass it to LoopUnrollPass.
72///
74 std::optional<bool> AllowPartial;
75 std::optional<bool> AllowPeeling;
76 std::optional<bool> AllowRuntime;
77 std::optional<bool> AllowUpperBound;
78 std::optional<bool> AllowProfileBasedPeeling;
79 std::optional<unsigned> FullUnrollMaxCount;
81
82 /// If false, use a cost model to determine whether unrolling of a loop is
83 /// profitable. If true, only loops that explicitly request unrolling via
84 /// metadata are considered. All other loops are skipped.
86
87 /// If true, forget all loops when unrolling. If false, forget top-most loop
88 /// of the currently processed loops, which removes one entry at a time from
89 /// the internal SCEV records. For large loops, the former is faster.
90 const bool ForgetSCEV;
91
92 /// If true, consider calls as inline candidates and defer unrolling so that
93 /// LTO post-link inlining can consider them first.
94 bool PrepareForLTO = false;
95
100
101 /// Enables or disables partial unrolling. When disabled only full unrolling
102 /// is allowed.
104 AllowPartial = Partial;
105 return *this;
106 }
107
108 /// Enables or disables unrolling of loops with runtime trip count.
111 return *this;
112 }
113
114 /// Enables or disables loop peeling.
116 AllowPeeling = Peeling;
117 return *this;
118 }
119
120 /// Enables or disables the use of trip count upper bound
121 /// in loop unrolling.
123 AllowUpperBound = UpperBound;
124 return *this;
125 }
126
127 // Sets "optimization level" tuning parameter for loop unrolling.
129 OptLevel = O;
130 return *this;
131 }
132
133 // Enables or disables loop peeling basing on profile.
136 return *this;
137 }
138
139 // Sets the max full unroll count.
142 return *this;
143 }
144
146 PrepareForLTO = V;
147 return *this;
148 }
149};
150
151/// Loop unroll pass that will support both full and partial unrolling.
152/// It is a function pass to have access to function and module analyses.
153/// It will also put loops into canonical form (simplified and LCSSA).
154class LoopUnrollPass : public OptionalPassInfoMixin<LoopUnrollPass> {
155 LoopUnrollOptions UnrollOpts;
156
157public:
158 /// This uses the target information (or flags) to control the thresholds for
159 /// different unrolling stategies but supports all of them.
160 explicit LoopUnrollPass(LoopUnrollOptions UnrollOpts = {})
161 : UnrollOpts(UnrollOpts) {}
162
163 LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
164 LLVM_ABI void
165 printPipeline(raw_ostream &OS,
166 function_ref<StringRef(StringRef)> MapClassName2PassName);
167};
168
169} // end namespace llvm
170
171#endif // LLVM_TRANSFORMS_SCALAR_LOOPUNROLLPASS_H
#define LLVM_ABI
Definition Compiler.h:215
This header defines various interfaces for pass management in LLVM.
This header provides classes for managing per-loop analyses.
#define F(x, y, z)
Definition MD5.cpp:54
This class provides an interface for updating the loop pass manager based on mutations to the loop ne...
LoopFullUnrollPass(int OptLevel=2, bool OnlyWhenForced=false, bool ForgetSCEV=false, bool PrepareForLTO=false)
LLVM_ABI PreservedAnalyses run(Loop &L, LoopAnalysisManager &AM, LoopStandardAnalysisResults &AR, LPMUpdater &U)
LoopUnrollPass(LoopUnrollOptions UnrollOpts={})
This uses the target information (or flags) to control the thresholds for different unrolling stategi...
LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM)
LLVM_ABI void printPipeline(raw_ostream &OS, function_ref< StringRef(StringRef)> MapClassName2PassName)
Represents a single loop in the control flow graph.
Definition LoopInfo.h:40
A set of analyses that are preserved following a run of a transformation pass.
Definition Analysis.h:112
This namespace contains all of the command line option processing machinery.
Definition CodeGenData.h:33
This is an optimization pass for GlobalISel generic memory operations.
@ Runtime
Detect stack use after return if not disabled runtime with (ASAN_OPTIONS=detect_stack_use_after_retur...
LLVM_ABI bool getForgetSCEVInLoopUnroll(const cl::LibraryOptionsContext *LibraryOptions)
Returns -forget-scev-loop-unroll of LibraryOptions, or its global value if null.
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
AnalysisManager< Function > FunctionAnalysisManager
Convenience typedef for the Function analysis manager.
The adaptor from a function pass to a loop pass computes these analyses and makes them available to t...
A set of parameters used to control various transforms performed by the LoopUnroll pass.
LoopUnrollOptions & setPeeling(bool Peeling)
Enables or disables loop peeling.
bool OnlyWhenForced
If false, use a cost model to determine whether unrolling of a loop is profitable.
LoopUnrollOptions & setOptLevel(int O)
const bool ForgetSCEV
If true, forget all loops when unrolling.
std::optional< unsigned > FullUnrollMaxCount
std::optional< bool > AllowPartial
std::optional< bool > AllowRuntime
bool PrepareForLTO
If true, consider calls as inline candidates and defer unrolling so that LTO post-link inlining can c...
LoopUnrollOptions(int OptLevel=2, bool OnlyWhenForced=false, bool ForgetSCEV=false)
LoopUnrollOptions & setPartial(bool Partial)
Enables or disables partial unrolling.
std::optional< bool > AllowProfileBasedPeeling
std::optional< bool > AllowPeeling
LoopUnrollOptions & setFullUnrollMaxCount(unsigned O)
LoopUnrollOptions & setPrepareForLTO(bool V)
LoopUnrollOptions & setUpperBound(bool UpperBound)
Enables or disables the use of trip count upper bound in loop unrolling.
std::optional< bool > AllowUpperBound
LoopUnrollOptions & setRuntime(bool Runtime)
Enables or disables unrolling of loops with runtime trip count.
LoopUnrollOptions & setProfileBasedPeeling(int O)
A CRTP mix-in for passes that can be skipped.