diff options
| author | Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> | 2024-08-13 14:01:36 -0400 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-08-13 14:01:36 -0400 |
| commit | ee052a9e9bd7c0d233816556ebe8f0078bd9ec4d (patch) | |
| tree | 771d8a89357f404e296bfaf1e61117f4f9d85268 /source/slang | |
| parent | 1124407b1345706d8b01dd23cd9e44696369a296 (diff) | |
FIx issue with specializing witness tables (#4839)
Diffstat (limited to 'source/slang')
| -rw-r--r-- | source/slang/slang-ir-specialize.cpp | 15 |
1 files changed, 14 insertions, 1 deletions
diff --git a/source/slang/slang-ir-specialize.cpp b/source/slang/slang-ir-specialize.cpp index 5c9e1ad24..c86906b2d 100644 --- a/source/slang/slang-ir-specialize.cpp +++ b/source/slang/slang-ir-specialize.cpp @@ -131,6 +131,15 @@ struct SpecializationContext return false; } + // Check if an inst is a dynamic dispatch witness table. + // These insts may not have any uses yet, and do not have side effects, + // but should be specialized if necessary. + // + bool isWitnessTableType(IRInst* inst) + { + return inst->findDecoration<IRDynamicDispatchWitnessDecoration>(); + } + // When an instruction isn't fully specialized, but its operands *are* // then it is a candidate for specialization itself, so we will have // a query to check for the "all operands fully specialized" case. @@ -826,8 +835,12 @@ struct SpecializationContext // specialization opportunities (generic specialization, // existential specialization, simplifications, etc.) // - if (inst->hasUses() || inst->mightHaveSideEffects()) + if (inst->hasUses() || + inst->mightHaveSideEffects() || + isWitnessTableType(inst)) + { hasSpecialization |= maybeSpecializeInst(inst); + } // Finally, we need to make our logic recurse through // the whole IR module, so we want to add the children |
