summaryrefslogtreecommitdiff
path: root/source/slang/slang-lower-to-ir.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-lower-to-ir.cpp')
-rw-r--r--source/slang/slang-lower-to-ir.cpp49
1 files changed, 12 insertions, 37 deletions
diff --git a/source/slang/slang-lower-to-ir.cpp b/source/slang/slang-lower-to-ir.cpp
index af285f221..f8946f5dc 100644
--- a/source/slang/slang-lower-to-ir.cpp
+++ b/source/slang/slang-lower-to-ir.cpp
@@ -1552,17 +1552,6 @@ static bool _isTrivialLookupFromInterfaceThis(IRGenContext* context, DeclRefBase
return context->thisTypeWitness == nullptr;
}
-
-//
-static void maybePropagateRate(IRBuilder* builder, IRType* rateQulifiedType, IRInst* inst)
-{
- if (isSpecConstRateType(rateQulifiedType))
- {
- inst->setFullType(
- builder->getRateQualifiedType(builder->getSpecConstRate(), inst->getFullType()));
- }
-}
-
struct ValLoweringVisitor : ValVisitor<ValLoweringVisitor, LoweredValInfo, LoweredValInfo>
{
IRGenContext* context;
@@ -1596,14 +1585,12 @@ struct ValLoweringVisitor : ValVisitor<ValLoweringVisitor, LoweredValInfo, Lower
specConstRateType = loweredArg.val->getFullType();
}
auto funcType = lowerType(context, val->getFuncType());
- auto resVal = emitCallToDeclRef(
- context,
- as<IRFuncType>(funcType)->getResultType(),
- val->getFuncDeclRef(),
- funcType,
- args,
- tryEnv);
- maybePropagateRate(getBuilder(), specConstRateType, resVal.val);
+ auto funcResType = maybeAddRateType(
+ getBuilder(),
+ specConstRateType,
+ as<IRFuncType>(funcType)->getResultType());
+ auto resVal =
+ emitCallToDeclRef(context, funcResType, val->getFuncDeclRef(), funcType, args, tryEnv);
return resVal;
}
@@ -1613,8 +1600,8 @@ struct ValLoweringVisitor : ValVisitor<ValLoweringVisitor, LoweredValInfo, Lower
SLANG_ASSERT(baseVal.flavor == LoweredValInfo::Flavor::Simple);
auto type = lowerType(context, val->getType());
+ type = maybeAddRateType(getBuilder(), baseVal.val->getFullType(), type);
auto resVal = LoweredValInfo::simple(getBuilder()->emitCast(type, baseVal.val));
- maybePropagateRate(getBuilder(), baseVal.val->getFullType(), resVal.val);
return resVal;
}
@@ -1641,12 +1628,10 @@ struct ValLoweringVisitor : ValVisitor<ValLoweringVisitor, LoweredValInfo, Lower
auto factorVal = lowerVal(context, factor->getParam()).val;
for (IntegerLiteralValue i = 0; i < factor->getPower(); i++)
{
- termVal = irBuilder->emitMul(factorVal->getDataType(), termVal, factorVal);
+ termVal = irBuilder->emitMul(factorVal->getFullType(), termVal, factorVal);
}
- maybePropagateRate(getBuilder(), factorVal->getFullType(), termVal);
}
- resultVal = irBuilder->emitAdd(termVal->getDataType(), resultVal, termVal);
- maybePropagateRate(getBuilder(), termVal->getFullType(), resultVal);
+ resultVal = irBuilder->emitAdd(termVal->getFullType(), resultVal, termVal);
}
return LoweredValInfo::simple(resultVal);
}
@@ -2076,19 +2061,9 @@ struct ValLoweringVisitor : ValVisitor<ValLoweringVisitor, LoweredValInfo, Lower
auto elementType = lowerType(context, type->getElementType());
if (!type->isUnsized())
{
- IRInst* elementCount = nullptr;
- auto sizeVal = type->getElementCount();
- auto sharedContext = context->shared;
- if (!sharedContext->mapSpecConstValToIRInst.tryGetValue(sizeVal, elementCount))
- {
- elementCount = lowerSimpleVal(context, sizeVal);
- if (isSpecConstRateType(elementCount->getFullType()))
- {
- sharedContext->mapSpecConstValToIRInst.add(sizeVal, elementCount);
- hoistInstAndOperandsToGlobal(getBuilder(), elementCount);
- }
- }
- return getBuilder()->getArrayType(elementType, elementCount);
+ return getBuilder()->getArrayType(
+ elementType,
+ lowerSimpleVal(context, type->getElementCount()));
}
else
{