Skip to content

Commit 0ecbcc9

Browse files
committed
Add O1experimental fast compile recipe
1 parent 2a730e1 commit 0ecbcc9

2 files changed

Lines changed: 63 additions & 9 deletions

File tree

include/spirv-tools/optimizer.hpp

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -109,6 +109,8 @@ class SPIRV_TOOLS_EXPORT Optimizer {
109109
// interface are considered live and are not eliminated.
110110
Optimizer& RegisterPerformancePasses();
111111
Optimizer& RegisterPerformancePasses(bool preserve_interface);
112+
Optimizer& RegisterPerformancePassesFastCompile();
113+
Optimizer& RegisterPerformancePassesFastCompile(bool preserve_interface);
112114

113115
// Registers passes that attempt to improve the size of generated code.
114116
// This sequence of passes is subject to constant review and will change

source/opt/optimizer.cpp

Lines changed: 61 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -199,16 +199,16 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
199199
.RegisterPass(CreateLocalSingleStoreElimPass())
200200
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
201201
.RegisterPass(CreateScalarReplacementPass(0))
202-
.RegisterPass(CreateLocalAccessChainConvertPass());
203-
optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
202+
.RegisterPass(CreateLocalAccessChainConvertPass());
203+
optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
204204
.RegisterPass(CreateLocalSingleStoreElimPass())
205205
.RegisterPass(CreateAggressiveDCEPass(preserve_interface));
206-
optimizer.RegisterPass(CreateCCPPass())
207-
.RegisterPass(CreateAggressiveDCEPass(preserve_interface));
208-
// Preserve LoopControl::Unroll in the IR instead of always materializing
209-
// it here. The optimizer-side full unroll is very costly on large modules
210-
// with many tiny [unroll]-annotated loops, while the hint remains available
211-
// to downstream consumers in the final SPIR-V.
206+
optimizer.RegisterPass(CreateCCPPass())
207+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface));
208+
// Preserve LoopControl::Unroll in the IR instead of always materializing
209+
// it here. The optimizer-side full unroll is very costly on large modules
210+
// with many tiny [unroll]-annotated loops, while the hint remains available
211+
// to downstream consumers in the final SPIR-V.
212212
optimizer.RegisterPass(CreateDeadBranchElimPass());
213213
optimizer.RegisterPass(CreateLocalRedundancyEliminationPass());
214214
optimizer.RegisterPass(CreateCombineAccessChainsPass())
@@ -218,7 +218,7 @@ Optimizer& Optimizer::RegisterPerformancePasses(bool preserve_interface) {
218218
.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
219219
.RegisterPass(CreateLocalSingleStoreElimPass())
220220
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
221-
.RegisterPass(CreateSSARewritePass(SSARewriteMode::SpecialTypes))
221+
.RegisterPass(CreateSSARewritePass(SSARewriteMode::SpecialTypes))
222222
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
223223
.RegisterPass(CreateVectorDCEPass())
224224
.RegisterPass(CreateDeadInsertElimPass())
@@ -239,6 +239,58 @@ Optimizer& Optimizer::RegisterPerformancePasses() {
239239
return RegisterPerformancePasses(false);
240240
}
241241

242+
Optimizer& Optimizer::RegisterPerformancePassesFastCompile(
243+
bool preserve_interface) {
244+
auto& optimizer = RegisterPass(CreateAggressiveDCEPass(preserve_interface))
245+
.RegisterPass(CreateDeadVariableEliminationPass())
246+
.RegisterPass(CreateRemoveUnusedInterfaceVariablesPass())
247+
.RegisterPass(CreateWrapOpKillPass())
248+
.RegisterPass(CreateDeadBranchElimPass())
249+
.RegisterPass(CreateMergeReturnPass())
250+
.RegisterPass(CreateInlineExhaustivePass())
251+
.RegisterPass(CreateEliminateDeadFunctionsPass())
252+
.RegisterPass(CreatePrivateToLocalPass())
253+
.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
254+
.RegisterPass(CreateLocalSingleStoreElimPass())
255+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
256+
.RegisterPass(CreateScalarReplacementPass(0))
257+
.RegisterPass(CreateLocalAccessChainConvertPass());
258+
optimizer.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
259+
.RegisterPass(CreateLocalSingleStoreElimPass())
260+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface));
261+
optimizer.RegisterPass(CreateCCPPass())
262+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface));
263+
optimizer.RegisterPass(CreateDeadBranchElimPass());
264+
optimizer.RegisterPass(CreateLocalRedundancyEliminationPass());
265+
optimizer.RegisterPass(CreateCombineAccessChainsPass())
266+
.RegisterPass(CreateSimplificationPass())
267+
.RegisterPass(CreateScalarReplacementPass(0))
268+
.RegisterPass(CreateLocalAccessChainConvertPass())
269+
.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
270+
.RegisterPass(CreateLocalSingleStoreElimPass())
271+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
272+
.RegisterPass(CreateSSARewritePass(SSARewriteMode::SpecialTypes))
273+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
274+
.RegisterPass(CreateVectorDCEPass())
275+
.RegisterPass(CreateDeadInsertElimPass())
276+
.RegisterPass(CreateDeadBranchElimPass())
277+
.RegisterPass(CreateSimplificationPass())
278+
.RegisterPass(CreateIfConversionPass())
279+
.RegisterPass(CreateCopyPropagateArraysPass())
280+
.RegisterPass(CreateReduceLoadSizePass())
281+
.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
282+
.RegisterPass(CreateBlockMergePass());
283+
optimizer.RegisterPass(CreateLocalRedundancyEliminationPass());
284+
return optimizer.RegisterPass(CreateAggressiveDCEPass(preserve_interface))
285+
.RegisterPass(CreateDeadBranchElimPass())
286+
.RegisterPass(CreateBlockMergePass())
287+
.RegisterPass(CreateSimplificationPass());
288+
}
289+
290+
Optimizer& Optimizer::RegisterPerformancePassesFastCompile() {
291+
return RegisterPerformancePassesFastCompile(false);
292+
}
293+
242294
Optimizer& Optimizer::RegisterSizePasses(bool preserve_interface) {
243295
return RegisterPass(CreateWrapOpKillPass())
244296
.RegisterPass(CreateDeadBranchElimPass())

0 commit comments

Comments
 (0)