summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-sccp.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2023-10-04 11:20:35 -0700
committerGitHub <noreply@github.com>2023-10-04 11:20:35 -0700
commitac886fd3e329a9599ed1ac7a6d8b26ca5821046c (patch)
tree87bcafb3985775f9d90303d6a4239eb743164407 /source/slang/slang-ir-sccp.cpp
parentd87493a46c00be37b820a473c0827bbb865eb222 (diff)
SPIRV compiler performance fixes. (#3258)
* SPIRV compiler performance fixes. * Cleanup. * update project files * Cleanup debug code. * Make redundancy removal non-recursive. --------- Co-authored-by: Yong He <yhe@nvidia.com>
Diffstat (limited to 'source/slang/slang-ir-sccp.cpp')
-rw-r--r--source/slang/slang-ir-sccp.cpp45
1 files changed, 37 insertions, 8 deletions
diff --git a/source/slang/slang-ir-sccp.cpp b/source/slang/slang-ir-sccp.cpp
index d874514fe..fc3766e63 100644
--- a/source/slang/slang-ir-sccp.cpp
+++ b/source/slang/slang-ir-sccp.cpp
@@ -720,6 +720,39 @@ struct SCCPContext
{
SLANG_SCCP_RETURN_IF_NONE_OR_ANY(v0)
auto c0 = as<IRConstant>(v0.value);
+
+ uint64_t sourceValueBits = 0;
+ switch (c0->getDataType()->getOp())
+ {
+ case kIROp_FloatType:
+ {
+ float fval = (float)c0->value.floatVal;
+ memcpy(&sourceValueBits, &fval, sizeof(fval));
+ break;
+ }
+ case kIROp_DoubleType:
+ {
+ double dval = c0->value.floatVal;
+ memcpy(&sourceValueBits, &dval, sizeof(dval));
+ break;
+ }
+ case kIROp_BoolType:
+ {
+ sourceValueBits = c0->value.intVal;
+ break;
+ }
+ default:
+ if (isIntegralType(c0->getDataType()))
+ {
+ sourceValueBits = c0->value.intVal;
+ }
+ else
+ {
+ return LatticeVal::getAny();
+ }
+ break;
+ }
+
IRInst* resultVal = nullptr;
switch (type->getOp())
{
@@ -729,7 +762,7 @@ struct SCCPContext
case kIROp_IntPtrType:
case kIROp_UIntPtrType:
#endif
- resultVal = getBuilder()->getIntValue(type, c0->value.intVal);
+ resultVal = getBuilder()->getIntValue(type, sourceValueBits);
break;
case kIROp_IntType:
case kIROp_UIntType:
@@ -737,21 +770,17 @@ struct SCCPContext
case kIROp_IntPtrType:
case kIROp_UIntPtrType:
#endif
- {
- float val = (float)c0->value.floatVal;
- uint32_t intVal = (uint32_t)FloatAsInt(val);
- resultVal = getBuilder()->getIntValue(type, intVal);
- }
+ resultVal = getBuilder()->getIntValue(type, (uint32_t)sourceValueBits);
break;
case kIROp_FloatType:
{
- uint32_t val = (uint32_t)c0->value.intVal;
+ uint32_t val = (uint32_t)sourceValueBits;
float floatVal = IntAsFloat((int)val);
resultVal = getBuilder()->getFloatValue(type, floatVal);
}
break;
case kIROp_DoubleType:
- resultVal = getBuilder()->getFloatValue(type, Int64AsDouble(c0->value.intVal));
+ resultVal = getBuilder()->getFloatValue(type, Int64AsDouble(sourceValueBits));
break;
default:
break;