diff options
Diffstat (limited to 'source/slang/slang-ir-sccp.cpp')
| -rw-r--r-- | source/slang/slang-ir-sccp.cpp | 32 |
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; +} + } |
