Skip to content

Commit 487ff84

Browse files
committed
Narrow loop unroll in SPIR-V passes
1 parent 8a13595 commit 487ff84

File tree

2 files changed

+41
-32
lines changed

2 files changed

+41
-32
lines changed

include/spirv-tools/optimizer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -125,6 +125,8 @@ class SPIRV_TOOLS_EXPORT Optimizer {
125125
// interface are considered live and are not eliminated.
126126
Optimizer& RegisterLegalizationPasses();
127127
Optimizer& RegisterLegalizationPasses(bool preserve_interface);
128+
Optimizer& RegisterLegalizationPasses(bool preserve_interface,
129+
bool include_loop_unroll);
128130

129131
// Register passes specified in the list of |flags|. Each flag must be a
130132
// string of a form accepted by Optimizer::FlagHasValidForm().

source/opt/optimizer.cpp

Lines changed: 39 additions & 32 deletions
Original file line numberDiff line numberDiff line change
@@ -120,8 +120,9 @@ Optimizer& Optimizer::RegisterPass(PassToken&& p) {
120120
// The legalization problem is essentially a very general copy propagation
121121
// problem. The optimization we use are all used to either do copy propagation
122122
// or enable more copy propagation.
123-
Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface) {
124-
return
123+
Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface,
124+
bool include_loop_unroll) {
125+
auto& optimizer =
125126
// Wrap OpKill instructions so all other code can be inlined.
126127
RegisterPass(CreateWrapOpKillPass())
127128
// Remove unreachable block so that merge return works.
@@ -154,34 +155,41 @@ Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface) {
154155
.RegisterPass(CreateLegalizeMultidimArrayPass())
155156
// Propagate constants to get as many constant conditions on branches
156157
// as possible.
157-
.RegisterPass(CreateCCPPass())
158-
.RegisterPass(CreateLoopUnrollPass(true))
159-
.RegisterPass(CreateDeadBranchElimPass())
160-
// Copy propagate members. Cleans up code sequences generated by
161-
// scalar replacement. Also important for removing OpPhi nodes.
162-
.RegisterPass(CreateSimplificationPass())
163-
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
164-
.RegisterPass(CreateCopyPropagateArraysPass())
165-
// May need loop unrolling here see
166-
// https://github.com/Microsoft/DirectXShaderCompiler/pull/930
167-
// Get rid of unused code that contain traces of illegal code
168-
// or unused references to unbound external objects
169-
.RegisterPass(CreateVectorDCEPass())
170-
.RegisterPass(CreateDeadInsertElimPass())
171-
.RegisterPass(CreateReduceLoadSizePass())
172-
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
173-
.RegisterPass(CreateRemoveUnusedInterfaceVariablesPass())
174-
.RegisterPass(CreateInterpolateFixupPass())
175-
.RegisterPass(CreateInvocationInterlockPlacementPass())
176-
.RegisterPass(CreateOpExtInstWithForwardReferenceFixupPass());
158+
.RegisterPass(CreateCCPPass());
159+
if (include_loop_unroll) {
160+
optimizer.RegisterPass(CreateLoopUnrollPass(true));
161+
}
162+
return optimizer
163+
.RegisterPass(CreateDeadBranchElimPass())
164+
// Copy propagate members. Cleans up code sequences generated by
165+
// scalar replacement. Also important for removing OpPhi nodes.
166+
.RegisterPass(CreateSimplificationPass())
167+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
168+
.RegisterPass(CreateCopyPropagateArraysPass())
169+
// May need loop unrolling here see
170+
// https://github.com/Microsoft/DirectXShaderCompiler/pull/930
171+
// Get rid of unused code that contain traces of illegal code
172+
// or unused references to unbound external objects
173+
.RegisterPass(CreateVectorDCEPass())
174+
.RegisterPass(CreateDeadInsertElimPass())
175+
.RegisterPass(CreateReduceLoadSizePass())
176+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
177+
.RegisterPass(CreateRemoveUnusedInterfaceVariablesPass())
178+
.RegisterPass(CreateInterpolateFixupPass())
179+
.RegisterPass(CreateInvocationInterlockPlacementPass())
180+
.RegisterPass(CreateOpExtInstWithForwardReferenceFixupPass());
177181
}
178182

179183
Optimizer& Optimizer::RegisterLegalizationPasses() {
180-
return RegisterLegalizationPasses(false);
184+
return RegisterLegalizationPasses(false, true);
185+
}
186+
187+
Optimizer& Optimizer::RegisterLegalizationPasses(bool preserve_interface) {
188+
return RegisterLegalizationPasses(preserve_interface, true);
181189
}
182190

183191
Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
184-
return RegisterPass(CreateWrapOpKillPass())
192+
auto& optimizer = RegisterPass(CreateWrapOpKillPass())
185193
.RegisterPass(CreateDeadBranchElimPass())
186194
.RegisterPass(CreateMergeReturnPass())
187195
.RegisterPass(CreateInlineExhaustivePass())
@@ -199,11 +207,10 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
199207
.RegisterPass(CreateLocalMultiStoreElimPass())
200208
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
201209
.RegisterPass(CreateCCPPass())
202-
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
203-
.RegisterPass(CreateLoopUnrollPass(true))
204-
.RegisterPass(CreateDeadBranchElimPass())
205-
.RegisterPass(CreateRedundancyEliminationPass())
206-
.RegisterPass(CreateCombineAccessChainsPass())
210+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface));
211+
optimizer.RegisterPass(CreateDeadBranchElimPass());
212+
optimizer.RegisterPass(CreateLocalRedundancyEliminationPass());
213+
optimizer.RegisterPass(CreateCombineAccessChainsPass())
207214
.RegisterPass(CreateSimplificationPass())
208215
.RegisterPass(CreateScalarReplacementPass(0))
209216
.RegisterPass(CreateLocalAccessChainConvertPass())
@@ -220,9 +227,9 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
220227
.RegisterPass(CreateCopyPropagateArraysPass())
221228
.RegisterPass(CreateReduceLoadSizePass())
222229
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
223-
.RegisterPass(CreateBlockMergePass())
224-
.RegisterPass(CreateRedundancyEliminationPass())
225-
.RegisterPass(CreateDeadBranchElimPass())
230+
.RegisterPass(CreateBlockMergePass());
231+
optimizer.RegisterPass(CreateLocalRedundancyEliminationPass());
232+
return optimizer.RegisterPass(CreateDeadBranchElimPass())
226233
.RegisterPass(CreateBlockMergePass())
227234
.RegisterPass(CreateSimplificationPass());
228235
}

0 commit comments

Comments
 (0)