summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2024-05-08 23:05:14 -0700
committerGitHub <noreply@github.com>2024-05-08 23:05:14 -0700
commit526430a0e7053b04eeb9b0c6514065a850042aaf (patch)
tree51f760230f7bcb6b7f49a7c45708260f413a0078 /source
parent8e86121b6ce0f2995050ebe112306ded6bc87ca2 (diff)
Support `getAddress` of a single-element vector swizzle. (#4138)
Fixes #4112.
Diffstat (limited to 'source')
-rw-r--r--source/slang/slang-lower-to-ir.cpp18
1 files changed, 17 insertions, 1 deletions
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<SwizzledLValueInfo> newSwizzleInfo = new SwizzledLValueInfo();
context->shared->extValues.add(newSwizzleInfo);