diff options
| author | Yong He <yonghe@outlook.com> | 2024-05-08 23:05:14 -0700 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2024-05-08 23:05:14 -0700 |
| commit | 526430a0e7053b04eeb9b0c6514065a850042aaf (patch) | |
| tree | 51f760230f7bcb6b7f49a7c45708260f413a0078 /source | |
| parent | 8e86121b6ce0f2995050ebe112306ded6bc87ca2 (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.cpp | 18 |
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); |
