summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorSai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com>2024-08-13 14:01:36 -0400
committerGitHub <noreply@github.com>2024-08-13 14:01:36 -0400
commitee052a9e9bd7c0d233816556ebe8f0078bd9ec4d (patch)
tree771d8a89357f404e296bfaf1e61117f4f9d85268 /source
parent1124407b1345706d8b01dd23cd9e44696369a296 (diff)
FIx issue with specializing witness tables (#4839)
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-ir-specialize.cpp15
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