summaryrefslogtreecommitdiff
path: root/source/slang/slang-ir-specialize.cpp
diff options
context:
space:
mode:
Diffstat (limited to 'source/slang/slang-ir-specialize.cpp')
-rw-r--r--source/slang/slang-ir-specialize.cpp69
1 files changed, 38 insertions, 31 deletions
diff --git a/source/slang/slang-ir-specialize.cpp b/source/slang/slang-ir-specialize.cpp
index 6137a7158..8fac31a2b 100644
--- a/source/slang/slang-ir-specialize.cpp
+++ b/source/slang/slang-ir-specialize.cpp
@@ -56,11 +56,17 @@ struct SpecializationContext
SpecializationContext(IRModule* inModule, TargetProgram* target)
: workList(*inModule->getContainerPool().getList<IRInst>())
, workListSet(*inModule->getContainerPool().getHashSet<IRInst>())
- , cleanInsts(*module->getContainerPool().getHashSet<IRInst>())
+ , cleanInsts(*inModule->getContainerPool().getHashSet<IRInst>())
, module(inModule)
, targetProgram(target)
{
}
+ ~SpecializationContext()
+ {
+ module->getContainerPool().free(&workList);
+ module->getContainerPool().free(&workListSet);
+ module->getContainerPool().free(&cleanInsts);
+ }
// An instruction is then fully specialized if and only
// if it is in our set.
@@ -442,7 +448,7 @@ struct SpecializationContext
// that our args are fully specialized/concrete.
//
UCount argCount = specInst->getArgCount();
- List<IRInst*> args;
+ ShortList<IRInst*> args;
for (UIndex ii = 0; ii < argCount; ii++)
args.add(specInst->getArg(ii));
@@ -454,7 +460,7 @@ struct SpecializationContext
builder.getTypeKind(),
specDiffFunc->getBase()->getDataType(),
argCount,
- args.getBuffer());
+ args.getArrayView().getBuffer());
// Specialize the custom derivative function with the original arguments.
builder.setInsertBefore(specInst);
@@ -462,7 +468,7 @@ struct SpecializationContext
(IRType*)newDiffFuncType,
specDiffFunc->getBase(),
argCount,
- args.getBuffer());
+ args.getArrayView().getBuffer());
// Add the new spec insts to the list so they get specialized with
// the usual logic.
@@ -722,6 +728,7 @@ struct SpecializationContext
builder.setInsertInto(moduleInst);
auto dictInst = builder.emitIntrinsicInst(nullptr, dictOp, 0, nullptr);
builder.setInsertInto(dictInst);
+ List<IRInst*> args;
for (const auto& [key, value] : dict)
{
if (!value->parent)
@@ -731,10 +738,10 @@ struct SpecializationContext
if (!keyVal->parent) goto next;
}
{
- List<IRInst*> args;
+ args.clear();
args.add(value);
args.addRange(key.vals);
- builder.emitIntrinsicInst(nullptr, kIROp_SpecializationDictionaryItem, args.getCount(), args.getBuffer());
+ builder.emitIntrinsicInst(nullptr, kIROp_SpecializationDictionaryItem, (UInt)args.getCount(), args.getBuffer());
}
next:;
}
@@ -955,11 +962,11 @@ struct SpecializationContext
IRBuilder builder(module);
builder.setInsertBefore(inst);
- List<IRInst*> args;
+ ShortList<IRInst*> args;
args.add(wrapExistential->getWrappedValue());
for (UInt i = 1; i < inst->getArgCount(); i++)
args.add(inst->getArg(i));
- List<IRInst*> slotOperands;
+ ShortList<IRInst*> slotOperands;
UInt slotOperandCount = wrapExistential->getSlotOperandCount();
for (UInt ii = 0; ii < slotOperandCount; ++ii)
{
@@ -977,9 +984,9 @@ struct SpecializationContext
innerResultType = builder.getPtrType(elementType);
}
auto newCallee = getNewSpecializedBufferLoadCallee(inst->getCallee(), sbType, innerResultType);
- auto newCall = builder.emitCallInst(innerResultType, newCallee, args);
+ auto newCall = builder.emitCallInst(innerResultType, newCallee, (UInt)args.getCount(), args.getArrayView().getBuffer());
auto newWrapExistential = builder.emitWrapExistential(
- resultType, newCall, slotOperandCount, slotOperands.getBuffer());
+ resultType, newCall, slotOperandCount, slotOperands.getArrayView().getBuffer());
inst->replaceUsesWith(newWrapExistential);
workList.remove(inst);
inst->removeAndDeallocate();
@@ -1147,7 +1154,7 @@ struct SpecializationContext
// We will start by constructing the argument list for the new call.
//
argCounter = 0;
- List<IRInst*> newArgs;
+ ShortList<IRInst*> newArgs;
for (auto param : calleeFunc->getParams())
{
auto arg = inst->getArg(argCounter++);
@@ -1193,7 +1200,7 @@ struct SpecializationContext
builder->setInsertBefore(inst);
auto newCall = builder->emitCallInst(
- inst->getFullType(), specializedCallee, newArgs);
+ inst->getFullType(), specializedCallee, (UInt)newArgs.getCount(), newArgs.getArrayView().getBuffer());
// We will completely replace the old `call` instruction with the
// new one, and will go so far as to transfer any decorations
@@ -1235,6 +1242,7 @@ struct SpecializationContext
}
// Test if a type is compile time constant.
+ HashSet<IRInst*> seenTypeSet;
bool isCompileTimeConstantType(IRInst* inst)
{
// TODO: We probably need/want a more robust test here.
@@ -1243,10 +1251,11 @@ struct SpecializationContext
if (!isInstFullySpecialized(inst))
return false;
- List<IRInst*> localWorkList;
- HashSet<IRInst*> processedInsts;
+ ShortList<IRInst*> localWorkList;
+ seenTypeSet.clear();
+
localWorkList.add(inst);
- processedInsts.add(inst);
+ seenTypeSet.add(inst);
while (localWorkList.getCount() != 0)
{
@@ -1269,10 +1278,8 @@ struct SpecializationContext
for (UInt i = 0; i < curInst->getOperandCount(); ++i)
{
auto operand = curInst->getOperand(i);
- if (processedInsts.add(operand))
- {
+ if (seenTypeSet.add(operand))
localWorkList.add(operand);
- }
}
}
return true;
@@ -1375,7 +1382,7 @@ struct SpecializationContext
// the lists here because we don't yet have a basic
// block, or even a function, to insert them into.
//
- List<IRParam*> newParams;
+ ShortList<IRParam*, 16> newParams;
UInt argCounter = 0;
for (auto oldParam : oldFunc->getParams())
{
@@ -1481,14 +1488,14 @@ struct SpecializationContext
// In order to construct the type of the new function, we
// need to extract the types of all its parameters.
//
- List<IRType*> newParamTypes;
+ ShortList<IRType*> newParamTypes;
for (auto newParam : newParams)
{
newParamTypes.add(newParam->getFullType());
}
IRType* newFuncType = builder->getFuncType(
newParamTypes.getCount(),
- newParamTypes.getBuffer(),
+ newParamTypes.getArrayView().getBuffer(),
oldFunc->getResultType());
newFunc->setFullType(newFuncType);
@@ -1690,7 +1697,7 @@ struct SpecializationContext
return false;
- List<IRInst*> slotOperands;
+ ShortList<IRInst*> slotOperands;
UInt slotOperandCount = wrapInst->getSlotOperandCount();
for (UInt ii = 0; ii < slotOperandCount; ++ii)
{
@@ -1702,7 +1709,7 @@ struct SpecializationContext
resultType,
newLoadInst,
slotOperandCount,
- slotOperands.getBuffer());
+ slotOperands.getArrayView().getBuffer());
addUsersToWorkList(inst);
@@ -1823,7 +1830,7 @@ struct SpecializationContext
auto foundFieldType = foundField->getFieldType();
- List<IRInst*> slotOperands;
+ ShortList<IRInst*> slotOperands;
UInt slotOperandCount = calcExistentialBoxSlotCount(foundFieldType);
for (UInt ii = 0; ii < slotOperandCount; ++ii)
@@ -1840,7 +1847,7 @@ struct SpecializationContext
resultType,
newGetField,
slotOperandCount,
- slotOperands.getBuffer());
+ slotOperands.getArrayView().getBuffer());
addUsersToWorkList(inst);
inst->replaceUsesWith(newWrapExistentialInst);
@@ -1913,7 +1920,7 @@ struct SpecializationContext
auto foundFieldType = foundField->getFieldType();
- List<IRInst*> slotOperands;
+ ShortList<IRInst*> slotOperands;
UInt slotOperandCount = calcExistentialBoxSlotCount(foundFieldType);
for (UInt ii = 0; ii < slotOperandCount; ++ii)
@@ -1930,7 +1937,7 @@ struct SpecializationContext
resultType,
newGetFieldAddr,
slotOperandCount,
- slotOperands.getBuffer());
+ slotOperands.getArrayView().getBuffer());
addUsersToWorkList(inst);
inst->replaceUsesWith(newWrapExistentialInst);
@@ -1958,7 +1965,7 @@ struct SpecializationContext
auto elementType = cast<IRArrayTypeBase>(val->getDataType())->getElementType();
- List<IRInst*> slotOperands;
+ ShortList<IRInst*> slotOperands;
UInt slotOperandCount = wrapInst->getSlotOperandCount();
for (UInt ii = 0; ii < slotOperandCount; ++ii)
@@ -1969,7 +1976,7 @@ struct SpecializationContext
auto newGetElement = builder.emitElementExtract(elementType, val, index);
auto newWrapExistentialInst = builder.emitWrapExistential(
- resultType, newGetElement, slotOperandCount, slotOperands.getBuffer());
+ resultType, newGetElement, slotOperandCount, slotOperands.getArrayView().getBuffer());
addUsersToWorkList(inst);
inst->replaceUsesWith(newWrapExistentialInst);
@@ -1999,7 +2006,7 @@ struct SpecializationContext
IRBuilder builder(module);
builder.setInsertBefore(inst);
- List<IRInst*> slotOperands;
+ ShortList<IRInst*> slotOperands;
UInt slotOperandCount = wrapInst->getSlotOperandCount();
for (UInt ii = 0; ii < slotOperandCount; ++ii)
@@ -2011,7 +2018,7 @@ struct SpecializationContext
auto newElementAddr = builder.emitElementAddress(elementPtrType, val, index);
auto newWrapExistentialInst = builder.emitWrapExistential(
- resultType, newElementAddr, slotOperandCount, slotOperands.getBuffer());
+ resultType, newElementAddr, slotOperandCount, slotOperands.getArrayView().getBuffer());
addUsersToWorkList(inst);
inst->replaceUsesWith(newWrapExistentialInst);