From 9c2024a7509baae921083d49a56e1321c51f00ec Mon Sep 17 00:00:00 2001 From: Jay Kwak <82421531+jkwak-work@users.noreply.github.com> Date: Tue, 23 Sep 2025 23:47:30 -0700 Subject: Remove unnecessary Load and Store pair (#8433) This commit removes unnecessary Load and Store pairs in IR. When the IR is like ``` let %1 = var let %2 = load(%ptr) store(%1 %2) ``` This PR will replace all uses of %1 with %ptr. And the load and store instructions will be removed. But I found that there can be cases where %2 might be still used later in other IRs. For these cases, the removal of load instruction relies on DCE. --------- Co-authored-by: slangbot --- source/slang/slang-ir-transform-params-to-constref.cpp | 17 ++++------------- 1 file changed, 4 insertions(+), 13 deletions(-) (limited to 'source/slang/slang-ir-transform-params-to-constref.cpp') diff --git a/source/slang/slang-ir-transform-params-to-constref.cpp b/source/slang/slang-ir-transform-params-to-constref.cpp index 8f4bcd037..9328a1de1 100644 --- a/source/slang/slang-ir-transform-params-to-constref.cpp +++ b/source/slang/slang-ir-transform-params-to-constref.cpp @@ -60,7 +60,7 @@ struct TransformParamsToConstRefContext case kIROp_FieldExtract: { // Transform the IRFieldExtract into a IRFieldAddress - auto fieldExtract = as(use->getUser()); + auto fieldExtract = as(user); builder.setInsertBefore(fieldExtract); auto fieldAddr = builder.emitFieldAddress( fieldExtract->getBase(), @@ -73,8 +73,7 @@ struct TransformParamsToConstRefContext case kIROp_GetElement: { // Transform the IRGetElement into a IRGetElementPtr - auto getElement = as(use->getUser()); - + auto getElement = as(user); builder.setInsertBefore(getElement); auto elemAddr = builder.emitElementAddress( getElement->getBase(), @@ -111,14 +110,8 @@ struct TransformParamsToConstRefContext List newArgs; // Transform arguments to match the updated-parameter - IRParam* param = func->getFirstParam(); UInt i = 0; - auto iterate = [&]() - { - param = param->getNextParam(); - i++; - }; - for (; param; iterate()) + for (IRParam* param = func->getFirstParam(); param; param = param->getNextParam(), i++) { auto arg = call->getArg(i); if (!updatedParams.contains(param)) @@ -183,7 +176,6 @@ struct TransformParamsToConstRefContext void processFunc(IRFunc* func) { HashSet updatedParams; - bool hasTransformedParams = false; // First pass: Transform parameter types for (auto param = func->getFirstParam(); param; param = param->getNextParam()) @@ -203,13 +195,12 @@ struct TransformParamsToConstRefContext auto constRefType = builder.getConstRefType(paramType, AddressSpace::ThreadLocal); param->setFullType(constRefType); - hasTransformedParams = true; changed = true; updatedParams.add(param); } } - if (!hasTransformedParams) + if (updatedParams.getCount() == 0) { return; } -- cgit v1.2.3