summaryrefslogtreecommitdiffstats
path: root/source
diff options
context:
space:
mode:
authorJerran Schmidt <jerranschmidt@gmail.com>2025-06-17 13:49:02 +1000
committerGitHub <noreply@github.com>2025-06-16 20:49:02 -0700
commit60a8f1fc3eee37977ee891661f65916f66aef364 (patch)
tree7c6b93260a4b1b672876769717984b587965a17d /source
parenta4345725a083651c16795d27fedd769f2d7e55ae (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.cpp21
-rw-r--r--source/slang/slang-ir-util.cpp21
-rw-r--r--source/slang/slang-ir-util.h2
-rw-r--r--source/slang/slang-lower-to-ir.cpp8
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,