summaryrefslogtreecommitdiffstats
path: root/source/slang/slang-ir-lower-generics.cpp
diff options
context:
space:
mode:
authorYong He <yonghe@outlook.com>2020-11-20 08:34:14 -0800
committerGitHub <noreply@github.com>2020-11-20 08:34:14 -0800
commitee5842a01cdb2bd6cd4acee7214666f180b95d84 (patch)
treeb4c52c9ead27e71a8e4a31b871f97b800d4d4e62 /source/slang/slang-ir-lower-generics.cpp
parent4459d4428761b0581b221c52eaea595d1b257a9f (diff)
Make witness and RTTI handles lower to `uint2`. (#1613)
* Make witness and RTTI handles lower to `uint2`. And enable some dynamic dispatch tests on D3D/VK. * Bug fixes.
Diffstat (limited to 'source/slang/slang-ir-lower-generics.cpp')
-rw-r--r--source/slang/slang-ir-lower-generics.cpp17
1 files changed, 14 insertions, 3 deletions
diff --git a/source/slang/slang-ir-lower-generics.cpp b/source/slang/slang-ir-lower-generics.cpp
index 5f466c70c..9c852a3c1 100644
--- a/source/slang/slang-ir-lower-generics.cpp
+++ b/source/slang/slang-ir-lower-generics.cpp
@@ -17,6 +17,8 @@
namespace Slang
{
// Replace all uses of RTTI objects with its sequential ID.
+ // Currently we don't use RTTI objects at all, so all of them
+ // are 0.
void specializeRTTIObjectReferences(SharedGenericsLoweringContext* sharedContext)
{
uint32_t id = 0;
@@ -26,7 +28,12 @@ namespace Slang
builder.sharedBuilder = &sharedContext->sharedBuilderStorage;
builder.setInsertBefore(rtti.Value);
IRUse* nextUse = nullptr;
- auto idOperand = builder.getIntValue(builder.getUInt64Type(), id);
+ auto uint2Type = builder.getVectorType(
+ builder.getUIntType(), builder.getIntValue(builder.getIntType(), 2));
+ IRInst* uint2Args[] = {
+ builder.getIntValue(builder.getUIntType(), id),
+ builder.getIntValue(builder.getUIntType(), 0)};
+ auto idOperand = builder.emitMakeVector(uint2Type, 2, uint2Args);
for (auto use = rtti.Value->firstUse; use; use = nextUse)
{
nextUse = use->nextUse;
@@ -38,7 +45,7 @@ namespace Slang
}
}
- // Replace all WitnessTableID type or RTTIHandleType with uint64.
+ // Replace all WitnessTableID type or RTTIHandleType with `uint2`.
void cleanUpRTTIHandleTypes(SharedGenericsLoweringContext* sharedContext)
{
List<IRInst*> instsToRemove;
@@ -52,7 +59,9 @@ namespace Slang
IRBuilder builder;
builder.sharedBuilder = &sharedContext->sharedBuilderStorage;
builder.setInsertBefore(inst);
- inst->replaceUsesWith(builder.getUInt64Type());
+ auto uint2Type = builder.getVectorType(
+ builder.getUIntType(), builder.getIntValue(builder.getIntType(), 2));
+ inst->replaceUsesWith(uint2Type);
instsToRemove.add(inst);
}
break;
@@ -99,6 +108,8 @@ namespace Slang
if (sink->getErrorCount() != 0)
return;
+ sharedContext->sharedBuilderStorage.deduplicateAndRebuildGlobalNumberingMap();
+
specializeRTTIObjectReferences(sharedContext);
cleanUpRTTIHandleTypes(sharedContext);