Skip to content

Commit 235cd75

Browse files
authored
[AMDGPU] s_quadmask* implicitly defines SCC (#161582)
Fix s_quadmask* instruction description so that it defines SCC. --------- Signed-off-by: John Lu <[email protected]>
1 parent e3e0f69 commit 235cd75

File tree

2 files changed

+92
-2
lines changed

2 files changed

+92
-2
lines changed

llvm/lib/Target/AMDGPU/SOPInstructions.td

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -352,10 +352,12 @@ def S_XNOR_SAVEEXEC_B64 : SOP1_64 <"s_xnor_saveexec_b64">;
352352

353353
} // End hasSideEffects = 1, Uses = [EXEC], Defs = [EXEC, SCC]
354354

355+
let Defs = [SCC] in {
355356
def S_QUADMASK_B32 : SOP1_32 <"s_quadmask_b32",
356357
[(set i32:$sdst, (int_amdgcn_s_quadmask i32:$src0))]>;
357358
def S_QUADMASK_B64 : SOP1_64 <"s_quadmask_b64",
358359
[(set i64:$sdst, (int_amdgcn_s_quadmask i64:$src0))]>;
360+
}
359361

360362
let Uses = [M0] in {
361363
def S_MOVRELS_B32 : SOP1_32R <"s_movrels_b32">;

llvm/test/CodeGen/AMDGPU/llvm.amdgcn.quadmask.ll

Lines changed: 90 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 2
2-
; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -global-isel=1 < %s | FileCheck -check-prefixes=GFX11 %s
3-
; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -global-isel=0 < %s | FileCheck -check-prefixes=GFX11 %s
2+
; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -global-isel=1 < %s | FileCheck -check-prefixes=GFX11,GFX11-GISEL %s
3+
; RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -amdgpu-enable-delay-alu=0 -global-isel=0 < %s | FileCheck -check-prefixes=GFX11,GFX11-SDAG %s
44

55
declare i32 @llvm.amdgcn.s.quadmask.i32(i32)
66
declare i64 @llvm.amdgcn.s.quadmask.i64(i64)
@@ -172,3 +172,91 @@ entry:
172172
%qm = call i64 @llvm.amdgcn.s.quadmask.i64(i64 %mask)
173173
ret i64 %qm
174174
}
175+
176+
;; Ensure that AND/ICMP cannot be fused into an AND because s_quadmask_b32 implicitly defines SCC.
177+
define amdgpu_kernel void @test_scc_quadmask_32(i32 %val0, i32 %val1, ptr addrspace(1) %ptr) {
178+
; GFX11-GISEL-LABEL: test_scc_quadmask_32:
179+
; GFX11-GISEL: ; %bb.0:
180+
; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x24
181+
; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, 0
182+
; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
183+
; GFX11-GISEL-NEXT: s_and_b32 s0, s0, 1
184+
; GFX11-GISEL-NEXT: s_quadmask_b32 s1, s1
185+
; GFX11-GISEL-NEXT: s_cmp_eq_u32 s0, 0
186+
; GFX11-GISEL-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v3, s1
187+
; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 0
188+
; GFX11-GISEL-NEXT: v_dual_mov_b32 v1, 0 :: v_dual_mov_b32 v4, s0
189+
; GFX11-GISEL-NEXT: global_store_b32 v2, v3, s[2:3]
190+
; GFX11-GISEL-NEXT: global_store_b32 v[0:1], v4, off
191+
; GFX11-GISEL-NEXT: s_endpgm
192+
;
193+
; GFX11-SDAG-LABEL: test_scc_quadmask_32:
194+
; GFX11-SDAG: ; %bb.0:
195+
; GFX11-SDAG-NEXT: s_load_b128 s[0:3], s[4:5], 0x24
196+
; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, 0
197+
; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
198+
; GFX11-SDAG-NEXT: s_and_b32 s0, s0, 1
199+
; GFX11-SDAG-NEXT: s_quadmask_b32 s1, s1
200+
; GFX11-SDAG-NEXT: s_cmp_eq_u32 s0, 0
201+
; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v3, s1
202+
; GFX11-SDAG-NEXT: s_cselect_b32 s0, -1, 0
203+
; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 0
204+
; GFX11-SDAG-NEXT: v_cndmask_b32_e64 v4, 0, 1, s0
205+
; GFX11-SDAG-NEXT: global_store_b32 v2, v3, s[2:3]
206+
; GFX11-SDAG-NEXT: global_store_b32 v[0:1], v4, off
207+
; GFX11-SDAG-NEXT: s_endpgm
208+
%and = and i32 %val0, 1
209+
%result = call i32 @llvm.amdgcn.s.quadmask.i32(i32 %val1) nounwind readnone
210+
store i32 %result, ptr addrspace(1) %ptr
211+
%cmp = icmp eq i32 %and, 0
212+
%sel = select i1 %cmp, i32 1, i32 0
213+
store i32 %sel, ptr addrspace(1) null, align 4
214+
ret void
215+
}
216+
217+
;; Ensure that AND/ICMP cannot be fused into an AND because s_quadmask_b64 implicitly defines SCC.
218+
define amdgpu_kernel void @test_scc_quadmask_64(i32 %val0, i64 %val1, ptr addrspace(1) %ptr) {
219+
; GFX11-GISEL-LABEL: test_scc_quadmask_64:
220+
; GFX11-GISEL: ; %bb.0:
221+
; GFX11-GISEL-NEXT: s_clause 0x1
222+
; GFX11-GISEL-NEXT: s_load_b128 s[0:3], s[4:5], 0x2c
223+
; GFX11-GISEL-NEXT: s_load_b32 s4, s[4:5], 0x24
224+
; GFX11-GISEL-NEXT: s_waitcnt lgkmcnt(0)
225+
; GFX11-GISEL-NEXT: s_quadmask_b64 s[0:1], s[0:1]
226+
; GFX11-GISEL-NEXT: s_and_b32 s4, s4, 1
227+
; GFX11-GISEL-NEXT: v_mov_b32_e32 v0, s0
228+
; GFX11-GISEL-NEXT: s_cmp_eq_u32 s4, 0
229+
; GFX11-GISEL-NEXT: v_dual_mov_b32 v4, 0 :: v_dual_mov_b32 v1, s1
230+
; GFX11-GISEL-NEXT: s_cselect_b32 s0, 1, 0
231+
; GFX11-GISEL-NEXT: v_dual_mov_b32 v2, 0 :: v_dual_mov_b32 v5, s0
232+
; GFX11-GISEL-NEXT: v_mov_b32_e32 v3, 0
233+
; GFX11-GISEL-NEXT: global_store_b64 v4, v[0:1], s[2:3]
234+
; GFX11-GISEL-NEXT: global_store_b32 v[2:3], v5, off
235+
; GFX11-GISEL-NEXT: s_endpgm
236+
;
237+
; GFX11-SDAG-LABEL: test_scc_quadmask_64:
238+
; GFX11-SDAG: ; %bb.0:
239+
; GFX11-SDAG-NEXT: s_clause 0x1
240+
; GFX11-SDAG-NEXT: s_load_b32 s6, s[4:5], 0x24
241+
; GFX11-SDAG-NEXT: s_load_b128 s[0:3], s[4:5], 0x2c
242+
; GFX11-SDAG-NEXT: v_mov_b32_e32 v4, 0
243+
; GFX11-SDAG-NEXT: s_waitcnt lgkmcnt(0)
244+
; GFX11-SDAG-NEXT: s_and_b32 s4, s6, 1
245+
; GFX11-SDAG-NEXT: s_quadmask_b64 s[0:1], s[0:1]
246+
; GFX11-SDAG-NEXT: s_cmp_eq_u32 s4, 0
247+
; GFX11-SDAG-NEXT: v_dual_mov_b32 v0, 0 :: v_dual_mov_b32 v3, s1
248+
; GFX11-SDAG-NEXT: v_mov_b32_e32 v2, s0
249+
; GFX11-SDAG-NEXT: s_cselect_b32 s0, -1, 0
250+
; GFX11-SDAG-NEXT: v_mov_b32_e32 v1, 0
251+
; GFX11-SDAG-NEXT: v_cndmask_b32_e64 v5, 0, 1, s0
252+
; GFX11-SDAG-NEXT: global_store_b64 v4, v[2:3], s[2:3]
253+
; GFX11-SDAG-NEXT: global_store_b32 v[0:1], v5, off
254+
; GFX11-SDAG-NEXT: s_endpgm
255+
%and = and i32 %val0, 1
256+
%result = call i64 @llvm.amdgcn.s.quadmask.i64(i64 %val1) nounwind readnone
257+
store i64 %result, ptr addrspace(1) %ptr
258+
%cmp = icmp eq i32 %and, 0
259+
%sel = select i1 %cmp, i32 1, i32 0
260+
store i32 %sel, ptr addrspace(1) null, align 4
261+
ret void
262+
}

0 commit comments

Comments
 (0)