KhronosGroup / SPIRV-Tools

Apache License 2.0
1.04k stars 545 forks source link

spirv-opt generates code that spirv-val rejects: ID ... has not been defined #2455

Closed afd closed 5 years ago

afd commented 5 years ago

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

alan-baker commented 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.

alan-baker commented 5 years ago

Issue is specifically updating users when adding OpPhi instructions.

alan-baker commented 5 years ago

The instruction builder that adds phis doesn't keep the instruction to block mapping updated and that leads to dominator information being incorrect.