summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-sccp.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-sccp.cpp')
-rw-r--r--source/slang/slang-ir-sccp.cpp32
1 files changed, 27 insertions, 5 deletions
diff --git a/source/slang/slang-ir-sccp.cpp b/source/slang/slang-ir-sccp.cpp
index c03eee695..e60d2576f 100644
--- a/source/slang/slang-ir-sccp.cpp
+++ b/source/slang/slang-ir-sccp.cpp
@@ -15,7 +15,7 @@ namespace Slang {
struct SharedSCCPContext
{
IRModule* module;
- SharedIRBuilder sharedBuilder;
+ SharedIRBuilder* sharedBuilder;
};
//
// Next we have a context struct that will be applied for each function (or other
@@ -1663,8 +1663,10 @@ bool applySparseConditionalConstantPropagation(
{
SharedSCCPContext shared;
shared.module = module;
- shared.sharedBuilder.init(module);
- shared.sharedBuilder.deduplicateAndRebuildGlobalNumberingMap();
+ SharedIRBuilder sharedBuilderStorage;
+ shared.sharedBuilder = &sharedBuilderStorage;
+ sharedBuilderStorage.init(module);
+ sharedBuilderStorage.deduplicateAndRebuildGlobalNumberingMap();
// First we fold constants at global scope.
SCCPContext globalContext;
@@ -1683,8 +1685,10 @@ bool applySparseConditionalConstantPropagation(IRInst* func)
{
SharedSCCPContext shared;
shared.module = func->getModule();
- shared.sharedBuilder.init(shared.module);
- shared.sharedBuilder.deduplicateAndRebuildGlobalNumberingMap();
+ SharedIRBuilder sharedBuilderStorage;
+ shared.sharedBuilder = &sharedBuilderStorage;
+ sharedBuilderStorage.init(shared.module);
+ sharedBuilderStorage.deduplicateAndRebuildGlobalNumberingMap();
SCCPContext globalContext;
globalContext.shared = &shared;
@@ -1694,5 +1698,23 @@ bool applySparseConditionalConstantPropagation(IRInst* func)
return applySparseConditionalConstantPropagationRec(globalContext, func);
}
+IRInst* tryConstantFoldInst(SharedIRBuilder* sharedBuilder, IRInst* inst)
+{
+ SharedSCCPContext shared;
+ shared.module = inst->getModule();
+ shared.sharedBuilder = sharedBuilder;
+ SCCPContext instContext;
+ instContext.shared = &shared;
+ instContext.code = nullptr;
+ instContext.builderStorage.init(sharedBuilder);
+ auto foldResult = instContext.interpretOverLattice(inst);
+ if (!foldResult.value)
+ {
+ return inst;
+ }
+ inst->replaceUsesWith(foldResult.value);
+ return foldResult.value;
+}
+
}