summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-specialize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-specialize.cpp')
-rw-r--r--source/slang/slang-ir-specialize.cpp18
1 files changed, 14 insertions, 4 deletions
diff --git a/source/slang/slang-ir-specialize.cpp b/source/slang/slang-ir-specialize.cpp
index 50dfa2c6a..40cd40758 100644
--- a/source/slang/slang-ir-specialize.cpp
+++ b/source/slang/slang-ir-specialize.cpp
@@ -51,15 +51,17 @@ struct SpecializationContext
IRModule* module;
DiagnosticSink* sink;
TargetProgram* targetProgram;
+ SpecializationOptions options;
bool changed = false;
- SpecializationContext(IRModule* inModule, TargetProgram* target)
+ SpecializationContext(IRModule* inModule, TargetProgram* target, SpecializationOptions options)
: workList(*inModule->getContainerPool().getList<IRInst>())
, workListSet(*inModule->getContainerPool().getHashSet<IRInst>())
, cleanInsts(*inModule->getContainerPool().getHashSet<IRInst>())
, module(inModule)
, targetProgram(target)
+ , options(options)
{
}
~SpecializationContext()
@@ -1102,7 +1104,11 @@ struct SpecializationContext
// Now we consider lower lookupWitnessMethod insts into dynamic dispatch calls,
// which may open up more specialization opportunities.
//
- iterChanged = lowerWitnessLookup(module, sink);
+ if (options.lowerWitnessLookups)
+ {
+ iterChanged = lowerWitnessLookup(module, sink);
+ }
+
if (!iterChanged || sink->getErrorCount())
break;
}
@@ -2882,10 +2888,14 @@ struct SpecializationContext
}
};
-bool specializeModule(TargetProgram* target, IRModule* module, DiagnosticSink* sink)
+bool specializeModule(
+ TargetProgram* target,
+ IRModule* module,
+ DiagnosticSink* sink,
+ SpecializationOptions options)
{
SLANG_PROFILE;
- SpecializationContext context(module, target);
+ SpecializationContext context(module, target, options);
context.sink = sink;
context.processModule();
return context.changed;