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);