Skip to content

Commit 8787aaa

Browse files
wenju-heYuriPlyakhin
authored andcommitted
[SYCL Bindless Image] Lower get_image_depth builtin to resinfoptr
When image handle is loaded from memory, it is impossible to get its depth from any implicit argument. Therefore, we have to read from resinfoptr result. Co-authored-by: Yury Plyakhin <[email protected]>
1 parent 557b7b9 commit 8787aaa

File tree

7 files changed

+69
-18
lines changed

7 files changed

+69
-18
lines changed

IGC/Compiler/Optimizer/OCLBIUtils.cpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -948,6 +948,9 @@ class CGetImageProperty : public CImagesBI
948948
case HEIGHT:
949949
prop = builder.CreateExtractElement(info, builder.getInt32(1));
950950
break;
951+
case DEPTH:
952+
prop = builder.CreateExtractElement(info, builder.getInt32(2));
953+
break;
951954
default:
952955
emitError("Unsupported bindless image property requested.", NULL);
953956
}
@@ -1356,6 +1359,7 @@ CBuiltinsResolver::CBuiltinsResolver(CImagesBI::ParamMap* paramMap, CImagesBI::I
13561359
if (modMD->compOpt.UseBindlessMode && !modMD->compOpt.UseLegacyBindlessMode){
13571360
m_CommandMap["__builtin_IB_get_image_width"] = CGetImageProperty::create(paramMap, CImagesBI::ImageProperty::WIDTH);
13581361
m_CommandMap["__builtin_IB_get_image_height"] = CGetImageProperty::create(paramMap, CImagesBI::ImageProperty::HEIGHT);
1362+
m_CommandMap["__builtin_IB_get_image_depth"] = CGetImageProperty::create(paramMap, CImagesBI::ImageProperty::DEPTH);
13591363
}
13601364

13611365
//convert Built-ins

IGC/Compiler/Optimizer/OCLBIUtils.h

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -163,7 +163,8 @@ namespace IGC
163163
enum ImageProperty
164164
{
165165
WIDTH,
166-
HEIGHT
166+
HEIGHT,
167+
DEPTH
167168
};
168169

169170
struct ParamInfo

IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncResolution.cpp

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -81,6 +81,11 @@ void ImageFuncResolution::visitCallInst(CallInst& CI)
8181
}
8282
else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_DEPTH))
8383
{
84+
if (!isImplicitImageArgs)
85+
{
86+
IGC_ASSERT_MESSAGE(false, "Getting Image Depth from implicit args is supported only in bindful mode");
87+
return;
88+
}
8489
imageRes = getImageDepth(CI);
8590
}
8691
else if (funcName.equals(ImageFuncsAnalysis::GET_IMAGE_NUM_MIP_LEVELS))

