Skip to content

Commit 9017026

Browse files
vmaksimojsji
authored andcommitted
Refactor handling of untyped pointers in builtins reverse translation (#2924)
This fixes the mangling in enqueue_kernel.cl test. Without the fix we get such mangled function: @_Z21__spirv_EnqueueKernelP13__spirv_QueueiPciPU3AS4P19__spirv_DeviceEventS5_U13block_pointerFvvEPU3AS4cii instead of the expected: @_Z21__spirv_EnqueueKernelP13__spirv_Queuei9ndrange_tiPU3AS4P19__spirv_DeviceEventS5_U13block_pointerFvvEPU3AS4cii Original commit: KhronosGroup/SPIRV-LLVM-Translator@6675e28ce8621cd
1 parent 2df19d4 commit 9017026

File tree

2 files changed

+82
-40
lines changed

2 files changed

+82
-40
lines changed

llvm-spirv/lib/SPIRV/SPIRVReader.cpp

Lines changed: 58 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -3556,40 +3556,65 @@ Instruction *SPIRVToLLVM::transBuiltinFromInst(const std::string &FuncName,
35563556
transType(AI->getSemanticType()),
35573557
SPIRSPIRVAddrSpaceMap::rmap(
35583558
BI->getValueType(Ops[Ptr]->getId())->getPointerStorageClass()));
3559-
} else if (OC == spv::OpCooperativeMatrixStoreKHR ||
3560-
OC == spv::internal::OpJointMatrixStoreINTEL ||
3561-
OC == spv::internal::OpCooperativeMatrixStoreCheckedINTEL ||
3562-
OC == spv::internal::OpJointMatrixLoadINTEL ||
3563-
OC == spv::OpCompositeConstruct ||
3564-
OC == spv::internal::OpCooperativeMatrixApplyFunctionINTEL) {
3565-
auto *Val = transValue(Ops[Ptr], BB->getParent(), BB);
3566-
Val = Val->stripPointerCasts();
3567-
if (auto *GEP = dyn_cast<GetElementPtrInst>(Val))
3568-
ArgTys[Ptr] = TypedPointerType::get(
3569-
GEP->getSourceElementType(),
3570-
SPIRSPIRVAddrSpaceMap::rmap(
3571-
BI->getValueType(Ops[Ptr]->getId())->getPointerStorageClass()));
3572-
else if (auto *AI = dyn_cast<AllocaInst>(Val))
3573-
ArgTys[Ptr] = TypedPointerType::get(
3574-
AI->getAllocatedType(),
3575-
SPIRSPIRVAddrSpaceMap::rmap(
3576-
BI->getValueType(Ops[Ptr]->getId())->getPointerStorageClass()));
3577-
else if (isa<Argument>(Val) && !RetTy->isVoidTy()) {
3578-
// Pointer could be a function parameter. Assume that the type of the
3579-
// pointer is the same as the return type.
3580-
Type *Ty = nullptr;
3581-
// it return type is array type, assign its element type to Ty
3582-
if (RetTy->isArrayTy())
3583-
Ty = RetTy->getArrayElementType();
3584-
else if (RetTy->isVectorTy())
3585-
Ty = cast<VectorType>(RetTy)->getElementType();
3586-
else
3587-
Ty = RetTy;
3559+
}
3560+
}
35883561

