diff options
| author | Sai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com> | 2025-01-16 21:43:46 -0500 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-01-17 02:43:46 +0000 |
| commit | 1b7c242bc9ebf649708836f5ed03363f5f0e3969 (patch) | |
| tree | b4b39c2dbe3664e608474b47994d4ca02613cf59 | |
| parent | d3ad6bb4997d3b7ba2dc9653a2d5f7dc965b150f (diff) | |
Fix resource specialization issue where store insts from inlined calls are not considered properly. (#6099)
* Fix resource specialization issue where stores from inlined calls are not considered.
* Format
| -rw-r--r-- | source/slang/slang-ir-specialize-resources.cpp | 36 |
1 files changed, 28 insertions, 8 deletions
diff --git a/source/slang/slang-ir-specialize-resources.cpp b/source/slang/slang-ir-specialize-resources.cpp index 22cd9cb3f..2aafaaf31 100644 --- a/source/slang/slang-ir-specialize-resources.cpp +++ b/source/slang/slang-ir-specialize-resources.cpp @@ -910,6 +910,10 @@ struct ResourceOutputSpecializationPass // SpecializeFuncResult recursiveSpecializationResult = SpecializeFuncResult::Ok; List<IRStore*> stores; + + // We'll first specialize any relevant calls that may affect the value stored into the + // param. This may create more stores into the param. + // traverseUses( param, [&](IRUse* use) @@ -917,14 +921,6 @@ struct ResourceOutputSpecializationPass auto user = use->getUser(); switch (user->getOp()) { - case kIROp_Store: - { - auto store = as<IRStore>(user); - if (store->ptr.get() != param) - return; - stores.add(store); - return; - } case kIROp_Call: { // This call may require an inline if it fails to specialize @@ -942,9 +938,33 @@ struct ResourceOutputSpecializationPass return; }; }); + + // If any call specialization fails, we may need to revisit this function at a later + // iteration. if (failedResult(recursiveSpecializationResult)) return recursiveSpecializationResult; + // Then, traverse all stores into this param. + traverseUses( + param, + [&](IRUse* use) + { + auto user = use->getUser(); + switch (user->getOp()) + { + case kIROp_Store: + { + auto store = as<IRStore>(user); + if (store->ptr.get() != param) + return; + stores.add(store); + return; + } + default: + return; + }; + }); + // Having identified the places where a value is stored to // the output parameter, we iterate over those values to // ensure that they are all specializable and consistent |
