xref: /llvm-project/llvm/test/CodeGen/AMDGPU/bitreverse-inline-immediates.ll (revision 9afaf9c6c89efb22bccab39677e8dff47da91a00)
1; RUN: llc -mtriple=amdgcn -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,SI %s
2; RUN: llc -mtriple=amdgcn -mcpu=tonga -verify-machineinstrs < %s | FileCheck -check-prefixes=GCN,VI %s
3; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 < %s | FileCheck -check-prefix=GFX11 %s
4
5; Test that materialization constants that are the bit reversed of
6; inline immediates are replaced with bfrev of the inline immediate to
7; save code size.
8
9; GCN-LABEL: {{^}}materialize_0_i32:
10; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0{{$}}
11; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
12define amdgpu_kernel void @materialize_0_i32(ptr addrspace(1) %out) {
13  store i32 0, ptr addrspace(1) %out
14  ret void
15}
16
17; GCN-LABEL: {{^}}materialize_0_i64:
18; GCN: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}}
19; GCN: v_mov_b32_e32 v[[HIK:[0-9]+]], v[[LOK]]{{$}}
20; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
21define amdgpu_kernel void @materialize_0_i64(ptr addrspace(1) %out) {
22  store i64 0, ptr addrspace(1) %out
23  ret void
24}
25
26; GCN-LABEL: {{^}}materialize_neg1_i32:
27; GCN: v_mov_b32_e32 [[K:v[0-9]+]], -1{{$}}
28; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
29define amdgpu_kernel void @materialize_neg1_i32(ptr addrspace(1) %out) {
30  store i32 -1, ptr addrspace(1) %out
31  ret void
32}
33
34; GCN-LABEL: {{^}}materialize_neg1_i64:
35; GCN: v_mov_b32_e32 v[[LOK:[0-9]+]], -1{{$}}
36; GCN: v_mov_b32_e32 v[[HIK:[0-9]+]], v[[LOK]]{{$}}
37; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
38define amdgpu_kernel void @materialize_neg1_i64(ptr addrspace(1) %out) {
39  store i64 -1, ptr addrspace(1) %out
40  ret void
41}
42
43; GCN-LABEL: {{^}}materialize_signbit_i32:
44; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 1{{$}}
45; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
46define amdgpu_kernel void @materialize_signbit_i32(ptr addrspace(1) %out) {
47  store i32 -2147483648, ptr addrspace(1) %out
48  ret void
49}
50
51; GCN-LABEL: {{^}}materialize_signbit_i64:
52; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}}
53; GCN-DAG: v_bfrev_b32_e32 v[[HIK:[0-9]+]], 1{{$}}
54; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
55define amdgpu_kernel void @materialize_signbit_i64(ptr addrspace(1) %out) {
56  store i64  -9223372036854775808, ptr addrspace(1) %out
57  ret void
58}
59
60; GCN-LABEL: {{^}}materialize_rev_neg16_i32:
61; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -16{{$}}
62; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
63define amdgpu_kernel void @materialize_rev_neg16_i32(ptr addrspace(1) %out) {
64  store i32 268435455, ptr addrspace(1) %out
65  ret void
66}
67
68; GCN-LABEL: {{^}}materialize_rev_neg16_i64:
69; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], -1{{$}}
70; GCN-DAG: v_bfrev_b32_e32 v[[HIK:[0-9]+]], -16{{$}}
71; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
72define amdgpu_kernel void @materialize_rev_neg16_i64(ptr addrspace(1) %out) {
73  store i64  1152921504606846975, ptr addrspace(1) %out
74  ret void
75}
76
77; GCN-LABEL: {{^}}materialize_rev_neg17_i32:
78; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0xf7ffffff{{$}}
79; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
80define amdgpu_kernel void @materialize_rev_neg17_i32(ptr addrspace(1) %out) {
81  store i32 -134217729, ptr addrspace(1) %out
82  ret void
83}
84
85; GCN-LABEL: {{^}}materialize_rev_neg17_i64:
86; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], -1{{$}}
87; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], 0xf7ffffff{{$}}
88; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
89define amdgpu_kernel void @materialize_rev_neg17_i64(ptr addrspace(1) %out) {
90  store i64 -576460752303423489, ptr addrspace(1) %out
91  ret void
92}
93
94; GCN-LABEL: {{^}}materialize_rev_64_i32:
95; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 64{{$}}
96; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
97define amdgpu_kernel void @materialize_rev_64_i32(ptr addrspace(1) %out) {
98  store i32 33554432, ptr addrspace(1) %out
99  ret void
100}
101
102; GCN-LABEL: {{^}}materialize_rev_64_i64:
103; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}}
104; GCN-DAG: v_bfrev_b32_e32 v[[HIK:[0-9]+]], 64{{$}}
105; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
106define amdgpu_kernel void @materialize_rev_64_i64(ptr addrspace(1) %out) {
107  store i64 144115188075855872, ptr addrspace(1) %out
108  ret void
109}
110
111; GCN-LABEL: {{^}}materialize_rev_65_i32:
112; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 0x82000000{{$}}
113; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
114define amdgpu_kernel void @materialize_rev_65_i32(ptr addrspace(1) %out) {
115  store i32 -2113929216, ptr addrspace(1) %out
116  ret void
117}
118
119; GCN-LABEL: {{^}}materialize_rev_65_i64:
120; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}}
121; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], 0x82000000{{$}}
122; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
123define amdgpu_kernel void @materialize_rev_65_i64(ptr addrspace(1) %out) {
124  store i64 -9079256848778919936, ptr addrspace(1) %out
125  ret void
126}
127
128; GCN-LABEL: {{^}}materialize_rev_3_i32:
129; GCN: v_mov_b32_e32 [[K:v[0-9]+]], -2.0{{$}}
130; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
131define amdgpu_kernel void @materialize_rev_3_i32(ptr addrspace(1) %out) {
132  store i32 -1073741824, ptr addrspace(1) %out
133  ret void
134}
135
136; GCN-LABEL: {{^}}materialize_rev_3_i64:
137; GCN-DAG: v_mov_b32_e32 v[[LOK:[0-9]+]], 0{{$}}
138; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], -2.0{{$}}
139; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
140define amdgpu_kernel void @materialize_rev_3_i64(ptr addrspace(1) %out) {
141  store i64 -4611686018427387904, ptr addrspace(1) %out
142  ret void
143}
144
145; GCN-LABEL: {{^}}materialize_rev_0.5_i32:
146; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 0.5{{$}}
147; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
148define amdgpu_kernel void @materialize_rev_0.5_i32(ptr addrspace(1) %out) {
149  store i32 252, ptr addrspace(1) %out
150  ret void
151}
152
153; GCN-LABEL: {{^}}materialize_rev_1.0_i32:
154; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 1.0{{$}}
155; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
156define amdgpu_kernel void @materialize_rev_1.0_i32(ptr addrspace(1) %out) {
157  store i32 508, ptr addrspace(1) %out
158  ret void
159}
160
161; GCN-LABEL: {{^}}materialize_rev_2.0_i32:
162; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 2{{$}}
163; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
164define amdgpu_kernel void @materialize_rev_2.0_i32(ptr addrspace(1) %out) {
165  store i32 2, ptr addrspace(1) %out
166  ret void
167}
168
169; GCN-LABEL: {{^}}materialize_rev_4.0_i32:
170; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], 4.0{{$}}
171; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
172define amdgpu_kernel void @materialize_rev_4.0_i32(ptr addrspace(1) %out) {
173  store i32 258, ptr addrspace(1) %out
174  ret void
175}
176
177; GCN-LABEL: {{^}}materialize_rev_neg0.5_i32:
178; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -0.5{{$}}
179; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
180define amdgpu_kernel void @materialize_rev_neg0.5_i32(ptr addrspace(1) %out) {
181  store i32 253, ptr addrspace(1) %out
182  ret void
183}
184
185; GCN-LABEL: {{^}}materialize_rev_neg1.0_i32:
186; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -1.0{{$}}
187; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
188define amdgpu_kernel void @materialize_rev_neg1.0_i32(ptr addrspace(1) %out) {
189  store i32 509, ptr addrspace(1) %out
190  ret void
191}
192
193; GCN-LABEL: {{^}}materialize_rev_neg2.0_i32:
194; GCN: v_mov_b32_e32 [[K:v[0-9]+]], 3{{$}}
195; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
196define amdgpu_kernel void @materialize_rev_neg2.0_i32(ptr addrspace(1) %out) {
197  store i32 3, ptr addrspace(1) %out
198  ret void
199}
200
201; GCN-LABEL: {{^}}materialize_rev_neg4.0_i32:
202; GCN: v_bfrev_b32_e32 [[K:v[0-9]+]], -4.0{{$}}
203; GCN: {{buffer|flat}}_store_dword {{.*}}[[K]]
204define amdgpu_kernel void @materialize_rev_neg4.0_i32(ptr addrspace(1) %out) {
205  store i32 259, ptr addrspace(1) %out
206  ret void
207}
208
209; GCN-LABEL: {{^}}materialize_rev_1.0_i64:
210; GCN-DAG: v_bfrev_b32_e32 v[[LOK:[0-9]+]], 1.0{{$}}
211; GCN-DAG: v_mov_b32_e32 v[[HIK:[0-9]+]], 0{{$}}
212; GCN: {{buffer|flat}}_store_dwordx2 {{.*}}v[[[LOK]]:[[HIK]]]
213define amdgpu_kernel void @materialize_rev_1.0_i64(ptr addrspace(1) %out) {
214  store i64 508, ptr addrspace(1) %out
215  ret void
216}
217
218; GCN-LABEL: {{^}}s_materialize_0_i32:
219; GCN: s_mov_b32 s{{[0-9]+}}, 0{{$}}
220define amdgpu_kernel void @s_materialize_0_i32() {
221  call void asm sideeffect "; use $0", "s"(i32 0)
222  ret void
223}
224
225; GCN-LABEL: {{^}}s_materialize_1_i32:
226; GCN: s_mov_b32 s{{[0-9]+}}, 1{{$}}
227define amdgpu_kernel void @s_materialize_1_i32() {
228  call void asm sideeffect "; use $0", "s"(i32 1)
229  ret void
230}
231
232; GCN-LABEL: {{^}}s_materialize_neg1_i32:
233; GCN: s_mov_b32 s{{[0-9]+}}, -1{{$}}
234define amdgpu_kernel void @s_materialize_neg1_i32() {
235  call void asm sideeffect "; use $0", "s"(i32 -1)
236  ret void
237}
238
239; GCN-LABEL: {{^}}s_materialize_signbit_i32:
240; GCN: s_brev_b32 s{{[0-9]+}}, 1{{$}}
241define amdgpu_kernel void @s_materialize_signbit_i32() {
242  call void asm sideeffect "; use $0", "s"(i32 -2147483648)
243  ret void
244}
245
246; GCN-LABEL: {{^}}s_materialize_rev_64_i32:
247; GCN: s_brev_b32 s{{[0-9]+}}, 64{{$}}
248define amdgpu_kernel void @s_materialize_rev_64_i32() {
249  call void asm sideeffect "; use $0", "s"(i32 33554432)
250  ret void
251}
252
253; GCN-LABEL: {{^}}s_materialize_rev_65_i32:
254; GCN: s_mov_b32 s{{[0-9]+}}, 0x82000000{{$}}
255define amdgpu_kernel void @s_materialize_rev_65_i32() {
256  call void asm sideeffect "; use $0", "s"(i32 -2113929216)
257  ret void
258}
259
260; GCN-LABEL: {{^}}s_materialize_rev_neg16_i32:
261; GCN: s_brev_b32 s{{[0-9]+}}, -16{{$}}
262define amdgpu_kernel void @s_materialize_rev_neg16_i32() {
263  call void asm sideeffect "; use $0", "s"(i32 268435455)
264  ret void
265}
266
267; GCN-LABEL: {{^}}s_materialize_rev_neg17_i32:
268; GCN: s_mov_b32 s{{[0-9]+}}, 0xf7ffffff{{$}}
269define amdgpu_kernel void @s_materialize_rev_neg17_i32() {
270  call void asm sideeffect "; use $0", "s"(i32 -134217729)
271  ret void
272}
273
274; GCN-LABEL: {{^}}s_materialize_rev_1.0_i32:
275; GCN: s_movk_i32 s{{[0-9]+}}, 0x1fc{{$}}
276define amdgpu_kernel void @s_materialize_rev_1.0_i32() {
277  call void asm sideeffect "; use $0", "s"(i32 508)
278  ret void
279}
280
281; GCN-LABEL: {{^}}s_materialize_not_1.0_i32:
282; GCN: s_mov_b32 s{{[0-9]+}}, 0xc07fffff
283define void @s_materialize_not_1.0_i32() {
284  call void asm sideeffect "; use $0", "s"(i32 -1065353217)
285  ret void
286}
287
288; GCN-LABEL: {{^}}s_materialize_not_neg_1.0_i32:
289; GCN: s_mov_b32 s{{[0-9]+}}, 0x407fffff
290define void @s_materialize_not_neg_1.0_i32() {
291  call void asm sideeffect "; use $0", "s"(i32 1082130431)
292  ret void
293}
294
295; GCN-LABEL: {{^}}s_materialize_not_inv2pi_i32:
296; GCN: s_mov_b32 s{{[0-9]+}}, 0xc1dd067c
297define void @s_materialize_not_inv2pi_i32() {
298  call void asm sideeffect "; use $0", "s"(i32 -1042479492)
299  ret void
300}
301
302; GCN-LABEL: {{^}}s_materialize_not_neg_inv2pi_i32:
303; GCN: s_mov_b32 s{{[0-9]+}}, 0x41dd067c
304define void @s_materialize_not_neg_inv2pi_i32() {
305  call void asm sideeffect "; use $0", "s"(i32 1105004156)
306  ret void
307}
308
309; GCN-LABEL: {{^}}materialize_not_0.5_i32:
310; GCN: v_not_b32_e32 v{{[0-9]+}}, 0.5
311define void @materialize_not_0.5_i32(ptr addrspace(1) %out) {
312  store i32 -1056964609, ptr addrspace(1) %out
313  ret void
314}
315
316; GCN-LABEL: {{^}}materialize_not_1.0_i32:
317; GCN: v_not_b32_e32 v{{[0-9]+}}, 1.0
318define void @materialize_not_1.0_i32(ptr addrspace(1) %out) {
319  store i32 -1065353217, ptr addrspace(1) %out
320  ret void
321}
322
323; GCN-LABEL: {{^}}materialize_not_2.0_i32:
324; GCN: v_not_b32_e32 v{{[0-9]+}}, 2.0
325define void @materialize_not_2.0_i32(ptr addrspace(1) %out) {
326  store i32 -1073741825, ptr addrspace(1) %out
327  ret void
328}
329
330; GCN-LABEL: {{^}}materialize_not_4.0_i32:
331; GCN: v_not_b32_e32 v{{[0-9]+}}, 4.0
332define void @materialize_not_4.0_i32(ptr addrspace(1) %out) {
333  store i32 -1082130433, ptr addrspace(1) %out
334  ret void
335}
336
337; GCN-LABEL: {{^}}materialize_not_neg_0.5_i32:
338; GCN: v_not_b32_e32 v{{[0-9]+}}, -0.5
339define void @materialize_not_neg_0.5_i32(ptr addrspace(1) %out) {
340  store i32 1090519039, ptr addrspace(1) %out
341  ret void
342}
343
344; GCN-LABEL: {{^}}materialize_not_neg_1.0_i32:
345; GCN: v_not_b32_e32 v{{[0-9]+}}, -1.0
346define void @materialize_not_neg_1.0_i32(ptr addrspace(1) %out) {
347  store i32 1082130431, ptr addrspace(1) %out
348  ret void
349}
350
351; GCN-LABEL: {{^}}materialize_not_neg2.0_i32:
352; GCN: v_not_b32_e32 v{{[0-9]+}}, -2.0
353define void @materialize_not_neg2.0_i32(ptr addrspace(1) %out) {
354  store i32 1073741823, ptr addrspace(1) %out
355  ret void
356}
357
358; GCN-LABEL: {{^}}materialize_not_neg4.0_i32:
359; GCN: v_not_b32_e32 v{{[0-9]+}}, -4.0
360define void @materialize_not_neg4.0_i32(ptr addrspace(1) %out) {
361  store i32 1065353215, ptr addrspace(1) %out
362  ret void
363}
364
365; GCN-LABEL: {{^}}materialize_not_inv2pi_i32:
366; SI: v_mov_b32_e32 v{{[0-9]+}}, 0xc1dd067c
367; VI: v_not_b32_e32 v{{[0-9]+}}, 0.15915494
368define void @materialize_not_inv2pi_i32(ptr addrspace(1) %out) {
369  store i32 -1042479492, ptr addrspace(1) %out
370  ret void
371}
372
373; GCN-LABEL: {{^}}materialize_not_neg_inv2pi_i32:
374; GCN: v_mov_b32_e32 v{{[0-9]+}}, 0x41dd067c
375define void @materialize_not_neg_inv2pi_i32(ptr addrspace(1) %out) {
376  store i32 1105004156, ptr addrspace(1) %out
377  ret void
378}
379
380; One constant is reversible, the other is not. We shouldn't break
381; vopd packing for this.
382; GFX11-LABEL: {{^}}vopd_materialize:
383; FIXME-GFX11: v_dual_mov_b32 v0, 0x102 :: v_dual_mov_b32 v1, 1.0
384; GFX11: v_bfrev_b32_e32 v0, 4.0
385; GFX11: v_mov_b32_e32 v1, 1.0
386define <2 x i32> @vopd_materialize() {
387  %insert0 = insertelement <2 x i32> poison, i32 258, i32 0
388  %insert1 = insertelement <2 x i32> %insert0, i32 1065353216, i32 1
389  ret <2 x i32> %insert1
390}
391