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: 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 ++++++++++- 1 file changed, 10 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/slang/slang-ir-specialize-resources.cpp b/source/slang/slang-ir-specialize-resources.cpp index 5e15098d4..90e3f99a0 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; } -- cgit v1.2.3