diff options
| author | Jerran Schmidt <jerranschmidt@gmail.com> | 2025-06-17 13:49:02 +1000 |
|---|---|---|
| committer | GitHub <noreply@github.com> | 2025-06-16 20:49:02 -0700 |
| commit | 60a8f1fc3eee37977ee891661f65916f66aef364 (patch) | |
| tree | 7c6b93260a4b1b672876769717984b587965a17d /source | |
| parent | a4345725a083651c16795d27fedd769f2d7e55ae (diff) | |
Fix for missing signedness cast in SwizzleIR (#7448)
* Cast if there is a signedness mismatch on the swizzle
* Move isSignedType to slang-util and add test
---------
Co-authored-by: Yong He <yonghe@outlook.com>
Diffstat (limited to 'source')
| -rw-r--r-- | source/slang/slang-emit-spirv.cpp | 21 | ||||
| -rw-r--r-- | source/slang/slang-ir-util.cpp | 21 | ||||
| -rw-r--r-- | source/slang/slang-ir-util.h | 2 | ||||
| -rw-r--r-- | source/slang/slang-lower-to-ir.cpp | 8 |
4 files changed, 31 insertions, 21 deletions
diff --git a/source/slang/slang-emit-spirv.cpp b/source/slang/slang-emit-spirv.cpp index ec9857ecf..8e8e7327b 100644 --- a/source/slang/slang-emit-spirv.cpp +++ b/source/slang/slang-emit-spirv.cpp @@ -7763,27 +7763,6 @@ struct SPIRVEmitContext : public SourceEmitterBase, public SPIRVEmitSharedContex List<IRInst*>::makeRepeated(scalar, Index(numElems))); } - bool isSignedType(IRType* type) - { - switch (type->getOp()) - { - case kIROp_FloatType: - case kIROp_DoubleType: - return true; - case kIROp_IntType: - case kIROp_Int16Type: - case kIROp_Int64Type: - case kIROp_Int8Type: - return true; - case kIROp_VectorType: - return isSignedType(as<IRVectorType>(type)->getElementType()); - case kIROp_MatrixType: - return isSignedType(as<IRMatrixType>(type)->getElementType()); - default: - return false; - } - } - bool isFloatType(IRInst* type) { switch (type->getOp()) diff --git a/source/slang/slang-ir-util.cpp b/source/slang/slang-ir-util.cpp index 13742711c..a2ec15661 100644 --- a/source/slang/slang-ir-util.cpp +++ b/source/slang/slang-ir-util.cpp @@ -2348,4 +2348,25 @@ bool isInstHoistable(IROp op, IRType* type, IRInst* const* fixedArgs) isSpecConstOpHoistable(op, type, fixedArgs); } +bool isSignedType(IRType* type) +{ + switch (type->getOp()) + { + case kIROp_FloatType: + case kIROp_DoubleType: + return true; + case kIROp_IntType: + case kIROp_Int16Type: + case kIROp_Int64Type: + case kIROp_Int8Type: + return true; + case kIROp_VectorType: + return isSignedType(as<IRVectorType>(type)->getElementType()); + case kIROp_MatrixType: + return isSignedType(as<IRMatrixType>(type)->getElementType()); + default: + return false; + } +} + } // namespace Slang diff --git a/source/slang/slang-ir-util.h b/source/slang/slang-ir-util.h index cccec7e05..dccdf5457 100644 --- a/source/slang/slang-ir-util.h +++ b/source/slang/slang-ir-util.h @@ -417,6 +417,8 @@ constexpr bool anyOf(Range&& range, Predicate&& pred) } return false; } + +bool isSignedType(IRType* type); } // namespace Slang #endif diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp index a03c75d7d..df3507670 100644 --- a/source/slang/slang-lower-to-ir.cpp +++ b/source/slang/slang-lower-to-ir.cpp @@ -7855,6 +7855,14 @@ top: // we simply form a pointer to each of the vector // elements and write to them individually. IRInst* irRightVal = getSimpleVal(context, right); + + // If there is a mismatch between the signedness of the left and rigth values + // then emit a cast + if (isSignedType(swizzleInfo->type) != isSignedType(irRightVal->getDataType())) + { + irRightVal = builder->emitCast(swizzleInfo->type, irRightVal); + } + swizzledStore( loweredBase.val, irRightVal, |
