Apply the SPIRV-Tools optimizer to generated SPIR-V. HLSL SPIR-V is legalized in the process.
| 183 | |
| 184 | // Apply the SPIRV-Tools optimizer to generated SPIR-V. HLSL SPIR-V is legalized in the process. |
| 185 | void SpirvToolsTransform(const glslang::TIntermediate& intermediate, std::vector<unsigned int>& spirv, |
| 186 | spv::SpvBuildLogger* logger, const SpvOptions* options) |
| 187 | { |
| 188 | spv_target_env target_env = MapToSpirvToolsEnv(intermediate.getSpv(), logger); |
| 189 | |
| 190 | spvtools::Optimizer optimizer(target_env); |
| 191 | optimizer.SetMessageConsumer(OptimizerMesssageConsumer); |
| 192 | |
| 193 | // If debug (specifically source line info) is being generated, propagate |
| 194 | // line information into all SPIR-V instructions. This avoids loss of |
| 195 | // information when instructions are deleted or moved. Later, remove |
| 196 | // redundant information to minimize final SPRIR-V size. |
| 197 | if (options->stripDebugInfo) { |
| 198 | optimizer.RegisterPass(spvtools::CreateStripDebugInfoPass()); |
| 199 | } |
| 200 | optimizer.RegisterPass(spvtools::CreateWrapOpKillPass()); |
| 201 | optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass()); |
| 202 | optimizer.RegisterPass(spvtools::CreateMergeReturnPass()); |
| 203 | optimizer.RegisterPass(spvtools::CreateInlineExhaustivePass()); |
| 204 | optimizer.RegisterPass(spvtools::CreateEliminateDeadFunctionsPass()); |
| 205 | optimizer.RegisterPass(spvtools::CreateScalarReplacementPass()); |
| 206 | optimizer.RegisterPass(spvtools::CreateLocalAccessChainConvertPass()); |
| 207 | optimizer.RegisterPass(spvtools::CreateLocalSingleBlockLoadStoreElimPass()); |
| 208 | optimizer.RegisterPass(spvtools::CreateLocalSingleStoreElimPass()); |
| 209 | optimizer.RegisterPass(spvtools::CreateSimplificationPass()); |
| 210 | optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); |
| 211 | optimizer.RegisterPass(spvtools::CreateVectorDCEPass()); |
| 212 | optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass()); |
| 213 | optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); |
| 214 | optimizer.RegisterPass(spvtools::CreateDeadBranchElimPass()); |
| 215 | optimizer.RegisterPass(spvtools::CreateBlockMergePass()); |
| 216 | optimizer.RegisterPass(spvtools::CreateLocalMultiStoreElimPass()); |
| 217 | optimizer.RegisterPass(spvtools::CreateIfConversionPass()); |
| 218 | optimizer.RegisterPass(spvtools::CreateSimplificationPass()); |
| 219 | optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); |
| 220 | optimizer.RegisterPass(spvtools::CreateVectorDCEPass()); |
| 221 | optimizer.RegisterPass(spvtools::CreateDeadInsertElimPass()); |
| 222 | optimizer.RegisterPass(spvtools::CreateInterpolateFixupPass()); |
| 223 | if (options->optimizeSize) { |
| 224 | optimizer.RegisterPass(spvtools::CreateRedundancyEliminationPass()); |
| 225 | optimizer.RegisterPass(spvtools::CreateEliminateDeadInputComponentsSafePass()); |
| 226 | } |
| 227 | optimizer.RegisterPass(spvtools::CreateAggressiveDCEPass()); |
| 228 | optimizer.RegisterPass(spvtools::CreateCFGCleanupPass()); |
| 229 | |
| 230 | spvtools::OptimizerOptions spvOptOptions; |
| 231 | if (options->optimizerAllowExpandedIDBound) |
| 232 | spvOptOptions.set_max_id_bound(0x3FFFFFFF); |
| 233 | optimizer.SetTargetEnv(MapToSpirvToolsEnv(intermediate.getSpv(), logger)); |
| 234 | spvOptOptions.set_run_validator(false); // The validator may run as a separate step later on |
| 235 | optimizer.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); |
| 236 | |
| 237 | if (options->optimizerAllowExpandedIDBound) { |
| 238 | if (spirv.size() > 3 && spirv[3] > kDefaultMaxIdBound) { |
| 239 | spvtools::Optimizer optimizer2(target_env); |
| 240 | optimizer2.SetMessageConsumer(OptimizerMesssageConsumer); |
| 241 | optimizer2.RegisterPass(spvtools::CreateCompactIdsPass()); |
| 242 | optimizer2.Run(spirv.data(), spirv.size(), &spirv, spvOptOptions); |
no test coverage detected