From 526430a0e7053b04eeb9b0c6514065a850042aaf Mon Sep 17 00:00:00 2001 From: Yong He Date: Wed, 8 May 2024 23:05:14 -0700 Subject: Support `getAddress` of a single-element vector swizzle. (#4138) Fixes #4112. --- source/slang/slang-lower-to-ir.cpp | 18 +++++++++++++++++- 1 file changed, 17 insertions(+), 1 deletion(-) (limited to 'source') diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index 0d666306b..429660cac 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -2516,7 +2516,15 @@ void addArg( // pass in the actual pointer. // IRInst* argPtr = getAddress(context, argVal, loc); - addInArg(context, ioArgs, LoweredValInfo::simple(argPtr)); + if (argPtr) + addInArg(context, ioArgs, LoweredValInfo::simple(argPtr)); + else + { + // If arg can't be converted to a pointer, we have already + // reported an error, so just pass a null pointer to allow + // the remaining lowering steps to finish. + addInArg(context, ioArgs, LoweredValInfo::simple(context->irBuilder->getNullVoidPtrValue())); + } } break; @@ -6741,6 +6749,14 @@ LoweredValInfo tryGetAddress( UInt elementCount = originalSwizzleInfo->elementCount; auto newBase = tryGetAddress(context, originalBase, TryGetAddressMode::Aggressive); + if (newBase.flavor == LoweredValInfo::Flavor::Ptr && elementCount == 1) + { + // A special case is when we have a single element swizzle, + // we can just emit an element address. + auto elementPtr = context->irBuilder->emitElementAddress(newBase.val, originalSwizzleInfo->elementIndices[0]); + return LoweredValInfo::ptr(elementPtr); + } + RefPtr newSwizzleInfo = new SwizzledLValueInfo(); context->shared->extValues.add(newSwizzleInfo); -- cgit v1.2.3