Skip to content

Commit 76d83e6

Browse files
authored
[SPIRV] Correctly map OpGenericCastToPtrExplicit builtins (#137189)
The __spirv_GenericCastToPtrExplicit_To* builtins and its equivalent OpenCL builtins (to_global, to_local and to_private) were mapped to OpGenericCastToPtr instead of OpGenericCastToPtrExplicit. The patch now uses OpGenericCastToPtrExplicit for these builtins.
1 parent 0cd2053 commit 76d83e6

File tree

7 files changed

+63
-40
lines changed

7 files changed

+63
-40
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 24 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -1656,10 +1656,29 @@ static bool generateBarrierInst(const SPIRV::IncomingCall *Call,
16561656
}
16571657

16581658
static bool generateCastToPtrInst(const SPIRV::IncomingCall *Call,
1659-
MachineIRBuilder &MIRBuilder) {
1660-
MIRBuilder.buildInstr(TargetOpcode::G_ADDRSPACE_CAST)
1661-
.addDef(Call->ReturnRegister)
1662-
.addUse(Call->Arguments[0]);
1659+
MachineIRBuilder &MIRBuilder,
1660+
SPIRVGlobalRegistry *GR) {
1661+
// Lookup the instruction opcode in the TableGen records.
1662+
const SPIRV::DemangledBuiltin *Builtin = Call->Builtin;
1663+
unsigned Opcode =
1664+
SPIRV::lookupNativeBuiltin(Builtin->Name, Builtin->Set)->Opcode;
1665+
1666+
if (Opcode == SPIRV::OpGenericCastToPtrExplicit) {
1667+
SPIRV::StorageClass::StorageClass ResSC =
1668+
GR->getPointerStorageClass(Call->ReturnRegister);
1669+
if (!isGenericCastablePtr(ResSC))
1670+
return false;
1671+
1672+
MIRBuilder.buildInstr(Opcode)
1673+
.addDef(Call->ReturnRegister)
1674+
.addUse(GR->getSPIRVTypeID(Call->ReturnType))
1675+
.addUse(Call->Arguments[0])
1676+
.addImm(ResSC);
1677+
} else {
1678+
MIRBuilder.buildInstr(TargetOpcode::G_ADDRSPACE_CAST)
1679+
.addDef(Call->ReturnRegister)
1680+
.addUse(Call->Arguments[0]);
1681+
}
16631682
return true;
16641683
}
16651684

@@ -2833,7 +2852,7 @@ std::optional<bool> lowerBuiltin(const StringRef DemangledCall,
28332852
case SPIRV::Barrier:
28342853
return generateBarrierInst(Call.get(), MIRBuilder, GR);
28352854
case SPIRV::CastToPtr:
2836-
return generateCastToPtrInst(Call.get(), MIRBuilder);
2855+
return generateCastToPtrInst(Call.get(), MIRBuilder, GR);
28372856
case SPIRV::Dot:
28382857
case SPIRV::IntegerDot:
28392858
return generateDotOrFMulInst(DemangledCall, Call.get(), MIRBuilder, GR);

llvm/lib/Target/SPIRV/SPIRVBuiltins.td

Lines changed: 6 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -687,15 +687,15 @@ defm : DemangledNativeBuiltin<"__spirv_Load", OpenCL_std, LoadStore, 1, 3, OpLoa
687687
defm : DemangledNativeBuiltin<"__spirv_Store", OpenCL_std, LoadStore, 2, 4, OpStore>;
688688

689689
// Address Space Qualifier Functions/Pointers Conversion Instructions:
690-
defm : DemangledNativeBuiltin<"to_global", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtr>;
691-
defm : DemangledNativeBuiltin<"to_local", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtr>;
692-
defm : DemangledNativeBuiltin<"to_private", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtr>;
690+
defm : DemangledNativeBuiltin<"to_global", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
691+
defm : DemangledNativeBuiltin<"to_local", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
692+
defm : DemangledNativeBuiltin<"to_private", OpenCL_std, CastToPtr, 1, 1, OpGenericCastToPtrExplicit>;
693693
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToGlobal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
694694
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToLocal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
695695
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtr_ToPrivate", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
696-
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToGlobal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
697-
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToLocal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
698-
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToPrivate", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtr>;
696+
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToGlobal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtrExplicit>;
697+
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToLocal", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtrExplicit>;
698+
defm : DemangledNativeBuiltin<"__spirv_GenericCastToPtrExplicit_ToPrivate", OpenCL_std, CastToPtr, 2, 2, OpGenericCastToPtrExplicit>;
699699

700700
// Cooperative Matrix builtin records:
701701
defm : DemangledNativeBuiltin<"__spirv_CooperativeMatrixLoadKHR", OpenCL_std, CoopMatr, 2, 4, OpCooperativeMatrixLoadKHR>;

llvm/lib/Target/SPIRV/SPIRVISelLowering.cpp

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -390,6 +390,7 @@ void SPIRVTargetLowering::finalizeLowering(MachineFunction &MF) const {
390390
break;
391391
case SPIRV::OpPtrCastToGeneric:
392392
case SPIRV::OpGenericCastToPtr:
393+
case SPIRV::OpGenericCastToPtrExplicit:
393394
validateAccessChain(STI, MRI, GR, MI);
394395
break;
395396
case SPIRV::OpPtrAccessChain:

llvm/lib/Target/SPIRV/SPIRVInstructionSelector.cpp

Lines changed: 0 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -1552,17 +1552,6 @@ bool SPIRVInstructionSelector::selectAtomicCmpXchg(Register ResVReg,
15521552
.constrainAllUses(TII, TRI, RBI);
15531553
}
15541554

1555-
static bool isGenericCastablePtr(SPIRV::StorageClass::StorageClass SC) {
1556-
switch (SC) {
1557-
case SPIRV::StorageClass::Workgroup:
1558-
case SPIRV::StorageClass::CrossWorkgroup:
1559-
case SPIRV::StorageClass::Function:
1560-
return true;
1561-
default:
1562-
return false;
1563-
}
1564-
}
1565-
15661555
static bool isUSMStorageClass(SPIRV::StorageClass::StorageClass SC) {
15671556
switch (SC) {
15681557
case SPIRV::StorageClass::DeviceOnlyINTEL:

llvm/lib/Target/SPIRV/SPIRVSymbolicOperands.td

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1683,6 +1683,7 @@ defm InBoundsAccessChain : OpcodeOperand<66>;
16831683
defm InBoundsPtrAccessChain : OpcodeOperand<70>;
16841684
defm PtrCastToGeneric : OpcodeOperand<121>;
16851685
defm GenericCastToPtr : OpcodeOperand<122>;
1686+
defm GenericCastToPtrExplicit : OpcodeOperand<123>;
16861687
defm Bitcast : OpcodeOperand<124>;
16871688
defm ConvertPtrToU : OpcodeOperand<117>;
16881689
defm ConvertUToPtr : OpcodeOperand<120>;

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 13 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -167,6 +167,19 @@ MachineBasicBlock::iterator getOpVariableMBBIt(MachineInstr &I);
167167
// terminators and debug instructions.
168168
MachineBasicBlock::iterator getInsertPtValidEnd(MachineBasicBlock *MBB);
169169

170+
// Returns true if a pointer to the storage class can be casted to/from a
171+
// pointer to the Generic storage class.
172+
constexpr bool isGenericCastablePtr(SPIRV::StorageClass::StorageClass SC) {
173+
switch (SC) {
174+
case SPIRV::StorageClass::Workgroup:
175+
case SPIRV::StorageClass::CrossWorkgroup:
176+
case SPIRV::StorageClass::Function:
177+
return true;
178+
default:
179+
return false;
180+
}
181+
}
182+
170183
// Convert a SPIR-V storage class to the corresponding LLVM IR address space.
171184
// TODO: maybe the following two functions should be handled in the subtarget
172185
// to allow for different OpenCL vs Vulkan handling.

llvm/test/CodeGen/SPIRV/transcoding/OpGenericCastToPtr.ll

Lines changed: 18 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -24,9 +24,9 @@
2424
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#GlobalIntPtr]]
2525
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#LocalCharPtr]]
2626
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#PrivateIntPtr]]
27-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#GlobalIntPtr]]
28-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#LocalCharPtr]]
29-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#PrivateIntPtr]]
27+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#GlobalIntPtr]] %{{.*}} CrossWorkgroup
28+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#LocalCharPtr]] %{{.*}} Workgroup
29+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#PrivateIntPtr]] %{{.*}} Function
3030
; CHECK-SPIRV: OpFunctionEnd
3131

3232
define spir_kernel void @test1(ptr addrspace(1) %_arg_GlobalA, ptr byval(%id) %_arg_GlobalId, ptr addrspace(3) %_arg_LocalA) {
@@ -52,9 +52,9 @@ entry:
5252
; CHECK-SPIRV: OpPtrCastToGeneric %[[#GenericIntPtr]]
5353
; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericCharPtr]]
5454
; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericIntPtr]]
55-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#GlobalIntPtr]]
56-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#LocalCharPtr]]
57-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#PrivateIntPtr]]
55+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#GlobalIntPtr]] %{{.*}} CrossWorkgroup
56+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#LocalCharPtr]] %{{.*}} Workgroup
57+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#PrivateIntPtr]] %{{.*}} Function
5858
; CHECK-SPIRV: OpFunctionEnd
5959

6060
define spir_kernel void @test2(ptr addrspace(1) %_arg_GlobalA, ptr byval(%id) %_arg_GlobalId, ptr addrspace(3) %_arg_LocalA) {
@@ -93,18 +93,9 @@ declare spir_func ptr @_Z10to_privatePv(ptr addrspace(4))
9393
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#GlobalIntPtr]]
9494
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#LocalCharPtr]]
9595
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#PrivateIntPtr]]
96-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#GlobalIntPtr]]
97-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#LocalCharPtr]]
98-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#PrivateIntPtr]]
99-
; CHECK-SPIRV: OpFunctionEnd
100-
101-
; CHECK-SPIRV: OpFunction
102-
; CHECK-SPIRV: OpPtrCastToGeneric %[[#GenericIntPtr]]
103-
; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericCharPtr]]
104-
; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericIntPtr]]
105-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#GlobalIntPtr]]
106-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#LocalCharPtr]]
107-
; CHECK-SPIRV-NEXT: OpGenericCastToPtr %[[#PrivateIntPtr]]
96+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#GlobalIntPtr]] %{{.*}} CrossWorkgroup
97+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#LocalCharPtr]] %{{.*}} Workgroup
98+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#PrivateIntPtr]] %{{.*}} Function
10899
; CHECK-SPIRV: OpFunctionEnd
109100

110101
define spir_kernel void @test3(ptr addrspace(1) %_arg_GlobalA, ptr byval(%id) %_arg_GlobalId, ptr addrspace(3) %_arg_LocalA) {
@@ -126,6 +117,15 @@ entry:
126117
ret void
127118
}
128119

120+
; CHECK-SPIRV: OpFunction
121+
; CHECK-SPIRV: OpPtrCastToGeneric %[[#GenericIntPtr]]
122+
; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericCharPtr]]
123+
; CHECK-SPIRV-NEXT: OpPtrCastToGeneric %[[#GenericIntPtr]]
124+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#GlobalIntPtr]] %{{.*}} CrossWorkgroup
125+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#LocalCharPtr]] %{{.*}} Workgroup
126+
; CHECK-SPIRV-NEXT: OpGenericCastToPtrExplicit %[[#PrivateIntPtr]] %{{.*}} Function
127+
; CHECK-SPIRV: OpFunctionEnd
128+
129129
define spir_kernel void @test4(ptr addrspace(1) %_arg_GlobalA, ptr byval(%id) %_arg_GlobalId, ptr addrspace(3) %_arg_LocalA) {
130130
entry:
131131
%var = alloca i32

0 commit comments

Comments
 (0)