-
Notifications
You must be signed in to change notification settings - Fork 664
Unnecessary promotion to highp with "merge return" optimization pass #1736
Description
When compiling the attached fragment shader to SPIRV and running the optimization passes listed below, a bunch of operations are promoted to highp (they lose the relaxed precision decoration in spirv). This can be easily observed on the textureLod() calls. They are marked highp even though the sampler and the default precision are both set to mediump.
See postprocess-mergereturn.vkglsl.txt for the generated code with the merge return pass and postprocess-nomergereturn.vkglsl.txt without the merge return pass. Observe the last 4 textureLod calls.
postprocess-mergereturn.vkglsl.txt
postprocess-nomergereturn.vkglsl.txt
Source shaders:
postprocess.vert.txt
postprocess.frag.txt
Optimization passes used:
optimizer
.RegisterPass(CreateMergeReturnPass())
.RegisterPass(CreateInlineExhaustivePass())
.RegisterPass(CreateAggressiveDCEPass())
.RegisterPass(CreatePrivateToLocalPass())
.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
.RegisterPass(CreateLocalSingleStoreElimPass())
.RegisterPass(CreateAggressiveDCEPass())
.RegisterPass(CreateScalarReplacementPass())
.RegisterPass(CreateLocalAccessChainConvertPass())
.RegisterPass(CreateLocalSingleBlockLoadStoreElimPass())
.RegisterPass(CreateLocalSingleStoreElimPass())
.RegisterPass(CreateAggressiveDCEPass())
.RegisterPass(CreateLocalMultiStoreElimPass())
.RegisterPass(CreateAggressiveDCEPass())
.RegisterPass(CreateCCPPass())
.RegisterPass(CreateAggressiveDCEPass())
.RegisterPass(CreateRedundancyEliminationPass())
.RegisterPass(CreateSimplificationPass())
.RegisterPass(CreateVectorDCEPass())
.RegisterPass(CreateDeadInsertElimPass())
.RegisterPass(CreateDeadBranchElimPass())
.RegisterPass(CreateSimplificationPass())
.RegisterPass(CreateIfConversionPass())
.RegisterPass(CreateCopyPropagateArraysPass())
.RegisterPass(CreateReduceLoadSizePass())
.RegisterPass(CreateAggressiveDCEPass())
.RegisterPass(CreateBlockMergePass())
.RegisterPass(CreateRedundancyEliminationPass())
.RegisterPass(CreateDeadBranchElimPass())
.RegisterPass(CreateBlockMergePass())
.RegisterPass(CreateSimplificationPass());
Removing the first pass (CreateMergeReturnPass()) fixes the problem.