Skip to content

Commit 2334e18

Browse files
committed
Merge branch 'main' of https://github.com/KhronosGroup/SPIRV-LLVM-Translator into amd-develop
2 parents 66eff05 + 333f956 commit 2334e18

File tree

7 files changed

+375
-71
lines changed

7 files changed

+375
-71
lines changed

lib/SPIRV/SPIRVReader.cpp

Lines changed: 104 additions & 71 deletions
Original file line numberDiff line numberDiff line change
@@ -2467,13 +2467,18 @@ SPIRVLifetimeStart *LTStart = static_cast<SPIRVLifetimeStart *>(BV);
24672467
BaseSPVTy->isTypeCooperativeMatrixKHR())) {
24682468
return mapValue(BV, transSPIRVBuiltinFromInst(AC, BB));
24692469
}
2470-
Type *BaseTy =
2471-
BaseSPVTy->isTypeVector()
2472-
? transType(
2473-
BaseSPVTy->getVectorComponentType()->getPointerElementType())
2474-
: BaseSPVTy->isTypePointer()
2475-
? transType(BaseSPVTy->getPointerElementType())
2476-
: transType(BaseSPVTy);
2470+
Type *BaseTy = nullptr;
2471+
if (BaseSPVTy->isTypeVector()) {
2472+
auto *VecCompTy = BaseSPVTy->getVectorComponentType();
2473+
if (VecCompTy->isTypePointer())
2474+
BaseTy = transType(VecCompTy->getPointerElementType());
2475+
else
2476+
BaseTy = transType(VecCompTy);
2477+
} else if (BaseSPVTy->isTypePointer()) {
2478+
BaseTy = transType(BaseSPVTy->getPointerElementType());
2479+
} else {
2480+
BaseTy = transType(BaseSPVTy);
2481+
}
24772482
auto Index = transValue(AC->getIndices(), F, BB);
24782483
if (!AC->hasPtrIndex())
24792484
Index.insert(Index.begin(), getInt32(M, 0));
@@ -3793,20 +3798,20 @@ Instruction *SPIRVToLLVM::transBuiltinFromInst(const std::string &FuncName,
37933798
std::vector<Type *> ArgTys =
37943799
transTypeVector(SPIRVInstruction::getOperandTypes(Ops), true);
37953800

3796-
auto Ptr = findFirstPtrType(ArgTys);
3797-
if (Ptr < ArgTys.size() &&
3798-
BI->getValueType(Ops[Ptr]->getId())->isTypeUntypedPointerKHR()) {
3801+
unsigned PtrIdx = findFirstPtrType(ArgTys);
3802+
if (PtrIdx < ArgTys.size() &&
3803+
BI->getValueType(Ops[PtrIdx]->getId())->isTypeUntypedPointerKHR()) {
37993804
// Special handling for "truly" untyped pointers to preserve correct
38003805
// builtin mangling of atomic and matrix operations.
38013806
if (isAtomicOpCodeUntypedPtrSupported(OC)) {
38023807
auto *AI = static_cast<SPIRVAtomicInstBase *>(BI);
3803-
ArgTys[Ptr] = TypedPointerType::get(
3808+
ArgTys[PtrIdx] = TypedPointerType::get(
38043809
transType(AI->getSemanticType()),
38053810
M->getTargetTriple().getVendor() == Triple::VendorType::AMD
38063811
? mapSPIRVAddrSpaceToAMDGPU(
3807-
BI->getValueType(Ops[Ptr]->getId())->getPointerStorageClass())
3812+
BI->getValueType(Ops[PtrIdx]->getId())->getPointerStorageClass())
38083813
: SPIRSPIRVAddrSpaceMap::rmap(
3809-
BI->getValueType(Ops[Ptr]->getId())->getPointerStorageClass()));
3814+
BI->getValueType(Ops[PtrIdx]->getId())->getPointerStorageClass()));
38103815
}
38113816
}
38123817

