-
Notifications
You must be signed in to change notification settings - Fork 15.1k
[DirectX] Differentiate between 0/1 overloads in the OpBuilder. NFC #104246
New issue
Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.
By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.
Already on GitHub? Sign in to your account
[DirectX] Differentiate between 0/1 overloads in the OpBuilder. NFC #104246
Conversation
Created using spr 1.3.5-bogner [skip ci]
Created using spr 1.3.5-bogner
|
@llvm/pr-subscribers-backend-directx Author: Justin Bogner (bogner) ChangesDXIL operations that only have one signature behave one of two ways - either Update DXIL.td for operations that have one overload and remove the hack in the Full diff: https://github.com/llvm/llvm-project/pull/104246.diff 2 Files Affected:
diff --git a/llvm/lib/Target/DirectX/DXIL.td b/llvm/lib/Target/DirectX/DXIL.td
index 67015cff78a79..60185c20606b2 100644
--- a/llvm/lib/Target/DirectX/DXIL.td
+++ b/llvm/lib/Target/DirectX/DXIL.td
@@ -671,8 +671,9 @@ def Dot4 : DXILOp<56, dot4> {
def ThreadId : DXILOp<93, threadId> {
let Doc = "Reads the thread ID";
let LLVMIntrinsic = int_dx_thread_id;
- let arguments = [i32Ty];
- let result = i32Ty;
+ let arguments = [overloadTy];
+ let result = overloadTy;
+ let overloads = [Overloads<DXIL1_0, [i32Ty]>];
let stages = [Stages<DXIL1_0, [compute, mesh, amplification, node]>];
let attributes = [Attributes<DXIL1_0, [ReadNone]>];
}
@@ -680,8 +681,9 @@ def ThreadId : DXILOp<93, threadId> {
def GroupId : DXILOp<94, groupId> {
let Doc = "Reads the group ID (SV_GroupID)";
let LLVMIntrinsic = int_dx_group_id;
- let arguments = [i32Ty];
- let result = i32Ty;
+ let arguments = [overloadTy];
+ let result = overloadTy;
+ let overloads = [Overloads<DXIL1_0, [i32Ty]>];
let stages = [Stages<DXIL1_0, [compute, mesh, amplification, node]>];
let attributes = [Attributes<DXIL1_0, [ReadNone]>];
}
@@ -689,8 +691,9 @@ def GroupId : DXILOp<94, groupId> {
def ThreadIdInGroup : DXILOp<95, threadIdInGroup> {
let Doc = "Reads the thread ID within the group (SV_GroupThreadID)";
let LLVMIntrinsic = int_dx_thread_id_in_group;
- let arguments = [i32Ty];
- let result = i32Ty;
+ let arguments = [overloadTy];
+ let result = overloadTy;
+ let overloads = [Overloads<DXIL1_0, [i32Ty]>];
let stages = [Stages<DXIL1_0, [compute, mesh, amplification, node]>];
let attributes = [Attributes<DXIL1_0, [ReadNone]>];
}
@@ -699,7 +702,8 @@ def FlattenedThreadIdInGroup : DXILOp<96, flattenedThreadIdInGroup> {
let Doc = "Provides a flattened index for a given thread within a given "
"group (SV_GroupIndex)";
let LLVMIntrinsic = int_dx_flattened_thread_id_in_group;
- let result = i32Ty;
+ let result = overloadTy;
+ let overloads = [Overloads<DXIL1_0, [i32Ty]>];
let stages = [Stages<DXIL1_0, [compute, mesh, amplification, node]>];
let attributes = [Attributes<DXIL1_0, [ReadNone]>];
}
diff --git a/llvm/lib/Target/DirectX/DXILOpBuilder.cpp b/llvm/lib/Target/DirectX/DXILOpBuilder.cpp
index 91e6931b3f788..0e2b4601112b5 100644
--- a/llvm/lib/Target/DirectX/DXILOpBuilder.cpp
+++ b/llvm/lib/Target/DirectX/DXILOpBuilder.cpp
@@ -87,6 +87,9 @@ static const char *getOverloadTypeName(OverloadKind Kind) {
}
static OverloadKind getOverloadKind(Type *Ty) {
+ if (!Ty)
+ return OverloadKind::VOID;
+
Type::TypeID T = Ty->getTypeID();
switch (T) {
case Type::VoidTyID:
@@ -379,11 +382,7 @@ Expected<CallInst *> DXILOpBuilder::tryCreateOp(dxil::OpCode OpCode,
uint16_t ValidTyMask = Prop->Overloads[*OlIndexOrErr].ValidTys;
- // If we don't have an overload type, use the function's return type. This is
- // a bit of a hack, but it's necessary to get the type suffix on unoverloaded
- // DXIL ops correct, like `dx.op.threadId.i32`.
- OverloadKind Kind =
- getOverloadKind(OverloadTy ? OverloadTy : DXILOpFT->getReturnType());
+ OverloadKind Kind = getOverloadKind(OverloadTy);
// Check if the operation supports overload types and OverloadTy is valid
// per the specified types for the operation
|
DXIL operations that only have one signature behave one of two ways - either they are always suffixed with a type like `dx.op.ThreadId.i32` and hence have exactly one overload, or they're never suffixed like `dx.op.CreateHandle` and hence have zero overloads. Update DXIL.td for operations that have one overload and remove the hack in the builder that was adjusting names for unoverloaded ops. Pull Request: llvm#104246
Created using spr 1.3.5-bogner
DXIL operations that only have one signature behave one of two ways - either
they are always suffixed with a type like
dx.op.ThreadId.i32and hence haveexactly one overload, or they're never suffixed like
dx.op.CreateHandleandhence have zero overloads.
Update DXIL.td for operations that have one overload and remove the hack in the
builder that was adjusting names for unoverloaded ops.