diff options
Diffstat (limited to 'source/slang/slang-ir-spirv-legalize.cpp')
| -rw-r--r-- | source/slang/slang-ir-spirv-legalize.cpp | 18 |
1 files changed, 6 insertions, 12 deletions
diff --git a/source/slang/slang-ir-spirv-legalize.cpp b/source/slang/slang-ir-spirv-legalize.cpp index 965d6dc9b..97649f4ad 100644 --- a/source/slang/slang-ir-spirv-legalize.cpp +++ b/source/slang/slang-ir-spirv-legalize.cpp @@ -184,13 +184,7 @@ struct SPIRVLegalizationContext : public SourceEmitterBase // OrderedHashSet<IRInst*> workList; - void addToWorkList(IRInst* inst) - { - if (workList.add(inst)) - { - addUsersToWorkList(inst); - } - } + void addToWorkList(IRInst* inst) { workList.add(inst); } void addUsersToWorkList(IRInst* inst) { @@ -1692,8 +1686,6 @@ struct SPIRVLegalizationContext : public SourceEmitterBase } }; - void processBranch(IRInst* branch) { addToWorkList(branch->getOperand(0)); } - void processPtrLit(IRInst* inst) { IRBuilder builder(inst); @@ -1844,9 +1836,11 @@ struct SPIRVLegalizationContext : public SourceEmitterBase case kIROp_PtrLit: processPtrLit(inst); break; - case kIROp_UnconditionalBranch: - processBranch(inst); - break; + // kIROp_UnconditionalBranch is handled in default case that only + // adds children inst and not target inst to work list. + // Branch target should be added to work list via its parent, + // to avoid cycle when branch target block has branch to the block + // that's parent of this branch inst. case kIROp_SPIRVAsm: processSPIRVAsm(as<IRSPIRVAsm>(inst)); break; |
