Run DCE after a LoopFlatten test to reduce spurious output [nfc]
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / llvm.amdgcn.set.inactive.ll
blob72061ca90da72390bb635dee9053a33197a2c965
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
3 ; RUN: llc -march=amdgcn -mcpu=tonga -mattr=-flat-for-global -early-live-intervals -verify-machineinstrs < %s | FileCheck -check-prefix=GCN %s
5 define amdgpu_kernel void @set_inactive(ptr addrspace(1) %out, i32 %in) {
6 ; GCN-LABEL: set_inactive:
7 ; GCN:       ; %bb.0:
8 ; GCN-NEXT:    s_load_dword s4, s[0:1], 0x2c
9 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
10 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
11 ; GCN-NEXT:    s_mov_b32 s2, -1
12 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
13 ; GCN-NEXT:    v_mov_b32_e32 v0, s4
14 ; GCN-NEXT:    s_not_b64 exec, exec
15 ; GCN-NEXT:    v_mov_b32_e32 v0, 42
16 ; GCN-NEXT:    s_not_b64 exec, exec
17 ; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0
18 ; GCN-NEXT:    s_endpgm
19   %tmp = call i32 @llvm.amdgcn.set.inactive.i32(i32 %in, i32 42) #0
20   store i32 %tmp, ptr addrspace(1) %out
21   ret void
24 define amdgpu_kernel void @set_inactive_imm_poison(ptr addrspace(1) %out) {
25 ; GCN-LABEL: set_inactive_imm_poison:
26 ; GCN:       ; %bb.0:
27 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
28 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
29 ; GCN-NEXT:    s_mov_b32 s2, -1
30 ; GCN-NEXT:    v_mov_b32_e32 v0, 1
31 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
32 ; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0
33 ; GCN-NEXT:    s_endpgm
34   %tmp = call i32 @llvm.amdgcn.set.inactive.i32(i32 1, i32 poison) #0
35   store i32 %tmp, ptr addrspace(1) %out
36   ret void
39 define amdgpu_kernel void @set_inactive_64(ptr addrspace(1) %out, i64 %in) {
40 ; GCN-LABEL: set_inactive_64:
41 ; GCN:       ; %bb.0:
42 ; GCN-NEXT:    s_load_dwordx4 s[0:3], s[0:1], 0x24
43 ; GCN-NEXT:    s_mov_b32 s7, 0xf000
44 ; GCN-NEXT:    s_mov_b32 s6, -1
45 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
46 ; GCN-NEXT:    v_mov_b32_e32 v0, s2
47 ; GCN-NEXT:    s_mov_b32 s4, s0
48 ; GCN-NEXT:    s_mov_b32 s5, s1
49 ; GCN-NEXT:    v_mov_b32_e32 v1, s3
50 ; GCN-NEXT:    s_not_b64 exec, exec
51 ; GCN-NEXT:    v_mov_b32_e32 v0, 0
52 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
53 ; GCN-NEXT:    s_not_b64 exec, exec
54 ; GCN-NEXT:    buffer_store_dwordx2 v[0:1], off, s[4:7], 0
55 ; GCN-NEXT:    s_endpgm
56   %tmp = call i64 @llvm.amdgcn.set.inactive.i64(i64 %in, i64 0) #0
57   store i64 %tmp, ptr addrspace(1) %out
58   ret void
61 define amdgpu_kernel void @set_inactive_imm_poison_64(ptr addrspace(1) %out) {
62 ; GCN-LABEL: set_inactive_imm_poison_64:
63 ; GCN:       ; %bb.0:
64 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
65 ; GCN-NEXT:    v_mov_b32_e32 v0, 1
66 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
67 ; GCN-NEXT:    s_mov_b32 s2, -1
68 ; GCN-NEXT:    v_mov_b32_e32 v1, 0
69 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
70 ; GCN-NEXT:    buffer_store_dwordx2 v[0:1], off, s[0:3], 0
71 ; GCN-NEXT:    s_endpgm
72   %tmp = call i64 @llvm.amdgcn.set.inactive.i64(i64 1, i64 poison) #0
73   store i64 %tmp, ptr addrspace(1) %out
74   ret void
77 define amdgpu_kernel void @set_inactive_scc(ptr addrspace(1) %out, i32 %in, <4 x i32> inreg %desc) {
78 ; GCN-LABEL: set_inactive_scc:
79 ; GCN:       ; %bb.0:
80 ; GCN-NEXT:    s_load_dwordx4 s[4:7], s[0:1], 0x34
81 ; GCN-NEXT:    s_load_dword s2, s[0:1], 0x2c
82 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
83 ; GCN-NEXT:    s_buffer_load_dword s3, s[4:7], 0x0
84 ; GCN-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x24
85 ; GCN-NEXT:    v_mov_b32_e32 v0, s2
86 ; GCN-NEXT:    s_not_b64 exec, exec
87 ; GCN-NEXT:    v_mov_b32_e32 v0, 42
88 ; GCN-NEXT:    s_not_b64 exec, exec
89 ; GCN-NEXT:    s_waitcnt lgkmcnt(0)
90 ; GCN-NEXT:    s_cmp_lg_u32 s3, 56
91 ; GCN-NEXT:    s_mov_b64 s[2:3], -1
92 ; GCN-NEXT:    s_cbranch_scc1 .LBB4_3
93 ; GCN-NEXT:  ; %bb.1: ; %Flow
94 ; GCN-NEXT:    s_andn2_b64 vcc, exec, s[2:3]
95 ; GCN-NEXT:    s_cbranch_vccz .LBB4_4
96 ; GCN-NEXT:  .LBB4_2: ; %.exit
97 ; GCN-NEXT:    s_endpgm
98 ; GCN-NEXT:  .LBB4_3: ; %.one
99 ; GCN-NEXT:    v_add_u32_e32 v1, vcc, 1, v0
100 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
101 ; GCN-NEXT:    s_mov_b32 s2, -1
102 ; GCN-NEXT:    buffer_store_dword v1, off, s[0:3], 0
103 ; GCN-NEXT:    s_mov_b64 s[2:3], 0
104 ; GCN-NEXT:    s_cbranch_execnz .LBB4_2
105 ; GCN-NEXT:  .LBB4_4: ; %.zero
106 ; GCN-NEXT:    s_mov_b32 s3, 0xf000
107 ; GCN-NEXT:    s_mov_b32 s2, -1
108 ; GCN-NEXT:    buffer_store_dword v0, off, s[0:3], 0
109 ; GCN-NEXT:    s_endpgm
110   %val = call i32 @llvm.amdgcn.s.buffer.load.i32(<4 x i32> %desc, i32 0, i32 0)
111   %cmp = icmp eq i32 %val, 56
112   %tmp = call i32 @llvm.amdgcn.set.inactive.i32(i32 %in, i32 42) #0
113   br i1 %cmp, label %.zero, label %.one
115 .zero:
116   store i32 %tmp, ptr addrspace(1) %out
117   br label %.exit
119 .one:
120   %tmp.1 = add i32 %tmp, 1
121   store i32 %tmp.1, ptr addrspace(1) %out
122   br label %.exit
124 .exit:
125   ret void
128 declare i32 @llvm.amdgcn.set.inactive.i32(i32, i32) #0
129 declare i64 @llvm.amdgcn.set.inactive.i64(i64, i64) #0
130 declare i32 @llvm.amdgcn.s.buffer.load.i32(<4 x i32>, i32, i32)
132 attributes #0 = { convergent readnone }