IGC/Compiler/Optimizer/OpenCLPasses/ImageFuncs/ImageFuncsAnalysis.cpp

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -107,7 +107,7 @@ void ImageFuncsAnalysis::visitCallInst(CallInst& CI)
107107
{
108108
imageFunc = &m_argMap[ImplicitArg::IMAGE_WIDTH];
109109
}
110-
else if (funcName == GET_IMAGE_DEPTH)
110+
else if (funcName == GET_IMAGE_DEPTH && m_addImplicitImageArgs)
111111
{
112112
imageFunc = &m_argMap[ImplicitArg::IMAGE_DEPTH];
113113
}
Lines changed: 38 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,38 @@
1+
;=========================== begin_copyright_notice ============================
2+
;
3+
; Copyright (C) 2024 Intel Corporation
4+
;
5+
; SPDX-License-Identifier: MIT
6+
;
7+
;============================ end_copyright_notice =============================
8+
9+
; Negative test checks that no implicit args are captured in bindless mode
10+
11+
; RUN: igc_opt -igc-image-func-analysis -S %s -o - | FileCheck %s
12+
13+
%opencl.image2d_t = type opaque
14+
15+
declare i32 @__builtin_IB_get_image_depth(i32 %img)
16+
17+
define i32 @foo(i32 %img) nounwind {
18+
%id = call i32 @__builtin_IB_get_image_depth(i32 %img)
19+
ret i32 %id
20+
}
21+
22+
!igc.functions = !{!0}
23+
!IGCMetadata = !{!4}
24+
25+
!0 = !{i32 (i32)* @foo, !1}
26+
!1 = !{!2, !3}
27+
!2 = !{!"function_type", i32 0}
28+
!3 = !{!"implicit_arg_desc"}
29+
!4 = !{!"ModuleMD", !5}
30+
!5 = !{!"compOpt", !6, !7}
31+
!6 = !{!"UseBindlessMode", i1 true}
32+
!7 = !{!"UseLegacyBindlessMode", i1 false}
33+
34+
;CHECK-NOT: !{!"implicit_arg_desc", ![[A1:[0-9]+]]}
35+
;CHECK-NOT: ![[A2:[0-9]+]] = !{i32 22, ![[A3:[0-9]+]]}
36+
;CHECK-NOT: ![[A4:[0-9]+]] = !{!"explicit_arg_num", i32 0}
37+
38+

IGC/Compiler/tests/OCLBIConverter/get_image_prop.ll

Lines changed: 12 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -20,23 +20,25 @@ define spir_kernel void @kernel(%spirv.Image._void_1_0_0_0_0_0_0 addrspace(1)* %
2020
%1 = trunc i64 %data to i32
2121
; CHECK-NOT: __builtin_IB_get_image_width
2222
; CHECK-NOT: __builtin_IB_get_image_height
23+
; CHECK-NOT: __builtin_IB_get_image_height
2324
; CHECK: [[BINDLESS_IMG:%.*]] = addrspacecast [[SPIRV_IMAGE__VOID_1_0_0_0_0_0_0]] addrspace(1)* [[IMG]] to float addrspace(393216)*
24-
; CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.genx.GenISA.resinfoptr.p393216f32(float addrspace(393216)* [[BINDLESS_IMG]], i32 0)
25-
; CHECK-NEXT: [[TMP3:%.*]] = extractelement <4 x i32> [[TMP2]], i32 0
25+
; CHECK-NEXT: [[TMP1:%.*]] = call <4 x i32> @llvm.genx.GenISA.resinfoptr.p393216f32(float addrspace(393216)* [[BINDLESS_IMG]], i32 0)
26+
; CHECK-NEXT: extractelement <4 x i32> [[TMP1]], i32 0
2627
; CHECK-NEXT: [[BINDLESS_IMG1:%.*]] = addrspacecast [[SPIRV_IMAGE__VOID_1_0_0_0_0_0_0]] addrspace(1)* [[IMG]] to float addrspace(393216)*
27-
; CHECK-NEXT: [[TMP4:%.*]] = call <4 x i32> @llvm.genx.GenISA.resinfoptr.p393216f32(float addrspace(393216)* [[BINDLESS_IMG1]], i32 0)
28-
; CHECK-NEXT: [[TMP5:%.*]] = extractelement <4 x i32> [[TMP4]], i32 1
29-
; CHECK-NEXT: [[VECINIT_I_I_I:%.*]] = insertelement <2 x i32> undef, i32 [[TMP3]], i64 0
30-
; CHECK-NEXT: [[VECINIT2_I_I_I:%.*]] = insertelement <2 x i32> [[VECINIT_I_I_I]], i32 [[TMP5]], i64 1
31-
%call.i.i.i = call spir_func i32 @__builtin_IB_get_image_width(i32 %1)
32-
%call1.i.i.i = call spir_func i32 @__builtin_IB_get_image_height(i32 %1)
33-
%vecinit.i.i.i = insertelement <2 x i32> undef, i32 %call.i.i.i, i64 0
34-
%vecinit2.i.i.i = insertelement <2 x i32> %vecinit.i.i.i, i32 %call1.i.i.i, i64 1
28+
; CHECK-NEXT: [[TMP2:%.*]] = call <4 x i32> @llvm.genx.GenISA.resinfoptr.p393216f32(float addrspace(393216)* [[BINDLESS_IMG1]], i32 0)
29+
; CHECK-NEXT: extractelement <4 x i32> [[TMP2]], i32 1
30+
; CHECK-NEXT: [[BINDLESS_IMG2:%.*]] = addrspacecast [[SPIRV_IMAGE__VOID_1_0_0_0_0_0_0]] addrspace(1)* [[IMG]] to float addrspace(393216)*
31+
; CHECK-NEXT: [[TMP3:%.*]] = call <4 x i32> @llvm.genx.GenISA.resinfoptr.p393216f32(float addrspace(393216)* [[BINDLESS_IMG2]], i32 0)
32+
; CHECK-NEXT: extractelement <4 x i32> [[TMP3]], i32 2
33+
%call = call spir_func i32 @__builtin_IB_get_image_width(i32 %1)
34+
%call1 = call spir_func i32 @__builtin_IB_get_image_height(i32 %1)
35+
%call2 = call spir_func i32 @__builtin_IB_get_image_depth(i32 %1)
3536
ret void
3637
}
3738

