diff options
Diffstat (limited to 'source/slang/slang-ir-specialize-address-space.cpp')
| -rw-r--r-- | source/slang/slang-ir-specialize-address-space.cpp | 39 |
1 files changed, 21 insertions, 18 deletions
diff --git a/source/slang/slang-ir-specialize-address-space.cpp b/source/slang/slang-ir-specialize-address-space.cpp index 29f1ec516..c4a155eec 100644 --- a/source/slang/slang-ir-specialize-address-space.cpp +++ b/source/slang/slang-ir-specialize-address-space.cpp @@ -168,6 +168,7 @@ struct AddressSpaceContext : public AddressSpaceSpecializationContext { case kIROp_Var: case kIROp_RWStructuredBufferGetElementPtr: + case kIROp_Load: { // The address space of these insts should be assigned by the initial // address space assigner. @@ -204,16 +205,6 @@ struct AddressSpaceContext : public AddressSpaceSpecializationContext } } break; - case kIROp_Load: - { - if (auto addrSpace = - mapVarValueToAddrSpace.tryGetValue(inst->getOperand(0))) - { - mapInstToAddrSpace[inst] = *addrSpace; - changed = true; - } - } - break; case kIROp_Param: if (!isFirstBlock) { @@ -248,22 +239,24 @@ struct AddressSpaceContext : public AddressSpaceSpecializationContext if (callee) { List<AddressSpace> argAddrSpaces; - bool fullySpecialized = true; + bool hasSpecializableArg = false; for (UInt i = 0; i < callInst->getArgCount(); i++) { auto arg = callInst->getArg(i); - auto argAddrSpace = getAddrSpace(arg); argAddrSpaces.add(getAddrSpace(arg)); - if (argAddrSpace == AddressSpace::Generic && - as<IRPtrTypeBase>(arg->getDataType())) + if (as<IRPtrTypeBase>(arg->getDataType())) { - fullySpecialized = false; - break; + hasSpecializableArg = true; } } - if (!fullySpecialized) + if (!hasSpecializableArg) + { + workList.add(callee); + break; + } + // If callee doesn't have a body, don't specialize. + if (!callee->getFirstBlock()) break; - FuncSpecializationKey key(callee, argAddrSpaces); IRFunc* specializedCallee = nullptr; if (IRFunc** specializedFunc = @@ -484,4 +477,14 @@ void propagateAddressSpaceFromInsts(List<IRInst*>&& workList) } } +AddressSpace NoOpInitialAddressSpaceAssigner::getAddressSpaceFromVarType(IRInst*) +{ + return AddressSpace::Generic; +} + +AddressSpace NoOpInitialAddressSpaceAssigner::getLeafInstAddressSpace(IRInst*) +{ + return AddressSpace::Generic; +} + } // namespace Slang |
