From 1f3334d35832a253213cfd953b9df6cd892a5e51 Mon Sep 17 00:00:00 2001 From: baldurk Date: Wed, 15 Jul 2026 11:01:31 +0100 Subject: [PATCH] Fix loops not printing breaks in SPIR-V disassembly * If the end of the loop exits it's a redundant goto but similar to switches we still want the break --- renderdoc/driver/shaders/spirv/spirv_disassemble.cpp | 7 +++++-- 1 file changed, 5 insertions(+), 2 deletions(-) diff --git a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp index 53d1021f6..600b890b4 100644 --- a/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp +++ b/renderdoc/driver/shaders/spirv/spirv_disassemble.cpp @@ -1077,9 +1077,9 @@ rdcstr Reflector::Disassemble(const rdcstr &entryPoint, if(decodedlabelId == decoded.targetLabel) { // however if we're in a switch we might want to print a clarifying fallthrough comment - // or end-of-case break + // or end-of-case break, and in a loop we could need a break - if(!cfgStack.empty() && cfgStack.back().type == StructuredCFG::Switch) + if(!cfgStack.empty() && cfgStack.back().type != StructuredCFG::If) { // add a break even for the final branch to the merge block if(cfgStack.back().mergeTarget == decoded.targetLabel) @@ -1088,7 +1088,10 @@ rdcstr Reflector::Disassemble(const rdcstr &entryPoint, lineNum++; continue; } + } + if(!cfgStack.empty() && cfgStack.back().type == StructuredCFG::Switch) + { // if we're falling through to the next case, print a comment for(const SwitchPairU64LiteralId &caseTarget : cfgStack.back().caseTargets) {