summaryrefslogtreecommitdiffstats
diff options
context:
space:
mode:
authorSai Praveen Bangaru <31557731+saipraveenb25@users.noreply.github.com>2025-01-16 21:43:46 -0500
committerGitHub <noreply@github.com>2025-01-17 02:43:46 +0000
commit1b7c242bc9ebf649708836f5ed03363f5f0e3969 (patch)
treeb4b39c2dbe3664e608474b47994d4ca02613cf59
parentd3ad6bb4997d3b7ba2dc9653a2d5f7dc965b150f (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.cpp36
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