From dc3f2d65848837afaf528beefc305534a29540c8 Mon Sep 17 00:00:00 2001 From: ArielG-NV <159081215+ArielG-NV@users.noreply.github.com> Date: Wed, 4 Sep 2024 19:57:06 -0400 Subject: [PATCH] Fix resource specialization with `-embed-dxil` (#4990) * Fix resource specialization with `-embed-dxil` fixes: #4989 Changes: 1. Before handing off to DCE an `oldFunc` which should be removed, clean up any leftover `IRKeepAliveDecoration` (else DCE won't remove our `oldFunc`s) --- source/slang/slang-ir-specialize-resources.cpp | 11 ++++++++++- .../library/precompiled-module-library-resource.slang | 5 +++++ 2 files changed, 15 insertions(+), 1 deletion(-) diff --git a/source/slang/slang-ir-specialize-resources.cpp b/source/slang/slang-ir-specialize-resources.cpp index 5e15098d42..90e3f99a0c 100644 --- a/source/slang/slang-ir-specialize-resources.cpp +++ b/source/slang/slang-ir-specialize-resources.cpp @@ -248,7 +248,11 @@ struct ResourceOutputSpecializationPass newFunc->removeAndDeallocate(); // Check if `oldFunc` is the reason for failing, // Otherwise don't add to 'unspecializableFuncs' - if(result == SpecializeFuncResult::ThisFuncFailed) + // + // Ensure oldFunc has uses, else, there is nothing to specialize here. + // If oldFunc has IRKeepAlive, this code should be assumed to have a + // "dynamic" resource value. + if(result == SpecializeFuncResult::ThisFuncFailed && oldFunc->hasUses()) unspecializableFuncs->add(oldFunc); return false; } @@ -315,6 +319,11 @@ struct ResourceOutputSpecializationPass specializeCallSite(oldCall, newFunc, funcInfo); } specializedFuncs.add(oldFunc); + + // Since we can no longer fail and we are replacing all `Func` uses, 'KeepAlive' + // can be removed from the oldFunc so DCE can it clean-up. + if(auto keepAliveDecoration = oldFunc->findDecoration()) + keepAliveDecoration->removeAndDeallocate(); return true; } diff --git a/tests/library/precompiled-module-library-resource.slang b/tests/library/precompiled-module-library-resource.slang index 79c3daaa10..3eeab39d83 100644 --- a/tests/library/precompiled-module-library-resource.slang +++ b/tests/library/precompiled-module-library-resource.slang @@ -9,6 +9,11 @@ module "precompiled-module-library-resource"; public struct ResourceStruct { public StructuredBuffer buffer; + + __init(StructuredBuffer bufferIn) + { + buffer = bufferIn; + } }; public int resource_in_parameter(StructuredBuffer buffer)