Closed afd closed 5 years ago
Similar to #2453. In this case, merge return adds the OpPhi, but in the wrong block. That leads to the bad definition.
Issue is specifically updating users when adding OpPhi instructions.
The instruction builder that adds phis doesn't keep the instruction to block mapping updated and that leads to dominator information being incorrect.
Files to reproduce problem
glsl_reduced.frag is a minimized GLSL shader. When compiled to SPIR-V with glslangValidator we get glsl_reduced.spv. This has been further reduced using spirv-reduce to spiv_reduced.spv.
Doing:
spirv-opt spirv_reduced.spv --scalar-replacement=100 --vector-dce --eliminate-local-single-block --redundancy-elimination --eliminate-dead-branches --merge-return --convert-local-access-chains --eliminate-dead-code-aggressive -o temp.spv
spirv-val temp.spv
should trigger the problem:
error: line 96: ID 95[%95] has not been defined OpBranchConditional %95 %62 %64
I did not try to reduce the spirv-opt flags, in case (as with #2450) there may be an issue both with the optimizer generating invalid code and the validator not picking this up soon enough.
Found using GraphicsFuzz