@@ -3821,51 +3826,8 @@ Instruction *SPIRVToLLVM::transBuiltinFromInst(const std::string &FuncName,
38213826
continue;
38223827
}
38233828
if (OpTy->isTypeUntypedPointerKHR()) {
3824-
auto *Val = transValue(Ops[I], BB->getParent(), BB);
3825-
Val = Val->stripPointerCasts();
3826-
if (isUntypedAccessChainOpCode(Ops[I]->getOpCode())) {
3827-
SPIRVType *BaseTy =
3828-
reinterpret_cast<SPIRVAccessChainBase *>(Ops[I])->getBaseType();
3829-
3830-
Type *Ty = nullptr;
3831-
if (BaseTy->isTypeArray())
3832-
Ty = transType(BaseTy->getArrayElementType());
3833-
else if (BaseTy->isTypeVector())
3834-
Ty = transType(BaseTy->getVectorComponentType());
3835-
else
3836-
Ty = transType(BaseTy);
3837-
ArgTys[I] = TypedPointerType::get(
3838-
Ty, SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3839-
} else if (auto *GEP = dyn_cast<GetElementPtrInst>(Val)) {
3840-
ArgTys[I] = TypedPointerType::get(
3841-
GEP->getSourceElementType(),
3842-
SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3843-
} else if (Ops[I]->getOpCode() == OpUntypedVariableKHR) {
3844-
SPIRVUntypedVariableKHR *UV =
3845-
static_cast<SPIRVUntypedVariableKHR *>(Ops[I]);
3846-
Type *Ty = transType(UV->getDataType());
3847-
ArgTys[I] = TypedPointerType::get(
3848-
Ty, SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3849-
} else if (auto *AI = dyn_cast<AllocaInst>(Val)) {
3850-
ArgTys[I] = TypedPointerType::get(
3851-
AI->getAllocatedType(),
3852-
SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3853-
} else if (Ops[I]->getOpCode() == OpFunctionParameter &&
3854-
!RetTy->isVoidTy()) {
3855-
// Pointer could be a function parameter. Assume that the type of
3856-
// the pointer is the same as the return type.
3857-
Type *Ty = nullptr;
3858-
// it return type is array type, assign its element type to Ty
3859-
if (RetTy->isArrayTy())
3860-
Ty = RetTy->getArrayElementType();
3861-
else if (RetTy->isVectorTy())
3862-
Ty = cast<VectorType>(RetTy)->getElementType();
3863-
else
3864-
Ty = RetTy;
3865-
3866-
ArgTys[I] = TypedPointerType::get(
3867-
Ty, SPIRSPIRVAddrSpaceMap::rmap(OpTy->getPointerStorageClass()));
3868-
}
3829+
if (Type *NewPtrTy = getTypedPtrFromUntypedOperand(Ops[I], RetTy))
3830+
ArgTys[I] = NewPtrTy;
38693831
}
38703832
}
38713833
}
@@ -3956,6 +3918,58 @@ SPIRVToLLVM::SPIRVToLLVM(Module *LLVMModule, SPIRVModule *TheSPIRVModule)
39563918
DbgTran.reset(new SPIRVToLLVMDbgTran(TheSPIRVModule, LLVMModule, this));
39573919
}
39583920

3921+
Type *SPIRVToLLVM::getTypedPtrFromUntypedOperand(SPIRVValue *Val, Type *RetTy) {
3922+
Type *Ty = nullptr;
3923+
Op OC = Val->getOpCode();
3924+
if (isUntypedAccessChainOpCode(OC)) {
3925+
SPIRVType *BaseTy =
3926+
reinterpret_cast<SPIRVAccessChainBase *>(Val)->getBaseType();
3927+
if (BaseTy->isTypeArray())
3928+
Ty = transType(BaseTy->getArrayElementType());
3929+
else if (BaseTy->isTypeVector())
3930+
Ty = transType(BaseTy->getVectorComponentType());
3931+
else
3932+
Ty = transType(BaseTy);
3933+
} else if (OC == OpUntypedVariableKHR) {
3934+
auto *UV = static_cast<SPIRVUntypedVariableKHR *>(Val);
3935+
Ty = transType(UV->getDataType());
3936+
} else if (OC == OpFunctionParameter && !RetTy->isVoidTy()) {
3937+
// Pointer could be a function parameter. Assume that the type of
3938+
// the pointer is the same as the return type.
3939+
// If return type is array/vector type, assign its element type to Ty.
3940+
if (RetTy->isArrayTy())
3941+
Ty = RetTy->getArrayElementType();
3942+
else if (RetTy->isVectorTy())
3943+
Ty = cast<VectorType>(RetTy)->getElementType();
3944+
else
3945+
Ty = RetTy;
3946+
}
3947+
3948+
StorageClass SC = Val->getType()->getPointerStorageClass();
3949+
unsigned AddrSpace =
3950+
(M->getTargetTriple().getVendor() == Triple::VendorType::AMD)
3951+
? mapSPIRVAddrSpaceToAMDGPU(SC) : SPIRSPIRVAddrSpaceMap::rmap(SC);
3952+
3953+
if (Ty)
3954+
return TypedPointerType::get(Ty, AddrSpace);
3955+
3956+
// If we couldn't infer a better element type, attempt to derive from an
3957+
// already translated LLVM value (GEP, Alloca, etc.).
3958+
if (Value *V = getTranslatedValue(Val)) {
3959+
V = V->stripPointerCasts();
3960+
if (auto *GEP = dyn_cast<GetElementPtrInst>(V))
3961+
Ty = GEP->getSourceElementType();
3962+
else if (auto *AI = dyn_cast<AllocaInst>(V))
3963+
Ty = AI->getAllocatedType();
3964+
}
3965+
3966+
if (Ty)
3967+
return TypedPointerType::get(Ty, AddrSpace);
3968+
if (!RetTy->isVoidTy())
3969+
return TypedPointerType::get(RetTy, AddrSpace);
3970+
return nullptr;
3971+
}
3972+
39593973
std::string getSPIRVFuncSuffix(SPIRVInstruction *BI) {
39603974
std::string Suffix = "";
39613975
if (BI->getOpCode() == OpCreatePipeFromPipeStorage) {
@@ -5701,25 +5715,44 @@ Instruction *SPIRVToLLVM::transOCLBuiltinFromExtInst(SPIRVExtInst *BC,
57015715
assert(BM->getBuiltinSet(BC->getExtSetId()) == SPIRVEIS_OpenCL &&
57025716
"Not OpenCL extended instruction");
57035717

5718+
Type *RetTy = transType(BC->getType());
57045719
std::vector<Type *> ArgTypes = transTypeVector(BC->getArgTypes(), true);
5705-
for (unsigned I = 0; I < ArgTypes.size(); I++) {
5706-
// Special handling for "truly" untyped pointers to preserve correct OCL
5707-
// bultin mangling.
5708-
if (isa<PointerType>(ArgTypes[I]) &&
5709-
BC->getArgValue(I)->isUntypedVariable()) {
5710-
auto *BVar = static_cast<SPIRVUntypedVariableKHR *>(BC->getArgValue(I));
5711-
ArgTypes[I] = TypedPointerType::get(
5712-
transType(BVar->getDataType()),
5713-
(M->getTargetTriple().getVendor() == Triple::VendorType::AMD)
5714-
? mapSPIRVAddrSpaceToAMDGPU(BVar->getStorageClass())
5715-
: SPIRSPIRVAddrSpaceMap::rmap(BVar->getStorageClass()));
5720+
// Special handling for "truly" untyped pointers to preserve correct
5721+
// OCL builtin mangling.
5722+
unsigned PtrIdx = findFirstPtrType(ArgTypes);
5723+
if (PtrIdx < ArgTypes.size() &&
5724+
BC->getArgValue(PtrIdx)->getType()->isTypeUntypedPointerKHR()) {
5725+
switch (ExtOp) {
5726+
case OpenCLLIB::Frexp:
5727+
case OpenCLLIB::Remquo:
5728+
case OpenCLLIB::Lgamma_r: {
5729+
// These builtins require their pointer arguments to point to i32 or
5730+
// vector of i32 values.
5731+
Type *DataType = Type::getInt32Ty(*Context);
5732+
if (RetTy->isVectorTy())
5733+
DataType = VectorType::get(DataType,
5734+
cast<VectorType>(RetTy)->getElementCount());
5735+
ArgTypes[PtrIdx] = TypedPointerType::get(
5736+
DataType, cast<PointerType>(ArgTypes[PtrIdx])->getAddressSpace());
5737+
} break;
5738+
case OpenCLLIB::Printf: {
5739+
// Printf's format argument type is always i8*.
5740+
ArgTypes[PtrIdx] = TypedPointerType::get(
5741+
Type::getInt8Ty(*Context),
5742+
cast<PointerType>(ArgTypes[PtrIdx])->getAddressSpace());
5743+
} break;
5744+
default: {
5745+
Type *NewPtrTy =
5746+
getTypedPtrFromUntypedOperand(BC->getArgValue(PtrIdx), RetTy);
5747+
if (NewPtrTy)
5748+
ArgTypes[PtrIdx] = NewPtrTy;
5749+
}
57165750
}
57175751
}
5718-
5719-
Type *RetTy = transType(BC->getType());
57205752
if (M->getTargetTriple().getVendor() == Triple::VendorType::AMD)
57215753
return transLLVMFromExtInst(
57225754
*this, ExtOp, BC, RetTy, std::move(ArgTypes), BB);
5755+
57235756
std::string MangledName =
57245757
getSPIRVFriendlyIRFunctionName(ExtOp, ArgTypes, RetTy);
57255758
opaquifyTypedPointers(ArgTypes);

lib/SPIRV/SPIRVReader.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -90,6 +90,11 @@ class SPIRVToLLVM : private BuiltinCallHelper {
9090
std::string transTypeToOCLTypeName(SPIRVType *BT, bool IsSigned = true);
9191
std::vector<Type *> transTypeVector(const std::vector<SPIRVType *> &,
9292
bool UseTypedPointerTypes = false);
93+
// Build a typed LLVM pointer type for a SPIR-V untyped pointer operand by
94+
// inferring an element LLVM type from the operand's SPIR-V value or from
95+
// translated LLVM value. Returns nullptr if no element type can be found.
96+
// This is needed to preserve correct mangling for builtins.
97+
Type *getTypedPtrFromUntypedOperand(SPIRVValue *Op, Type *RetTy);
9398
bool translate();
9499
bool transAddressingModel();
95100

lib/SPIRV/SPIRVWriter.cpp

Lines changed: 28 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7208,6 +7208,18 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
72087208
return BM->addBinaryInst(OC, transScavengedType(CI),
72097209
transValue(CI->getArgOperand(0), BB),
72107210
transValue(CI->getArgOperand(1), BB), BB);
7211+
} else if (OC == OpSubgroupBlockReadINTEL) {
7212+
SPIRVType *RetTy = transScavengedType(CI);
7213+
SPIRVValue *Ptr = transValue(CI->getArgOperand(0), BB);
7214+
7215+
if (Ptr->getType()->getPointerElementType() != RetTy &&
7216+
Ptr->getType()->getPointerElementType()->isTypeUntypedPointerKHR()) {
7217+
// Bitcast untyped pointer to typed pointer.
7218+
SPIRVType *ExpectedType = BM->addPointerType(
7219+
Ptr->getType()->getPointerStorageClass(), RetTy->getScalarType());
7220+
Ptr = BM->addUnaryInst(OpBitcast, ExpectedType, Ptr, BB);
7221+
}
7222+
return BM->addUnaryInst(OC, RetTy, Ptr, BB);
72117223
} else if (CI->arg_size() == 1 && !CI->getType()->isVoidTy() &&
72127224
!hasExecScope(OC) && !isAtomicOpCode(OC)) {
72137225
return BM->addUnaryInst(OC, transScavengedType(CI),
@@ -7259,6 +7271,22 @@ LLVMToSPIRVBase::transBuiltinToInstWithoutDecoration(Op OC, CallInst *CI,
72597271
SPArgs.push_back(cast<ConstantInt>(Args[I])->getZExtValue());
72607272
}
72617273
}
7274+
if (OC == OpSubgroupBlockWriteINTEL) {
7275+
// First argument should be a pointer to the same scalar type as the
7276+
// second argument's component type is. Do the bitcast if the pointer is
7277+
// untyped.
7278+
if (BM->getValue(SPArgs[0])->getType()->isTypeUntypedPointerKHR()) {
7279+
// TODO: rewrite vector of IDs to vector of values?
7280+
SPIRVType *ScalarTy =
7281+
BM->getValue(SPArgs[1])->getType()->getScalarType();
7282+
SPIRVType *NewPtrTy = BM->addPointerType(
7283+
BM->getValue(SPArgs[0])->getType()->getPointerStorageClass(),
7284+
ScalarTy);
7285+
SPIRVValue *NewPtr = BM->addUnaryInst(OpBitcast, NewPtrTy,
7286+
BM->getValue(SPArgs[0]), BB);
7287+
SPArgs[0] = NewPtr->getId();
7288+
}
7289+
}
72627290
BM->addInstTemplate(SPI, SPArgs, BB, SPRetTy);
72637291
if (!SPRetTy || !SPRetTy->isTypeStruct())
72647292
return SPI;

test/extensions/EXT/SPV_EXT_relaxed_printf_string_address_space/non-constant-printf.ll

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,12 @@
99
; RUN: llvm-dis %t.rev.bc -o %t.rev.ll
1010
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
1111

12+
; RUN: llvm-spirv %t.bc -o %t.spv --spirv-ext=+SPV_EXT_relaxed_printf_string_address_space,+SPV_KHR_untyped_pointers
13+
; RUN: llvm-spirv -to-text %t.spv -o %t.spt
14+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
15+
; RUN: llvm-dis %t.rev.bc -o %t.rev.ll
16+
; RUN: FileCheck < %t.rev.ll %s --check-prefix=CHECK-LLVM
17+
1218
; CHECK-WO-EXT: RequiresExtension: Feature requires the following SPIR-V extension:
1319
; CHECK-WO-EXT: SPV_EXT_relaxed_printf_string_address_space extension should be allowed to translate this module, because this LLVM module contains the printf function with format string, whose address space is not equal to 2 (constant).
1420

test/extensions/INTEL/SPV_INTEL_subgroups/cl_intel_sub_groups.ll

Lines changed: 37 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,13 @@
5252
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM-SPIRV
5353
; RUN: llvm-spirv %t.rev.bc -o - -spirv-text --spirv-ext=+SPV_INTEL_subgroups | FileCheck %s --check-prefix=CHECK-SPIRV
5454

55+
; Verify the mangling works correctly with the untyped pointers enabled.
56+
; RUN: llvm-spirv %s -o %t.spv --spirv-ext=+SPV_INTEL_subgroups,+SPV_KHR_untyped_pointers
57+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc
58+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM-UNTYPED
59+
; RUN: llvm-spirv -r %t.spv -o %t.rev.bc --spirv-target-env=SPV-IR
60+
; RUN: llvm-dis < %t.rev.bc | FileCheck %s --check-prefix=CHECK-LLVM-SPIRV
61+
5562
; CHECK-SPIRV: Capability SubgroupShuffleINTEL
5663
; CHECK-SPIRV: Capability SubgroupBufferBlockIOINTEL
5764
; CHECK-SPIRV: Capability SubgroupImageBlockIOINTEL
@@ -138,6 +145,36 @@ define spir_kernel void @test(<2 x float> %x, i32 %c, ptr addrspace(1) %image_in
138145
; CHECK-LLVM-NEXT: call spir_func void @_Z32intel_sub_group_block_write_us16PU3AS1tDv16_t(ptr addrspace(1) [[SP]], <16 x i16> [[CALL15]])
139146
; CHECK-LLVM-NEXT: ret void
140147

148+
; The checks are the same as above, just skipping function parameters name check (because bitcasts in between instructions are involved).
149+
; CHECK-LLVM-UNTYPED: call spir_func <2 x float> @_Z23intel_sub_group_shuffleDv2_fj(<2 x float> [[X:%.*]], i32 [[C:%.*]])
150+
; CHECK-LLVM-UNTYPED: call spir_func <2 x float> @_Z28intel_sub_group_shuffle_downDv2_fS_j(<2 x float> [[X]], <2 x float> [[X]], i32 [[C]])
151+
; CHECK-LLVM-UNTYPED: call spir_func <2 x float> @_Z26intel_sub_group_shuffle_upDv2_fS_j(<2 x float> [[X]], <2 x float> [[X]], i32 [[C]])
152+
; CHECK-LLVM-UNTYPED: call spir_func <2 x float> @_Z27intel_sub_group_shuffle_xorDv2_fj(<2 x float> [[X]], i32 [[C]])
153+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i32> @_Z27intel_sub_group_block_read214ocl_image2d_roDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) [[IMAGE_IN:%.*]], <2 x i32> [[COORD:%.*]])
154+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z28intel_sub_group_block_write214ocl_image2d_woDv2_iDv2_j(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) [[IMAGE_OUT:%.*]], <2 x i32> [[COORD]], <2 x i32> {{%.*}})
155+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i32> @_Z27intel_sub_group_block_read2PU3AS1Kj(ptr addrspace(1) {{%.*}})
156+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z28intel_sub_group_block_write2PU3AS1jDv2_j(ptr addrspace(1) {{%.*}}, <2 x i32> {{%.*}})
157+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i16> @_Z30intel_sub_group_block_read_us214ocl_image2d_roDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) [[IMAGE_IN]], <2 x i32> [[COORD]])
158+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z31intel_sub_group_block_write_us214ocl_image2d_woDv2_iDv2_t(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) [[IMAGE_OUT]], <2 x i32> [[COORD]], <2 x i16> {{%.*}})
159+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i16> @_Z30intel_sub_group_block_read_us2PU3AS1Kt(ptr addrspace(1) {{%.*}})
160+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z31intel_sub_group_block_write_us2PU3AS1tDv2_t(ptr addrspace(1) {{%.*}}, <2 x i16> {{%.*}})
161+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i8> @_Z30intel_sub_group_block_read_uc214ocl_image2d_roDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) [[IMAGE_IN]], <2 x i32> [[COORD]])
162+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z31intel_sub_group_block_write_uc214ocl_image2d_woDv2_iDv2_h(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) [[IMAGE_OUT]], <2 x i32> [[COORD]], <2 x i8> {{%.*}})
163+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i8> @_Z30intel_sub_group_block_read_uc2PU3AS1Kh(ptr addrspace(1) {{%.*}})
164+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z31intel_sub_group_block_write_uc2PU3AS1hDv2_h(ptr addrspace(1) {{%.*}}, <2 x i8> {{%.*}})
165+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i64> @_Z30intel_sub_group_block_read_ul214ocl_image2d_roDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) [[IMAGE_IN]], <2 x i32> [[COORD]])
166+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z31intel_sub_group_block_write_ul214ocl_image2d_woDv2_iDv2_m(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) [[IMAGE_OUT]], <2 x i32> [[COORD]], <2 x i64> {{%.*}})
167+
; CHECK-LLVM-UNTYPED: call spir_func <2 x i64> @_Z30intel_sub_group_block_read_ul2PU3AS1Km(ptr addrspace(1) {{%.*}})
168+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z31intel_sub_group_block_write_ul2PU3AS1mDv2_m(ptr addrspace(1) {{%.*}}, <2 x i64> {{%.*}})
169+
; CHECK-LLVM-UNTYPED: call spir_func <16 x i8> @_Z31intel_sub_group_block_read_uc1614ocl_image2d_roDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) [[IMAGE_IN]], <2 x i32> [[COORD]])
170+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z32intel_sub_group_block_write_uc1614ocl_image2d_woDv2_iDv16_h(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) [[IMAGE_OUT]], <2 x i32> [[COORD]], <16 x i8> {{%.*}})
171+
; CHECK-LLVM-UNTYPED: call spir_func <16 x i8> @_Z31intel_sub_group_block_read_uc16PU3AS1Kh(ptr addrspace(1) {{%.*}})
172+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z32intel_sub_group_block_write_uc16PU3AS1hDv16_h(ptr addrspace(1) {{%.*}}, <16 x i8> {{%.*}})
173+
; CHECK-LLVM-UNTYPED: call spir_func <16 x i16> @_Z31intel_sub_group_block_read_us1614ocl_image2d_roDv2_i(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 0) [[IMAGE_IN]], <2 x i32> [[COORD]])
174+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z32intel_sub_group_block_write_us1614ocl_image2d_woDv2_iDv16_t(target("spirv.Image", void, 1, 0, 0, 0, 0, 0, 1) [[IMAGE_OUT]], <2 x i32> [[COORD]], <16 x i16> {{%.*}})
175+
; CHECK-LLVM-UNTYPED: call spir_func <16 x i16> @_Z31intel_sub_group_block_read_us16PU3AS1Kt(ptr addrspace(1) {{%.*}})
176+
; CHECK-LLVM-UNTYPED: call spir_func void @_Z32intel_sub_group_block_write_us16PU3AS1tDv16_t(ptr addrspace(1) {{%.*}}, <16 x i16> {{%.*}})
177+
141178
; CHECK-LLVM-SPIRV: call spir_func <2 x float> @_Z28__spirv_SubgroupShuffleINTELDv2_fj(
142179
; CHECK-LLVM-SPIRV: call spir_func <2 x float> @_Z32__spirv_SubgroupShuffleDownINTELDv2_fS_j(
143180
; CHECK-LLVM-SPIRV: call spir_func <2 x float> @_Z30__spirv_SubgroupShuffleUpINTELDv2_fS_j(

0 commit comments

Comments
 (0)