Skip to content

Commit eb989f6

Browse files
[SPIR-V] Fix return type when sampling an image with OpImageSampleExplicitLod (llvm#89252)
This PR fixes parsing of builtins return types in general and fixes return type when sampling an image with OpImageSampleExplicitLod in particular.
1 parent 9842726 commit eb989f6

File tree

4 files changed

+38
-3
lines changed

4 files changed

+38
-3
lines changed

llvm/lib/Target/SPIRV/SPIRVBuiltins.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1634,7 +1634,10 @@ static bool generateSampleImageInst(const StringRef DemangledCall,
16341634
ReturnType = ReturnType.substr(ReturnType.find("_R") + 2);
16351635
ReturnType = ReturnType.substr(0, ReturnType.find('('));
16361636
}
1637-
SPIRVType *Type = GR->getOrCreateSPIRVTypeByName(ReturnType, MIRBuilder);
1637+
SPIRVType *Type =
1638+
Call->ReturnType
1639+
? Call->ReturnType
1640+
: GR->getOrCreateSPIRVTypeByName(ReturnType, MIRBuilder);
16381641
if (!Type) {
16391642
std::string DiagMsg =
16401643
"Unable to recognize SPIRV type name: " + ReturnType;

llvm/lib/Target/SPIRV/SPIRVUtils.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -369,7 +369,7 @@ bool isEntryPoint(const Function &F) {
369369
return false;
370370
}
371371

372-
Type *parseBasicTypeName(StringRef TypeName, LLVMContext &Ctx) {
372+
Type *parseBasicTypeName(StringRef &TypeName, LLVMContext &Ctx) {
373373
TypeName.consume_front("atomic_");
374374
if (TypeName.consume_front("void"))
375375
return Type::getVoidTy(Ctx);

llvm/lib/Target/SPIRV/SPIRVUtils.h

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -100,7 +100,7 @@ bool isSpecialOpaqueType(const Type *Ty);
100100
bool isEntryPoint(const Function &F);
101101

102102
// Parse basic scalar type name, substring TypeName, and return LLVM type.
103-
Type *parseBasicTypeName(StringRef TypeName, LLVMContext &Ctx);
103+
Type *parseBasicTypeName(StringRef &TypeName, LLVMContext &Ctx);
104104

105105
// True if this is an instance of TypedPointerType.
106106
inline bool isTypedPointerTy(const Type *T) {
Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,32 @@
1+
; RUN: llc -O0 -mtriple=spirv64-unknown-unknown %s -o - | FileCheck %s
2+
; RUN: %if spirv-tools %{ llc -O0 -mtriple=spirv64-unknown-unknown %s -o - -filetype=obj | spirv-val %}
3+
4+
; CHECK-DAG: %[[#i32:]] = OpTypeInt 32 0
5+
; CHECK-DAG: %[[#v4i32:]] = OpTypeVector %[[#i32]] 4
6+
; CHECK-DAG: %[[#ptrv4i32:]] = OpTypePointer CrossWorkgroup %[[#v4i32]]
7+
; CHECK-DAG: %[[#float:]] = OpTypeFloat 32
8+
; CHECK-DAG: %[[#typesampled:]] = OpTypeSampledImage
9+
; CHECK-DAG: %[[#const0:]] = OpConstant %[[#float]] 0
10+
; CHECK: OpFunction
11+
; CHECK: OpFunctionParameter
12+
; CHECK: %[[#arg1:]] = OpFunctionParameter
13+
; CHECK: %[[#arg2:]] = OpFunctionParameter
14+
; CHECK: %[[#addr:]] = OpInBoundsPtrAccessChain
15+
; CHECK: %[[#img:]] = OpSampledImage %[[#typesampled:]] %[[#arg1]] %[[#arg2]]
16+
; CHECK: %[[#sample:]] = OpImageSampleExplicitLod %[[#v4i32]] %[[#img]] %[[#const0]] Lod %[[#const0]]
17+
; CHECK: %[[#casted:]] = OpBitcast %[[#ptrv4i32]] %[[#addr]]
18+
; CHECK: OpStore %[[#casted]] %[[#sample]] Aligned 16
19+
20+
%"class.sycl::_V1::vec" = type { <4 x i32> }
21+
22+
define weak_odr dso_local spir_kernel void @foo(ptr addrspace(1) align 16 %_arg_acc, target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 0) %_arg_img, target("spirv.Sampler") %_arg_sampler) {
23+
entry:
24+
%data = getelementptr inbounds %"class.sycl::_V1::vec", ptr addrspace(1) %_arg_acc, i64 0
25+
%img = tail call spir_func target("spirv.SampledImage", void, 0, 0, 0, 0, 0, 0, 0) @_Z20__spirv_SampledImage(target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 0) %_arg_img, target("spirv.Sampler") %_arg_sampler)
26+
%sample = tail call spir_func <4 x i32> @_Z30__spirv_ImageSampleExplicitLod(target("spirv.SampledImage", void, 0, 0, 0, 0, 0, 0, 0) %img, float 0.000000e+00, i32 2, float 0.000000e+00)
27+
store <4 x i32> %sample, ptr addrspace(1) %data, align 16
28+
ret void
29+
}
30+
31+
declare dso_local spir_func target("spirv.SampledImage", void, 0, 0, 0, 0, 0, 0, 0) @_Z20__spirv_SampledImage(target("spirv.Image", void, 0, 0, 0, 0, 0, 0, 0), target("spirv.Sampler"))
32+
declare dso_local spir_func <4 x i32> @_Z30__spirv_ImageSampleExplicitLod(target("spirv.SampledImage", void, 0, 0, 0, 0, 0, 0, 0), float, i32, float)

0 commit comments

Comments
 (0)