summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
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