Add DebugBuildIdentifier to the live worklist during initialization#6618
Add DebugBuildIdentifier to the live worklist during initialization#6618jkwak-work wants to merge 0 commit into
Conversation
|
I am not able to make a simple repro SPIRV for this issue. As far as I can tell the problem is on the fact that the constant variable used for DebugBuildIdentifier is not recognized and it causes an assertion failure as following: This issue was observed only with an option, If I can somehow make a simpler repro case later, I will share it to have it as a regression test. |
|
I found a small repro Spirv Code for the issue. Fixes #6619 |
|
@SteveUrquhart , can you give me a review for this? |
|
I'll take a look at it, thanks. |
|
I think the change itself is clearly the right thing to do. It would be best if your repro was part of the commit, you can add it as a case to https://github.com/KhronosGroup/SPIRV-Tools/blob/main/test/opt/aggressive_dead_code_elim_test.cpp. You can CHECK for the presence of DebugBuildIdentifier, as well as verify that the output is valid. |
|
I had to close this PR and reopen a new PR: |
DebugBuildIdentifier was missing from the set of NonSemantic debug instructions added to the worklist in InitializeModuleScopeLiveInstructions.
Instead it was handled in ProcessGlobalValues (after the worklist is
exhausted) using live_insts_.Set() on its direct operands.
live_insts_.Set() marks an instruction live but does not enqueue it, so transitive operand dependencies are never visited. In shaders where the only use of a type (e.g. OpTypeInt) is through a constant that is itself only referenced by DebugBuildIdentifier's flags argument, the type instruction is not marked live and is incorrectly killed by ADCE.
The surviving constant then references a deleted type, producing invalid SPIR-V. Any subsequent pass that rebuilds the DefUseManager (e.g. CCP) will fail with "Definition is not registered."
Fix: include NonSemanticShaderDebugInfo100DebugBuildIdentifier in the worklist loop alongside the other always-live debug instructions. The worklist's transitive closure correctly marks all operand dependencies live before global-value cleanup runs. The existing special-case code in ProcessGlobalValues becomes unreachable for this opcode (IsLive returns true, so the early continue fires) and is now dead; it is left in place for safety.