From 2e1a84add57efd9f8a50a88d0569a48ae4b6d834 Mon Sep 17 00:00:00 2001 From: Yong He Date: Fri, 18 Mar 2022 09:35:23 -0700 Subject: Fix type truncation during SCCP. (#2163) --- source/slang/slang-ir.cpp | 42 ++++++++++++++++++++++++++++++++++++++++-- 1 file changed, 40 insertions(+), 2 deletions(-) (limited to 'source/slang/slang-ir.cpp') diff --git a/source/slang/slang-ir.cpp b/source/slang/slang-ir.cpp index 721488f82..bb1b0a9d2 100644 --- a/source/slang/slang-ir.cpp +++ b/source/slang/slang-ir.cpp @@ -2081,7 +2081,32 @@ namespace Slang memset(&keyInst, 0, sizeof(keyInst)); keyInst.m_op = kIROp_IntLit; keyInst.typeUse.usedValue = type; - keyInst.value.intVal = inValue; + // Truncate the input value based on `type`. + switch (type->getOp()) + { + case kIROp_Int8Type: + keyInst.value.intVal = static_cast(inValue); + break; + case kIROp_Int16Type: + keyInst.value.intVal = static_cast(inValue); + break; + case kIROp_IntType: + keyInst.value.intVal = static_cast(inValue); + break; + case kIROp_UInt8Type: + keyInst.value.intVal = static_cast(inValue); + break; + case kIROp_UInt16Type: + keyInst.value.intVal = static_cast(inValue); + break; + case kIROp_BoolType: + case kIROp_UIntType: + keyInst.value.intVal = static_cast(inValue); + break; + default: + keyInst.value.intVal = inValue; + break; + } return _findOrEmitConstant(keyInst); } @@ -2091,7 +2116,20 @@ namespace Slang memset(&keyInst, 0, sizeof(keyInst)); keyInst.m_op = kIROp_FloatLit; keyInst.typeUse.usedValue = type; - keyInst.value.floatVal = inValue; + // Truncate the input value based on `type`. + switch (type->getOp()) + { + case kIROp_FloatType: + keyInst.value.floatVal = static_cast(inValue); + break; + case kIROp_HalfType: + keyInst.value.floatVal = HalfToFloat(FloatToHalf((float)inValue)); + break; + default: + keyInst.value.floatVal = inValue; + break; + } + return _findOrEmitConstant(keyInst); } -- cgit v1.2.3