3839
declare spir_func i32 @__builtin_IB_get_image_width(i32)
3940
declare spir_func i32 @__builtin_IB_get_image_height(i32)
41+
declare spir_func i32 @__builtin_IB_get_image_depth(i32)
4042

4143
!igc.functions = !{!0}
4244
!IGCMetadata = !{!3}

IGC/Compiler/tests/OCLBIConverter/get_image_prop_neg.ll

Lines changed: 7 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -16,17 +16,18 @@
1616
define spir_kernel void @kernel(%spirv.Image._void_1_0_0_0_0_0_0 addrspace(1)* %img) {
1717
%data = ptrtoint %spirv.Image._void_1_0_0_0_0_0_0 addrspace(1)* %img to i64
1818
%1 = trunc i64 %data to i32
19-
; CHECK: [[CALL_I_I_I:%.*]] = call spir_func i32 @__builtin_IB_get_image_width(i32 [[TMP1:%.*]])
20-
; CHECK-NEXT: [[CALL1_I_I_I:%.*]] = call spir_func i32 @__builtin_IB_get_image_height(i32 [[TMP1]])
21-
%call.i.i.i = call spir_func i32 @__builtin_IB_get_image_width(i32 %1)
22-
%call1.i.i.i = call spir_func i32 @__builtin_IB_get_image_height(i32 %1)
23-
%vecinit.i.i.i = insertelement <2 x i32> undef, i32 %call.i.i.i, i64 0
24-
%vecinit2.i.i.i = insertelement <2 x i32> %vecinit.i.i.i, i32 %call1.i.i.i, i64 1
19+
; CHECK: call spir_func i32 @__builtin_IB_get_image_width(i32 [[TMP1:%.*]])
20+
; CHECK-NEXT: call spir_func i32 @__builtin_IB_get_image_height(i32 [[TMP1]])
21+
; CHECK-NEXT: call spir_func i32 @__builtin_IB_get_image_depth(i32 [[TMP1]])
22+
%call = call spir_func i32 @__builtin_IB_get_image_width(i32 %1)
23+
%call1 = call spir_func i32 @__builtin_IB_get_image_height(i32 %1)
24+
%call2 = call spir_func i32 @__builtin_IB_get_image_depth(i32 %1)
2525
ret void
2626
}
2727

2828
declare spir_func i32 @__builtin_IB_get_image_width(i32)
2929
declare spir_func i32 @__builtin_IB_get_image_height(i32)
30+
declare spir_func i32 @__builtin_IB_get_image_depth(i32)
3031

3132
!igc.functions = !{!0}
3233
!IGCMetadata = !{!3}

0 commit comments

Comments
 (0)