Use the full list of optimization passes from spirv-opt
Experiments show substantial performance gains.
Bug: b/135609394
Change-Id: I62a6b9dd292cafe92aa5558a84c460594b51197c
Reviewed-on: https://swiftshader-review.googlesource.com/c/SwiftShader/+/33772
Reviewed-by: Nicolas Capens <nicolascapens@google.com>
Kokoro-Presubmit: kokoro <noreply+kokoro@google.com>
Tested-by: Ben Clayton <bclayton@google.com>
diff --git a/src/Vulkan/VkPipeline.cpp b/src/Vulkan/VkPipeline.cpp
index d54fddc..ba1b8db 100644
--- a/src/Vulkan/VkPipeline.cpp
+++ b/src/Vulkan/VkPipeline.cpp
@@ -176,12 +176,6 @@
vk::trace("%s: %d:%d %s", category, int(p.line), int(p.column), m);
});
-
- opt.RegisterPass(spvtools::CreateDeadBranchElimPass()); // Required for MergeReturnPass
- opt.RegisterPass(spvtools::CreateMergeReturnPass());
- opt.RegisterPass(spvtools::CreateInlineExhaustivePass());
- opt.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass());
-
// If the pipeline uses specialization, apply the specializations before freezing
if (specializationInfo)
{
@@ -197,14 +191,40 @@
opt.RegisterPass(spvtools::CreateSetSpecConstantDefaultValuePass(specializations));
}
- // Basic optimization passes to primarily address glslang's love of loads &
- // stores. Significantly reduces time spent in LLVM passes and codegen.
- opt.RegisterPass(spvtools::CreateLocalAccessChainConvertPass());
- opt.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass());
- opt.RegisterPass(spvtools::CreateLocalSingleStoreElimPass());
- opt.RegisterPass(spvtools::CreateBlockMergePass());
- opt.RegisterPass(spvtools::CreateLocalMultiStoreElimPass());
- opt.RegisterPass(spvtools::CreateSSARewritePass());
+ // Full optimization list taken from spirv-opt.
+ opt.RegisterPass(spvtools::CreateDeadBranchElimPass())
+ .RegisterPass(spvtools::CreateMergeReturnPass())
+ .RegisterPass(spvtools::CreateInlineExhaustivePass())
+ .RegisterPass(spvtools::CreateAggressiveDCEPass())
+ .RegisterPass(spvtools::CreatePrivateToLocalPass())
+ .RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass())
+ .RegisterPass(spvtools::CreateLocalSingleStoreElimPass())
+ .RegisterPass(spvtools::CreateAggressiveDCEPass())
+ .RegisterPass(spvtools::CreateScalarReplacementPass())
+ .RegisterPass(spvtools::CreateLocalAccessChainConvertPass())
+ .RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass())
+ .RegisterPass(spvtools::CreateLocalSingleStoreElimPass())
+ .RegisterPass(spvtools::CreateAggressiveDCEPass())
+ .RegisterPass(spvtools::CreateLocalMultiStoreElimPass())
+ .RegisterPass(spvtools::CreateAggressiveDCEPass())
+ .RegisterPass(spvtools::CreateCCPPass())
+ .RegisterPass(spvtools::CreateAggressiveDCEPass())
+ .RegisterPass(spvtools::CreateRedundancyEliminationPass())
+ .RegisterPass(spvtools::CreateCombineAccessChainsPass())
+ .RegisterPass(spvtools::CreateSimplificationPass())
+ .RegisterPass(spvtools::CreateVectorDCEPass())
+ .RegisterPass(spvtools::CreateDeadInsertElimPass())
+ .RegisterPass(spvtools::CreateDeadBranchElimPass())
+ .RegisterPass(spvtools::CreateSimplificationPass())
+ .RegisterPass(spvtools::CreateIfConversionPass())
+ .RegisterPass(spvtools::CreateCopyPropagateArraysPass())
+ .RegisterPass(spvtools::CreateReduceLoadSizePass())
+ .RegisterPass(spvtools::CreateAggressiveDCEPass())
+ .RegisterPass(spvtools::CreateBlockMergePass())
+ .RegisterPass(spvtools::CreateRedundancyEliminationPass())
+ .RegisterPass(spvtools::CreateDeadBranchElimPass())
+ .RegisterPass(spvtools::CreateBlockMergePass())
+ .RegisterPass(spvtools::CreateSimplificationPass());
std::vector<uint32_t> optimized;
opt.Run(code.data(), code.size(), &optimized);