Skip to content

Commit 46c833f

Browse files
committed
Using image desc as opaque ptr type for image load/store/sample
1 parent f27e89a commit 46c833f

10 files changed

+1443
-1030
lines changed

clang/include/clang/Basic/BuiltinsAMDGPU.def

Lines changed: 70 additions & 99 deletions
Large diffs are not rendered by default.

clang/lib/CodeGen/TargetBuiltins/AMDGPU.cpp

Lines changed: 72 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -184,13 +184,83 @@ static Value *EmitAMDGCNBallotForExec(CodeGenFunction &CGF, const CallExpr *E,
184184
return Call;
185185
}
186186

187+
static bool IsImageSampleBuiltIn(unsigned BuiltinID) {
188+
switch (BuiltinID) {
189+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f32_f32:
190+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1d_v4f16_f32:
191+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f32_f32:
192+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_1darray_v4f16_f32:
193+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2d_f32_f32:
194+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f32_f32:
195+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2d_v4f16_f32:
196+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2darray_f32_f32:
197+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f32_f32:
198+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_2darray_v4f16_f32:
199+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f32_f32:
200+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_3d_v4f16_f32:
201+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f32_f32:
202+
case clang::AMDGPU::BI__builtin_amdgcn_image_sample_cube_v4f16_f32:
203+
return true;
204+
default:
205+
return false;
206+
}
207+
}
208+
209+
static llvm::Value *LoadTextureDescPtorAsVec8I32(CodeGenFunction &CGF,
210+
llvm::Value *RsrcPtr) {
211+
auto &B = CGF.Builder;
212+
auto *VecTy = llvm::FixedVectorType::get(B.getInt32Ty(), 8);
213+
214+
if (RsrcPtr->getType() == VecTy)
215+
return RsrcPtr;
216+
217+
if (RsrcPtr->getType()->isIntegerTy(32)) {
218+
unsigned AS = 8;
219+
llvm::PointerType *VecPtrTy = llvm::PointerType::get(VecTy, AS);
220+
llvm::Value *Ptr =
221+
B.CreateIntToPtr(RsrcPtr, VecPtrTy, "tex.rsrc.from.int");
222+
return B.CreateAlignedLoad(VecTy, Ptr, llvm::Align(32), "tex.rsrc.val");
223+
}
224+
225+
if (RsrcPtr->getType()->isPointerTy()) {
226+
unsigned AS = RsrcPtr->getType()->getPointerAddressSpace();
227+
auto *VecPtrTy = llvm::PointerType::get(VecTy, AS);
228+
llvm::Value *Typed = B.CreateBitCast(RsrcPtr, VecPtrTy, "tex.rsrc.typed");
229+
return B.CreateAlignedLoad(VecTy, Typed, llvm::Align(32), "tex.rsrc.val");
230+
}
231+
232+
const auto &DL = CGF.CGM.getDataLayout();
233+
if (DL.getTypeSizeInBits(RsrcPtr->getType()) == 256)
234+
return B.CreateBitCast(RsrcPtr, VecTy, "tex.rsrc.val");
235+
236+
RsrcPtr->getType()->print(llvm::errs());
237+
llvm::report_fatal_error(": Unexpected texture resource argument form");
238+
}
239+
240+
static unsigned GetTextureDescIndex(unsigned BuiltinID, const CallExpr *E) {
241+
unsigned N = E->getNumArgs();
242+
if (IsImageSampleBuiltIn(BuiltinID)) {
243+
if (N < 5) return (unsigned)-1;
244+
return N - 5;
245+
}
246+
247+
if (N < 3) return (unsigned)-1;
248+
return N - 3;
249+
}
250+
187251
llvm::CallInst *EmitAMDGCNImageOverloadedReturnType(clang::CodeGen::CodeGenFunction &CGF,
188252
const clang::CallExpr *E,
189253
unsigned IntrinsicID,
190254
bool IsImageStore) {
191255
clang::SmallVector<llvm::Value *, 10> Args;
192-
for (unsigned I = 0; I < E->getNumArgs(); ++I)
193-
Args.push_back(CGF.EmitScalarExpr(E->getArg(I)));
256+
unsigned RsrcIndex = GetTextureDescIndex(E->getBuiltinCallee(), E);
257+
258+
for (unsigned I = 0; I < E->getNumArgs(); ++I){
259+
llvm::Value *V = CGF.EmitScalarExpr(E->getArg(I));
260+
if (I == RsrcIndex)
261+
V = LoadTextureDescPtorAsVec8I32(CGF, V);
262+
Args.push_back(V);
263+
}
194264

195265
llvm::Type *RetTy = CGF.ConvertType(E->getType());
196266
if (IsImageStore)

clang/test/CodeGen/builtins-image-load.c

Lines changed: 378 additions & 337 deletions
Large diffs are not rendered by default.

clang/test/CodeGen/builtins-image-store.c

Lines changed: 252 additions & 225 deletions
Large diffs are not rendered by default.
Lines changed: 194 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,194 @@
1+
// RUN: %clang_cc1 -triple amdgcn-- -target-cpu gfx1100 -S -verify=expected -o - %s
2+
// REQUIRES: amdgpu-registered-target
3+
4+
typedef int int4 __attribute__((ext_vector_type(4)));
5+
typedef float float4 __attribute__((ext_vector_type(4)));
6+
typedef half half4 __attribute__((ext_vector_type(4)));
7+
8+
float test_builtin_image_load_2d(float f32, int i32, __amdgpu_texture_t tex) {
9+
10+
return __builtin_amdgcn_image_load_2d_f32_i32(i32, i32, i32, tex, 106, 103); //expected-error{{argument to '__builtin_amdgcn_image_load_2d_f32_i32' must be a constant integer}}
11+
}
12+
float4 test_builtin_image_load_2d_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
13+
14+
return __builtin_amdgcn_image_load_2d_v4f32_i32(100, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_2d_v4f32_i32' must be a constant integer}}
15+
}
16+
half4 test_builtin_image_load_2d_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
17+
18+
return __builtin_amdgcn_image_load_2d_v4f16_i32(100, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_2d_v4f16_i32' must be a constant integer}}
19+
}
20+
21+
22+
float test_builtin_image_load_2darray(float f32, int i32, __amdgpu_texture_t tex) {
23+
24+
return __builtin_amdgcn_image_load_2darray_f32_i32(100, i32, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_2darray_f32_i32' must be a constant integer}}
25+
}
26+
float4 test_builtin_image_load_2darray_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
27+
28+
return __builtin_amdgcn_image_load_2darray_v4f32_i32(100, i32, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_2darray_v4f32_i32' must be a constant integer}}
29+
}
30+
half4 test_builtin_image_load_2darray_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
31+
32+
return __builtin_amdgcn_image_load_2darray_v4f16_i32(100, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_2darray_v4f16_i32' must be a constant integer}}
33+
}
34+
35+
float4 test_builtin_image_load_1d_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
36+
37+
return __builtin_amdgcn_image_load_1d_v4f32_i32(i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_1d_v4f32_i32' must be a constant integer}}
38+
}
39+
half4 test_builtin_image_load_1d_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
40+
41+
return __builtin_amdgcn_image_load_1d_v4f16_i32(100, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_1d_v4f16_i32' must be a constant integer}}
42+
}
43+
44+
float4 test_builtin_image_load_1darray_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
45+
46+
return __builtin_amdgcn_image_load_1darray_v4f32_i32(100, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_1darray_v4f32_i32' must be a constant integer}}
47+
}
48+
half4 test_builtin_image_load_1darray_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
49+
50+
return __builtin_amdgcn_image_load_1darray_v4f16_i32(100, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_1darray_v4f16_i32' must be a constant integer}}
51+
}
52+
53+
float4 test_builtin_image_load_3d_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
54+
55+
return __builtin_amdgcn_image_load_3d_v4f32_i32(100, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_3d_v4f32_i32' must be a constant integer}}
56+
}
57+
half4 test_builtin_image_load_3d_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
58+
59+
return __builtin_amdgcn_image_load_3d_v4f16_i32(i32, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_3d_v4f16_i32' must be a constant integer}}
60+
}
61+
62+
float4 test_builtin_image_load_cube_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
63+
64+
return __builtin_amdgcn_image_load_cube_v4f32_i32(i32, i32, i32, i32, tex, 120, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_cube_v4f32_i32' must be a constant integer}}
65+
}
66+
half4 test_builtin_image_load_cube_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
67+
68+
return __builtin_amdgcn_image_load_cube_v4f16_i32(i32, i32, i32, i32, tex, 120, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_cube_v4f16_i32' must be a constant integer}}
69+
}
70+
71+
float4 test_builtin_image_load_mip_1d_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
72+
73+
return __builtin_amdgcn_image_load_mip_1d_v4f32_i32(i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_1d_v4f32_i32' must be a constant integer}}
74+
}
75+
half4 test_builtin_image_load_mip_1d_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
76+
77+
return __builtin_amdgcn_image_load_mip_1d_v4f16_i32(100, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_1d_v4f16_i32' must be a constant integer}}
78+
}
79+
80+
float4 test_builtin_image_load_mip_1darray_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
81+
82+
return __builtin_amdgcn_image_load_mip_1darray_v4f32_i32(i32, i32, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_1darray_v4f32_i32' must be a constant integer}}
83+
}
84+
half4 test_builtin_image_load_mip_1darray_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
85+
86+
return __builtin_amdgcn_image_load_mip_1darray_v4f16_i32(100, i32, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_1darray_v4f16_i32' must be a constant integer}}
87+
}
88+
89+
float test_builtin_image_load_mip_2d(float f32, int i32, __amdgpu_texture_t tex) {
90+
91+
return __builtin_amdgcn_image_load_mip_2d_f32_i32(i32, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_2d_f32_i32' must be a constant integer}}
92+
}
93+
float4 test_builtin_image_load_mip_2d_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
94+
95+
return __builtin_amdgcn_image_load_mip_2d_v4f32_i32(100, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_2d_v4f32_i32' must be a constant integer}}
96+
}
97+
half4 test_builtin_image_load_mip_2d_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
98+
99+
return __builtin_amdgcn_image_load_mip_2d_v4f16_i32(i32, i32, i32, i32, tex, 120, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_2d_v4f16_i32' must be a constant integer}}
100+
}
101+
102+
float test_builtin_image_load_mip_2darray(float f32, int i32, __amdgpu_texture_t tex) {
103+
104+
return __builtin_amdgcn_image_load_mip_2darray_f32_i32(i32, i32, i32, i32, i32, tex, 120, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_2darray_f32_i32' must be a constant integer}}
105+
}
106+
float4 test_builtin_image_load_mip_2darray_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
107+
108+
return __builtin_amdgcn_image_load_mip_2darray_v4f32_i32(100, i32, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_2darray_v4f32_i32' must be a constant integer}}
109+
}
110+
half4 test_builtin_image_load_mip_2darray_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
111+
112+
return __builtin_amdgcn_image_load_mip_2darray_v4f16_i32(100, i32, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_2darray_v4f16_i32' must be a constant integer}}
113+
}
114+
115+
float4 test_builtin_image_load_mip_3d_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
116+
117+
return __builtin_amdgcn_image_load_mip_3d_v4f32_i32(i32, i32, i32, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_3d_v4f32_i32' must be a constant integer}}
118+
}
119+
half4 test_builtin_image_load_mip_3d_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
120+
121+
return __builtin_amdgcn_image_load_mip_3d_v4f16_i32(i32, i32, i32, i32, i32, tex, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_3d_v4f16_i32' must be a constant integer}}
122+
}
123+
124+
float4 test_builtin_image_load_mip_cube_1(float4 v4f32, int i32, __amdgpu_texture_t tex) {
125+
126+
return __builtin_amdgcn_image_load_mip_cube_v4f32_i32(i32, i32, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_cube_v4f32_i32' must be a constant integer}}
127+
}
128+
half4 test_builtin_image_load_mip_cube_2(half4 v4f16, int i32, __amdgpu_texture_t tex) {
129+
130+
return __builtin_amdgcn_image_load_mip_cube_v4f16_i32(100, i32, i32, i32, i32, tex, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_load_mip_cube_v4f16_i32' must be a constant integer}}
131+
}
132+
133+
float test_builtin_image_sample_2d(float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
134+
135+
return __builtin_amdgcn_image_sample_2d_f32_f32(i32, f32, f32, tex, vec4i32, 0, 106, 103); //expected-error{{argument to '__builtin_amdgcn_image_sample_2d_f32_f32' must be a constant integer}}
136+
}
137+
float4 test_builtin_image_sample_2d_1(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
138+
139+
return __builtin_amdgcn_image_sample_2d_v4f32_f32(100, f32, f32, tex, vec4i32, 0, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_2d_v4f32_f32' must be a constant integer}}
140+
}
141+
half4 test_builtin_image_sample_2d_2(half4 v4f16, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
142+
143+
return __builtin_amdgcn_image_sample_2d_v4f16_f32(100, f32, f32, tex, vec4i32, 0, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_2d_v4f16_f32' must be a constant integer}}
144+
}
145+
146+
float test_builtin_image_sample_2darray(float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
147+
148+
return __builtin_amdgcn_image_sample_2darray_f32_f32(100, f32, f32, f32, tex, vec4i32, 0, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_2darray_f32_f32' must be a constant integer}}
149+
}
150+
float4 test_builtin_image_sample_2darray_1(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
151+
152+
return __builtin_amdgcn_image_sample_2darray_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_2darray_v4f32_f32' must be a constant integer}}
153+
}
154+
half4 test_builtin_image_sample_2darray_2(half4 v4f16, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
155+
156+
return __builtin_amdgcn_image_sample_2darray_v4f16_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_2darray_v4f16_f32' must be a constant integer}}
157+
}
158+
159+
float4 test_builtin_image_sample_1d_1(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
160+
161+
return __builtin_amdgcn_image_sample_1d_v4f32_f32(i32, f32, tex, vec4i32, 0, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_1d_v4f32_f32' must be a constant integer}}
162+
}
163+
half4 test_builtin_image_sample_1d_2(half4 v4f16, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
164+
165+
return __builtin_amdgcn_image_sample_1d_v4f16_f32(100, f32, tex, vec4i32, 0, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_1d_v4f16_f32' must be a constant integer}}
166+
}
167+
168+
float4 test_builtin_image_sample_1darray_1(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
169+
170+
return __builtin_amdgcn_image_sample_1darray_v4f32_f32(100, f32, f32, tex, vec4i32, 0, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_1darray_v4f32_f32' must be a constant integer}}
171+
}
172+
half4 test_builtin_image_sample_1darray_2(half4 v4f16, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
173+
174+
return __builtin_amdgcn_image_sample_1darray_v4f16_f32(100, f32, f32, tex, vec4i32, 0, i32, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_1darray_v4f16_f32' must be a constant integer}}
175+
}
176+
177+
float4 test_builtin_image_sample_3d_1(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
178+
179+
return __builtin_amdgcn_image_sample_3d_v4f32_f32(100, f32, f32, f32, tex, vec4i32, 0, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_3d_v4f32_f32' must be a constant integer}}
180+
}
181+
half4 test_builtin_image_sample_3d_2(half4 v4f16, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
182+
183+
return __builtin_amdgcn_image_sample_3d_v4f16_f32(i32, f32, f32, f32, tex, vec4i32, 0, 120, i32); //expected-error{{argument to '__builtin_amdgcn_image_sample_3d_v4f16_f32' must be a constant integer}}
184+
}
185+
186+
float4 test_builtin_image_sample_cube_1(float4 v4f32, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
187+
188+
return __builtin_amdgcn_image_sample_cube_v4f32_f32(i32, f32, f32, f32, tex, vec4i32, 0, 120, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_cube_v4f32_f32' must be a constant integer}}
189+
}
190+
half4 test_builtin_image_sample_cube_2(half4 v4f16, float f32, int i32, __amdgpu_texture_t tex, int4 vec4i32) {
191+
192+
return __builtin_amdgcn_image_sample_cube_v4f16_f32(i32, f32, f32, f32, tex, vec4i32, 0, 120, 110); //expected-error{{argument to '__builtin_amdgcn_image_sample_cube_v4f16_f32' must be a constant integer}}
193+
}
194+

0 commit comments

Comments
 (0)