3589-
ArgTys[Ptr] = TypedPointerType::get(
3590-
Ty,
3591-
SPIRSPIRVAddrSpaceMap::rmap(
3592-
BI->getValueType(Ops[Ptr]->getId())->getPointerStorageClass()));
3562+
for (unsigned I = 0; I < ArgTys.size(); I++) {
3563+
if (isa<PointerType>(ArgTys[I])) {
3564+
SPIRVType *OpTy = BI->getValueType(Ops[I]->getId());
3565+
// `Param` must be a pointer to an 8-bit integer type scalar.
3566+
// Avoid demangling for this argument if it's a pointer to get `Pc`
3567+
// mangling.
3568+
if (OC == OpEnqueueKernel && I == 7) {
3569+
if (ArgTys[I]->isPointerTy())
3570+
continue;
3571+
}
3572+
if (OpTy->isTypeUntypedPointerKHR()) {
3573+
auto *Val = transValue(Ops[I], BB->getParent(), BB);
3574+
Val = Val->stripPointerCasts();
3575+
if (isUntypedAccessChainOpCode(Ops[I]->getOpCode())) {
3576+
SPIRVType *BaseTy =
3577+
reinterpret_cast<SPIRVAccessChainBase *>(Ops[I])->getBaseType();
3578+
3579+
Type *Ty = nullptr;
3580+
if (BaseTy->isTypeArray())
3581+
Ty = transType(BaseTy->getArrayElementType());
3582+
else if (BaseTy->isTypeVector())
3583+
Ty = transType(BaseTy->getVectorComponentType());
3584+
else
3585+
Ty = transType(BaseTy);
3586+
ArgTys[I] = TypedPointerType::get(
3587+
Ty, SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3588+
} else if (auto *GEP = dyn_cast<GetElementPtrInst>(Val)) {
3589+
ArgTys[I] = TypedPointerType::get(
3590+
GEP->getSourceElementType(),
3591+
SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3592+
} else if (Ops[I]->getOpCode() == OpUntypedVariableKHR) {
3593+
SPIRVUntypedVariableKHR *UV =
3594+
static_cast<SPIRVUntypedVariableKHR *>(Ops[I]);
3595+
Type *Ty = transType(UV->getDataType());
3596+
ArgTys[I] = TypedPointerType::get(
3597+
Ty, SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3598+
} else if (auto *AI = dyn_cast<AllocaInst>(Val)) {
3599+
ArgTys[I] = TypedPointerType::get(
3600+
AI->getAllocatedType(),
3601+
SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3602+
} else if (Ops[I]->getOpCode() == OpFunctionParameter &&
3603+
!RetTy->isVoidTy()) {
3604+
// Pointer could be a function parameter. Assume that the type of
3605+
// the pointer is the same as the return type.
3606+
Type *Ty = nullptr;
3607+
// it return type is array type, assign its element type to Ty
3608+
if (RetTy->isArrayTy())
3609+
Ty = RetTy->getArrayElementType();
3610+
else if (RetTy->isVectorTy())
3611+
Ty = cast<VectorType>(RetTy)->getElementType();
3612+
else
3613+
Ty = RetTy;
3614+
3615+
ArgTys[I] = TypedPointerType::get(
3616+
Ty, SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3617+
}
35933618
}
35943619
}
35953620
}

llvm-spirv/test/transcoding/enqueue_kernel.cl

Lines changed: 24 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
// RUN: %clang_cc1 -triple spir-unknown-unknown -O0 -cl-std=CL2.0 -emit-llvm-bc %s -o %t.bc
22
// RUN: llvm-spirv %t.bc -spirv-text -o %t.spv.txt
3-
// RUN: FileCheck < %t.spv.txt %s --check-prefix=CHECK-SPIRV
3+
// RUN: FileCheck < %t.spv.txt %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-TYPED-PTR
44
// RUN: llvm-spirv %t.bc -o %t.spv
55
// RUN: spirv-val %t.spv
66
// RUN: llvm-spirv -r %t.spv --spirv-target-env CL2.0 -o %t.rev.bc
@@ -10,6 +10,17 @@
1010
// RUN: llvm-dis %t.rev.bc
1111
// RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-SPV-IR
1212

13+
// RUN: llvm-spirv %t.bc -spirv-text -o %t.spv.txt --spirv-ext=+SPV_KHR_untyped_pointers
14+
// RUN: FileCheck < %t.spv.txt %s --check-prefixes=CHECK-SPIRV,CHECK-SPIRV-UNTYPED-PTR
15+
// RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_KHR_untyped_pointers
16+
// RUN: spirv-val %t.spv
17+
// RUN: llvm-spirv -r %t.spv --spirv-target-env CL2.0 -o %t.rev.bc
18+
// RUN: llvm-dis %t.rev.bc
19+
// RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
20+
// RUN: llvm-spirv -r %t.spv --spirv-target-env SPV-IR -o %t.rev.bc
21+
// RUN: llvm-dis %t.rev.bc
22+
// RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-SPV-IR
23+
1324
// CHECK-SPIRV: EntryPoint {{[0-9]+}} [[BlockKer1:[0-9]+]] "__device_side_enqueue_block_invoke_kernel"
1425
// CHECK-SPIRV: EntryPoint {{[0-9]+}} [[BlockKer2:[0-9]+]] "__device_side_enqueue_block_invoke_2_kernel"
1526
// CHECK-SPIRV: EntryPoint {{[0-9]+}} [[BlockKer3:[0-9]+]] "__device_side_enqueue_block_invoke_3_kernel"
@@ -32,9 +43,11 @@
3243
// CHECK-SPIRV: Constant [[Int32Ty]] [[ConstInt8:[0-9]+]] 8
3344
// CHECK-SPIRV: Constant [[Int32Ty]] [[ConstInt20:[0-9]+]] 24
3445

35-
// CHECK-SPIRV: TypePointer [[Int8PtrGenTy:[0-9]+]] 8 [[Int8Ty]]
46+
// CHECK-SPIRV-TYPED-PTR: TypePointer [[Int8PtrGenTy:[0-9]+]] 8 [[Int8Ty]]
47+
// CHECK-SPIRV-UNTYPED-PTR: TypeUntypedPointerKHR [[Int8PtrGenTy:[0-9]+]] 8
3648
// CHECK-SPIRV: TypeVoid [[VoidTy:[0-9]+]]
37-
// CHECK-SPIRV: TypePointer [[Int32LocPtrTy:[0-9]+]] 7 [[Int32Ty]]
49+
// CHECK-SPIRV-TYPED-PTR: TypePointer [[Int32LocPtrTy:[0-9]+]] 7 [[Int32Ty]]
50+
// CHECK-SPIRV-UNTYPED-PTR: TypeUntypedPointerKHR [[Int32LocPtrTy:[0-9]+]] 7
3851
// CHECK-SPIRV: TypeDeviceEvent [[EventTy:[0-9]+]]
3952
// CHECK-SPIRV: TypePointer [[EventPtrTy:[0-9]+]] 8 [[EventTy]]
4053
// CHECK-SPIRV: TypeFunction [[BlockTy1:[0-9]+]] [[VoidTy]] [[Int8PtrGenTy]]
@@ -101,7 +114,8 @@ kernel void device_side_enqueue(global int *a, global int *b, int i, char c0) {
101114
// Emits global block literal and block kernel.
102115
// CHECK-SPIRV: PtrCastToGeneric [[EventPtrTy]] [[Event1:[0-9]+]]
103116
// CHECK-SPIRV: PtrCastToGeneric [[EventPtrTy]] [[Event2:[0-9]+]]
104-
// CHECK-SPIRV-COUNT-2: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf31:[0-9]+]]
117+
// CHECK-SPIRV-TYPED-PTR-COUNT-2: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf31:[0-9]+]]
118+
// CHECK-SPIRV-UNTYPED-PTR-COUNT-2: UntypedPtrAccessChainKHR [[Int32LocPtrTy]] [[LocalBuf31:[0-9]+]]
105119
// CHECK-SPIRV: PtrCastToGeneric {{[0-9]+}} [[BlockLit3Tmp:[0-9]+]] [[BlockGlb1:[0-9]+]]
106120
// CHECK-SPIRV: Bitcast [[Int8PtrGenTy]] [[BlockLit3:[0-9]+]] [[BlockLit3Tmp]]
107121
// CHECK-SPIRV: EnqueueKernel [[Int32Ty]] [[#]] [[#]] [[#]] [[#]]
@@ -122,9 +136,12 @@ kernel void device_side_enqueue(global int *a, global int *b, int i, char c0) {
122136

123137
// Emits global block literal and block kernel.
124138

125-
// CHECK-SPIRV-COUNT-4: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf41:[0-9]+]]
126-
// CHECK-SPIRV: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf42:[0-9]+]]
127-
// CHECK-SPIRV: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf43:[0-9]+]]
139+
// CHECK-SPIRV-TYPED-PTR-COUNT-4: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf41:[0-9]+]]
140+
// CHECK-SPIRV-TYPED-PTR: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf42:[0-9]+]]
141+
// CHECK-SPIRV-TYPED-PTR: PtrAccessChain [[Int32LocPtrTy]] [[LocalBuf43:[0-9]+]]
142+
// CHECK-SPIRV-UNTYPED-PTR-COUNT-4: UntypedPtrAccessChainKHR [[Int32LocPtrTy]] [[LocalBuf41:[0-9]+]]
143+
// CHECK-SPIRV-UNTYPED-PTR: UntypedPtrAccessChainKHR [[Int32LocPtrTy]] [[LocalBuf42:[0-9]+]]
144+
// CHECK-SPIRV-UNTYPED-PTR: UntypedPtrAccessChainKHR [[Int32LocPtrTy]] [[LocalBuf43:[0-9]+]]
128145
// CHECK-SPIRV: PtrCastToGeneric {{[0-9]+}} [[BlockLit4Tmp:[0-9]+]] [[BlockGlb2:[0-9]+]]
129146
// CHECK-SPIRV: Bitcast [[Int8PtrGenTy]] [[BlockLit4:[0-9]+]] [[BlockLit4Tmp]]
130147
// CHECK-SPIRV: EnqueueKernel [[Int32Ty]] [[#]] [[#]] [[#]] [[#]]

0 commit comments

Comments
 (0)