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"
15#include <optional>
16
17namespace llvm {
18
20
21class Function;
22class Loop;
23class LPMUpdater;
24
25/// Loop unroll pass that only does full loop unrolling and peeling.
26class LoopFullUnrollPass : public OptionalPassInfoMixin<LoopFullUnrollPass> {
27 const int OptLevel;
28
29 /// If false, use a cost model to determine whether unrolling of a loop is
30 /// profitable. If true, only loops that explicitly request unrolling via
31 /// metadata are considered. All other loops are skipped.
32 const bool OnlyWhenForced;
33
34 /// If true, forget all loops when unrolling. If false, forget top-most loop
35 /// of the currently processed loops, which removes one entry at a time from
36 /// the internal SCEV records. For large loops, the former is faster.
37 const bool ForgetSCEV;
38
39 /// If true, consider calls as inline candidates and defer unrolling so that
40 /// LTO post-link inlining can consider them first.
41 const bool PrepareForLTO;
42
43public:
44 explicit LoopFullUnrollPass(int OptLevel = 2, bool OnlyWhenForced = false,
45 bool ForgetSCEV = false,
46 bool PrepareForLTO = false)
47 : OptLevel(OptLevel), OnlyWhenForced(OnlyWhenForced),
48 ForgetSCEV(ForgetSCEV), PrepareForLTO(PrepareForLTO) {}
49
52 LPMUpdater &U);
53};
54
55/// A set of parameters used to control various transforms performed by the
56/// LoopUnroll pass. Each of the boolean parameters can be set to:
57/// true - enabling the transformation.
58/// false - disabling the transformation.
59/// None - relying on a global default.
60///
61/// There is also OptLevel parameter, which is used for additional loop unroll
62/// tuning.
63///
64/// Intended use is to create a default object, modify parameters with
65/// additional setters and then pass it to LoopUnrollPass.
66///
68 std::optional<bool> AllowPartial;
69 std::optional<bool> AllowPeeling;
70 std::optional<bool> AllowRuntime;
71 std::optional<bool> AllowUpperBound;
72 std::optional<bool> AllowProfileBasedPeeling;
73 std::optional<unsigned> FullUnrollMaxCount;
75
76 /// If false, use a cost model to determine whether unrolling of a loop is
77 /// profitable. If true, only loops that explicitly request unrolling via
78 /// metadata are considered. All other loops are skipped.
80
81 /// If true, forget all loops when unrolling. If false, forget top-most loop
82 /// of the currently processed loops, which removes one entry at a time from
83 /// the internal SCEV records. For large loops, the former is faster.
84 const bool ForgetSCEV;
85
86 /// If true, consider calls as inline candidates and defer unrolling so that
87 /// LTO post-link inlining can consider them first.
88 bool PrepareForLTO = false;
89
94
95 /// Enables or disables partial unrolling. When disabled only full unrolling
96 /// is allowed.
98 AllowPartial = Partial;
99 return *this;
100 }
101
102 /// Enables or disables unrolling of loops with runtime trip count.
105 return *this;
106 }
107
108 /// Enables or disables loop peeling.
110 AllowPeeling = Peeling;
111 return *this;
112 }
113
114 /// Enables or disables the use of trip count upper bound
115 /// in loop unrolling.
117 AllowUpperBound = UpperBound;
118 return *this;
119 }
120
121 // Sets "optimization level" tuning parameter for loop unrolling.
123 OptLevel = O;
124 return *this;
125 }
126
127 // Enables or disables loop peeling basing on profile.
130 return *this;
131 }
132
133 // Sets the max full unroll count.
136 return *this;
137 }
138
140 PrepareForLTO = V;
141 return *this;
142 }
143};
144
145/// Loop unroll pass that will support both full and partial unrolling.
146/// It is a function pass to have access to function and module analyses.
147/// It will also put loops into canonical form (simplified and LCSSA).
148class LoopUnrollPass : public OptionalPassInfoMixin<LoopUnrollPass> {
149 LoopUnrollOptions UnrollOpts;
150
151public:
152 /// This uses the target information (or flags) to control the thresholds for
153 /// different unrolling stategies but supports all of them.
154 explicit LoopUnrollPass(LoopUnrollOptions UnrollOpts = {})
155 : UnrollOpts(UnrollOpts) {}
156
157 LLVM_ABI PreservedAnalyses run(Function &F, FunctionAnalysisManager &AM);
158 LLVM_ABI void
159 printPipeline(raw_ostream &OS,
160 function_ref<StringRef(StringRef)> MapClassName2PassName);
161};
162
163} // end namespace llvm
164
165#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 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...
AnalysisManager< Loop, LoopStandardAnalysisResults & > LoopAnalysisManager
The loop analysis manager.
LLVM_ABI cl::opt< bool > ForgetSCEVInLoopUnroll
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.