2
2
; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -verify-machineinstrs < %s | FileCheck -check-prefix=CHECK-SDAG -enable-var-scope %s
3
3
; RUN: llc -mtriple=amdgcn--amdhsa -mcpu=fiji -verify-machineinstrs -global-isel < %s | FileCheck -check-prefix=CHECK-GISEL -enable-var-scope %s
4
4
5
- declare i32 @llvm.amdgcn.readfirstlane (i32 ) #0
6
- declare i64 @llvm.amdgcn.readfirstlane.i64 (i64 ) #0
7
- declare double @llvm.amdgcn.readfirstlane.f64 (double ) #0
5
+ define void @test_readfirstlane_i1 (ptr addrspace (1 ) %out , i1 %src ) {
6
+ ; CHECK-SDAG-LABEL: test_readfirstlane_i1:
7
+ ; CHECK-SDAG: ; %bb.0:
8
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9
+ ; CHECK-SDAG-NEXT: v_readfirstlane_b32 s4, v2
10
+ ; CHECK-SDAG-NEXT: s_and_b32 s4, s4, 1
11
+ ; CHECK-SDAG-NEXT: v_mov_b32_e32 v2, s4
12
+ ; CHECK-SDAG-NEXT: flat_store_byte v[0:1], v2
13
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0)
14
+ ; CHECK-SDAG-NEXT: s_setpc_b64 s[30:31]
15
+ ;
16
+ ; CHECK-GISEL-LABEL: test_readfirstlane_i1:
17
+ ; CHECK-GISEL: ; %bb.0:
18
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
19
+ ; CHECK-GISEL-NEXT: v_readfirstlane_b32 s4, v2
20
+ ; CHECK-GISEL-NEXT: s_and_b32 s4, s4, 1
21
+ ; CHECK-GISEL-NEXT: v_mov_b32_e32 v2, s4
22
+ ; CHECK-GISEL-NEXT: flat_store_byte v[0:1], v2
23
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0)
24
+ ; CHECK-GISEL-NEXT: s_setpc_b64 s[30:31]
25
+ %readfirstlane = call i1 @llvm.amdgcn.readfirstlane.i1 (i1 %src )
26
+ store i1 %readfirstlane , ptr addrspace (1 ) %out , align 4
27
+ ret void
28
+ }
29
+
30
+ define void @test_readfirstlane_i1_inreg (ptr addrspace (1 ) %out , i1 inreg %src ) {
31
+ ; CHECK-SDAG-LABEL: test_readfirstlane_i1_inreg:
32
+ ; CHECK-SDAG: ; %bb.0:
33
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
34
+ ; CHECK-SDAG-NEXT: s_and_b32 s4, s6, 1
35
+ ; CHECK-SDAG-NEXT: v_mov_b32_e32 v2, s4
36
+ ; CHECK-SDAG-NEXT: flat_store_byte v[0:1], v2
37
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0)
38
+ ; CHECK-SDAG-NEXT: s_setpc_b64 s[30:31]
39
+ ;
40
+ ; CHECK-GISEL-LABEL: test_readfirstlane_i1_inreg:
41
+ ; CHECK-GISEL: ; %bb.0:
42
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
43
+ ; CHECK-GISEL-NEXT: s_and_b32 s4, s6, 1
44
+ ; CHECK-GISEL-NEXT: v_mov_b32_e32 v2, s4
45
+ ; CHECK-GISEL-NEXT: flat_store_byte v[0:1], v2
46
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0)
47
+ ; CHECK-GISEL-NEXT: s_setpc_b64 s[30:31]
48
+ %readfirstlane = call i1 @llvm.amdgcn.readfirstlane.i1 (i1 %src )
49
+ store i1 %readfirstlane , ptr addrspace (1 ) %out , align 4
50
+ ret void
51
+ }
52
+
53
+ define void @test_readfirstlane_i1_select (ptr addrspace (1 ) %out , i32 %src , i32 %src1 ) {
54
+ ; CHECK-SDAG-LABEL: test_readfirstlane_i1_select:
55
+ ; CHECK-SDAG: ; %bb.0:
56
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
57
+ ; CHECK-SDAG-NEXT: v_cmp_lt_u32_e32 vcc, 42, v2
58
+ ; CHECK-SDAG-NEXT: v_cndmask_b32_e64 v4, 0, 1, vcc
59
+ ; CHECK-SDAG-NEXT: v_readfirstlane_b32 s4, v4
60
+ ; CHECK-SDAG-NEXT: s_bitcmp1_b32 s4, 0
61
+ ; CHECK-SDAG-NEXT: s_cselect_b64 vcc, -1, 0
62
+ ; CHECK-SDAG-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc
63
+ ; CHECK-SDAG-NEXT: flat_store_dword v[0:1], v2
64
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0)
65
+ ; CHECK-SDAG-NEXT: s_setpc_b64 s[30:31]
66
+ ;
67
+ ; CHECK-GISEL-LABEL: test_readfirstlane_i1_select:
68
+ ; CHECK-GISEL: ; %bb.0:
69
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
70
+ ; CHECK-GISEL-NEXT: v_cmp_lt_u32_e32 vcc, 42, v2
71
+ ; CHECK-GISEL-NEXT: v_cndmask_b32_e64 v4, 0, 1, vcc
72
+ ; CHECK-GISEL-NEXT: v_readfirstlane_b32 s4, v4
73
+ ; CHECK-GISEL-NEXT: s_and_b32 s4, 1, s4
74
+ ; CHECK-GISEL-NEXT: v_cmp_ne_u32_e64 vcc, 0, s4
75
+ ; CHECK-GISEL-NEXT: v_cndmask_b32_e32 v2, v3, v2, vcc
76
+ ; CHECK-GISEL-NEXT: flat_store_dword v[0:1], v2
77
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0)
78
+ ; CHECK-GISEL-NEXT: s_setpc_b64 s[30:31]
79
+ %cmp = icmp ugt i32 %src , 42
80
+ %readfirstlane = call i1 @llvm.amdgcn.readfirstlane.i1 (i1 %cmp )
81
+ %sel = select i1 %readfirstlane , i32 %src , i32 %src1
82
+ store i32 %sel , ptr addrspace (1 ) %out , align 4
83
+ ret void
84
+ }
8
85
9
- define void @test_readfirstlane_i32 (ptr addrspace (1 ) %out , i32 %src ) #1 {
86
+ define void @test_readfirstlane_i1_load (ptr addrspace (1 ) %out , ptr addrspace (1 ) %in ) {
87
+ ; CHECK-SDAG-LABEL: test_readfirstlane_i1_load:
88
+ ; CHECK-SDAG: ; %bb.0:
89
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
90
+ ; CHECK-SDAG-NEXT: flat_load_ubyte v2, v[2:3]
91
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0)
92
+ ; CHECK-SDAG-NEXT: v_readfirstlane_b32 s4, v2
93
+ ; CHECK-SDAG-NEXT: s_and_b32 s4, s4, 1
94
+ ; CHECK-SDAG-NEXT: v_mov_b32_e32 v2, s4
95
+ ; CHECK-SDAG-NEXT: flat_store_byte v[0:1], v2
96
+ ; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0)
97
+ ; CHECK-SDAG-NEXT: s_setpc_b64 s[30:31]
98
+ ;
99
+ ; CHECK-GISEL-LABEL: test_readfirstlane_i1_load:
100
+ ; CHECK-GISEL: ; %bb.0:
101
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
102
+ ; CHECK-GISEL-NEXT: flat_load_ubyte v2, v[2:3]
103
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0)
104
+ ; CHECK-GISEL-NEXT: v_readfirstlane_b32 s4, v2
105
+ ; CHECK-GISEL-NEXT: s_and_b32 s4, s4, 1
106
+ ; CHECK-GISEL-NEXT: v_mov_b32_e32 v2, s4
107
+ ; CHECK-GISEL-NEXT: flat_store_byte v[0:1], v2
108
+ ; CHECK-GISEL-NEXT: s_waitcnt vmcnt(0)
109
+ ; CHECK-GISEL-NEXT: s_setpc_b64 s[30:31]
110
+ %load = load i1 , ptr addrspace (1 ) %in
111
+ %readfirstlane = call i1 @llvm.amdgcn.readfirstlane.i1 (i1 %load )
112
+ store i1 %readfirstlane , ptr addrspace (1 ) %out , align 4
113
+ ret void
114
+ }
115
+
116
+ define void @test_readfirstlane_i32 (ptr addrspace (1 ) %out , i32 %src ) {
10
117
; CHECK-SDAG-LABEL: test_readfirstlane_i32:
11
118
; CHECK-SDAG: ; %bb.0:
12
119
; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -29,7 +136,7 @@ define void @test_readfirstlane_i32(ptr addrspace(1) %out, i32 %src) #1 {
29
136
ret void
30
137
}
31
138
32
- define void @test_readfirstlane_i64 (ptr addrspace (1 ) %out , i64 %src ) # 1 {
139
+ define void @test_readfirstlane_i64 (ptr addrspace (1 ) %out , i64 %src ) {
33
140
; CHECK-SDAG-LABEL: test_readfirstlane_i64:
34
141
; CHECK-SDAG: ; %bb.0:
35
142
; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -56,7 +163,7 @@ define void @test_readfirstlane_i64(ptr addrspace(1) %out, i64 %src) #1 {
56
163
ret void
57
164
}
58
165
59
- define void @test_readfirstlane_f64 (ptr addrspace (1 ) %out , double %src ) # 1 {
166
+ define void @test_readfirstlane_f64 (ptr addrspace (1 ) %out , double %src ) {
60
167
; CHECK-SDAG-LABEL: test_readfirstlane_f64:
61
168
; CHECK-SDAG: ; %bb.0:
62
169
; CHECK-SDAG-NEXT: s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
@@ -83,7 +190,7 @@ define void @test_readfirstlane_f64(ptr addrspace(1) %out, double %src) #1 {
83
190
ret void
84
191
}
85
192
86
- define amdgpu_kernel void @test_readfirstlane_imm_i32 (ptr addrspace (1 ) %out ) # 1 {
193
+ define amdgpu_kernel void @test_readfirstlane_imm_i32 (ptr addrspace (1 ) %out ) {
87
194
; CHECK-SDAG-LABEL: test_readfirstlane_imm_i32:
88
195
; CHECK-SDAG: ; %bb.0:
89
196
; CHECK-SDAG-NEXT: s_mov_b32 s0, 32
@@ -104,7 +211,7 @@ define amdgpu_kernel void @test_readfirstlane_imm_i32(ptr addrspace(1) %out) #1
104
211
ret void
105
212
}
106
213
107
- define amdgpu_kernel void @test_readfirstlane_imm_i64 (ptr addrspace (1 ) %out ) # 1 {
214
+ define amdgpu_kernel void @test_readfirstlane_imm_i64 (ptr addrspace (1 ) %out ) {
108
215
; CHECK-SDAG-LABEL: test_readfirstlane_imm_i64:
109
216
; CHECK-SDAG: ; %bb.0:
110
217
; CHECK-SDAG-NEXT: s_mov_b64 s[0:1], 32
@@ -125,7 +232,7 @@ define amdgpu_kernel void @test_readfirstlane_imm_i64(ptr addrspace(1) %out) #1
125
232
ret void
126
233
}
127
234
128
- define amdgpu_kernel void @test_readfirstlane_imm_f64 (ptr addrspace (1 ) %out ) # 1 {
235
+ define amdgpu_kernel void @test_readfirstlane_imm_f64 (ptr addrspace (1 ) %out ) {
129
236
; CHECK-SDAG-LABEL: test_readfirstlane_imm_f64:
130
237
; CHECK-SDAG: ; %bb.0:
131
238
; CHECK-SDAG-NEXT: s_mov_b32 s0, 0
@@ -148,7 +255,7 @@ define amdgpu_kernel void @test_readfirstlane_imm_f64(ptr addrspace(1) %out) #1
148
255
ret void
149
256
}
150
257
151
- define amdgpu_kernel void @test_readfirstlane_imm_fold_i32 (ptr addrspace (1 ) %out ) # 1 {
258
+ define amdgpu_kernel void @test_readfirstlane_imm_fold_i32 (ptr addrspace (1 ) %out ) {
152
259
; CHECK-SDAG-LABEL: test_readfirstlane_imm_fold_i32:
153
260
; CHECK-SDAG: ; %bb.0:
154
261
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -173,7 +280,7 @@ define amdgpu_kernel void @test_readfirstlane_imm_fold_i32(ptr addrspace(1) %out
173
280
ret void
174
281
}
175
282
176
- define amdgpu_kernel void @test_readfirstlane_imm_fold_i64 (ptr addrspace (1 ) %out ) # 1 {
283
+ define amdgpu_kernel void @test_readfirstlane_imm_fold_i64 (ptr addrspace (1 ) %out ) {
177
284
; CHECK-SDAG-LABEL: test_readfirstlane_imm_fold_i64:
178
285
; CHECK-SDAG: ; %bb.0:
179
286
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -201,7 +308,7 @@ define amdgpu_kernel void @test_readfirstlane_imm_fold_i64(ptr addrspace(1) %out
201
308
ret void
202
309
}
203
310
204
- define amdgpu_kernel void @test_readfirstlane_imm_fold_f64 (ptr addrspace (1 ) %out ) # 1 {
311
+ define amdgpu_kernel void @test_readfirstlane_imm_fold_f64 (ptr addrspace (1 ) %out ) {
205
312
; CHECK-SDAG-LABEL: test_readfirstlane_imm_fold_f64:
206
313
; CHECK-SDAG: ; %bb.0:
207
314
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -230,7 +337,7 @@ define amdgpu_kernel void @test_readfirstlane_imm_fold_f64(ptr addrspace(1) %out
230
337
ret void
231
338
}
232
339
233
- define amdgpu_kernel void @test_readfirstlane_m0 (ptr addrspace (1 ) %out ) # 1 {
340
+ define amdgpu_kernel void @test_readfirstlane_m0 (ptr addrspace (1 ) %out ) {
234
341
; CHECK-SDAG-LABEL: test_readfirstlane_m0:
235
342
; CHECK-SDAG: ; %bb.0:
236
343
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -262,7 +369,7 @@ define amdgpu_kernel void @test_readfirstlane_m0(ptr addrspace(1) %out) #1 {
262
369
ret void
263
370
}
264
371
265
- define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_i32 (ptr addrspace (1 ) %out ) # 1 {
372
+ define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_i32 (ptr addrspace (1 ) %out ) {
266
373
; CHECK-SDAG-LABEL: test_readfirstlane_copy_from_sgpr_i32:
267
374
; CHECK-SDAG: ; %bb.0:
268
375
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -294,7 +401,7 @@ define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_i32(ptr addrspace(1
294
401
ret void
295
402
}
296
403
297
- define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_i64 (ptr addrspace (1 ) %out ) # 1 {
404
+ define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_i64 (ptr addrspace (1 ) %out ) {
298
405
; CHECK-SDAG-LABEL: test_readfirstlane_copy_from_sgpr_i64:
299
406
; CHECK-SDAG: ; %bb.0:
300
407
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -328,7 +435,7 @@ define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_i64(ptr addrspace(1
328
435
ret void
329
436
}
330
437
331
- define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_f64 (ptr addrspace (1 ) %out ) # 1 {
438
+ define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_f64 (ptr addrspace (1 ) %out ) {
332
439
; CHECK-SDAG-LABEL: test_readfirstlane_copy_from_sgpr_f64:
333
440
; CHECK-SDAG: ; %bb.0:
334
441
; CHECK-SDAG-NEXT: s_load_dwordx2 s[0:1], s[6:7], 0x0
@@ -362,7 +469,7 @@ define amdgpu_kernel void @test_readfirstlane_copy_from_sgpr_f64(ptr addrspace(1
362
469
ret void
363
470
}
364
471
365
- define amdgpu_kernel void @test_readfirstlane_fi (ptr addrspace (1 ) %out ) # 1 {
472
+ define amdgpu_kernel void @test_readfirstlane_fi (ptr addrspace (1 ) %out ) {
366
473
; CHECK-SDAG-LABEL: test_readfirstlane_fi:
367
474
; CHECK-SDAG: ; %bb.0:
368
475
; CHECK-SDAG-NEXT: s_add_u32 s0, s0, s15
@@ -593,6 +700,3 @@ define void @test_readfirstlane_v8i16(ptr addrspace(1) %out, <8 x i16> %src) {
593
700
call void asm sideeffect "; use $0" , "s" (<8 x i16 > %x )
594
701
ret void
595
702
}
596
-
597
- attributes #0 = { nounwind readnone convergent }
598
- attributes #1 = { nounwind }
0 commit comments