[clang][modules] Don't prevent translation of FW_Private includes when explicitly...
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / need-fp-from-vgpr-spills.ll
blobf4114a01e9b486331563b013fcb6c1e11b426ffa
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -O0 -verify-machineinstrs < %s | FileCheck %s
4 ; FP is in CSR range, modified.
5 define hidden fastcc void @callee_has_fp() #1 {
6 ; CHECK-LABEL: callee_has_fp:
7 ; CHECK:       ; %bb.0:
8 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
9 ; CHECK-NEXT:    s_mov_b32 s4, s33
10 ; CHECK-NEXT:    s_mov_b32 s33, s32
11 ; CHECK-NEXT:    s_add_i32 s32, s32, 0x200
12 ; CHECK-NEXT:    v_mov_b32_e32 v0, 1
13 ; CHECK-NEXT:    buffer_store_dword v0, off, s[0:3], s33
14 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
15 ; CHECK-NEXT:    s_add_i32 s32, s32, 0xfffffe00
16 ; CHECK-NEXT:    s_mov_b32 s33, s4
17 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
18   %alloca = alloca i32, addrspace(5)
19   store volatile i32 1, ptr addrspace(5) %alloca
20   ret void
23 ; Has no stack objects, but introduces them due to the CSR spill. We
24 ; see the FP modified in the callee with IPRA. We should not have
25 ; redundant spills of s33 or assert.
26 define internal fastcc void @csr_vgpr_spill_fp_callee() #0 {
27 ; CHECK-LABEL: csr_vgpr_spill_fp_callee:
28 ; CHECK:       ; %bb.0: ; %bb
29 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30 ; CHECK-NEXT:    s_mov_b32 s18, s33
31 ; CHECK-NEXT:    s_mov_b32 s33, s32
32 ; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -1
33 ; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s33 offset:4 ; 4-byte Folded Spill
34 ; CHECK-NEXT:    s_mov_b64 exec, s[16:17]
35 ; CHECK-NEXT:    s_add_i32 s32, s32, 0x400
36 ; CHECK-NEXT:    buffer_store_dword v40, off, s[0:3], s33 ; 4-byte Folded Spill
37 ; CHECK-NEXT:    v_writelane_b32 v1, s30, 0
38 ; CHECK-NEXT:    v_writelane_b32 v1, s31, 1
39 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
40 ; CHECK-NEXT:    s_add_u32 s16, s16, callee_has_fp@rel32@lo+4
41 ; CHECK-NEXT:    s_addc_u32 s17, s17, callee_has_fp@rel32@hi+12
42 ; CHECK-NEXT:    s_mov_b64 s[22:23], s[2:3]
43 ; CHECK-NEXT:    s_mov_b64 s[20:21], s[0:1]
44 ; CHECK-NEXT:    s_mov_b64 s[0:1], s[20:21]
45 ; CHECK-NEXT:    s_mov_b64 s[2:3], s[22:23]
46 ; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
47 ; CHECK-NEXT:    ;;#ASMSTART
48 ; CHECK-NEXT:    ; clobber csr v40
49 ; CHECK-NEXT:    ;;#ASMEND
50 ; CHECK-NEXT:    v_readlane_b32 s31, v1, 1
51 ; CHECK-NEXT:    v_readlane_b32 s30, v1, 0
52 ; CHECK-NEXT:    buffer_load_dword v40, off, s[0:3], s33 ; 4-byte Folded Reload
53 ; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -1
54 ; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s33 offset:4 ; 4-byte Folded Reload
55 ; CHECK-NEXT:    s_mov_b64 exec, s[4:5]
56 ; CHECK-NEXT:    s_add_i32 s32, s32, 0xfffffc00
57 ; CHECK-NEXT:    s_mov_b32 s33, s18
58 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
59 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
60 bb:
61   call fastcc void @callee_has_fp()
62   call void asm sideeffect "; clobber csr v40", "~{v40}"()
63   ret void
66 define amdgpu_kernel void @kernel_call() {
67 ; CHECK-LABEL: kernel_call:
68 ; CHECK:       ; %bb.0: ; %bb
69 ; CHECK-NEXT:    s_mov_b32 s32, 0x400
70 ; CHECK-NEXT:    s_add_u32 flat_scratch_lo, s12, s17
71 ; CHECK-NEXT:    s_addc_u32 flat_scratch_hi, s13, 0
72 ; CHECK-NEXT:    s_add_u32 s0, s0, s17
73 ; CHECK-NEXT:    s_addc_u32 s1, s1, 0
74 ; CHECK-NEXT:    ; implicit-def: $vgpr3 : SGPR spill to VGPR lane
75 ; CHECK-NEXT:    v_writelane_b32 v3, s16, 0
76 ; CHECK-NEXT:    s_or_saveexec_b64 s[24:25], -1
77 ; CHECK-NEXT:    buffer_store_dword v3, off, s[0:3], 0 offset:4 ; 4-byte Folded Spill
78 ; CHECK-NEXT:    s_mov_b64 exec, s[24:25]
79 ; CHECK-NEXT:    s_mov_b32 s13, s15
80 ; CHECK-NEXT:    s_mov_b32 s12, s14
81 ; CHECK-NEXT:    v_readlane_b32 s14, v3, 0
82 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
83 ; CHECK-NEXT:    s_add_u32 s16, s16, csr_vgpr_spill_fp_callee@rel32@lo+4
84 ; CHECK-NEXT:    s_addc_u32 s17, s17, csr_vgpr_spill_fp_callee@rel32@hi+12
85 ; CHECK-NEXT:    s_mov_b64 s[22:23], s[2:3]
86 ; CHECK-NEXT:    s_mov_b64 s[20:21], s[0:1]
87 ; CHECK-NEXT:    s_mov_b32 s15, 20
88 ; CHECK-NEXT:    v_lshlrev_b32_e64 v2, s15, v2
89 ; CHECK-NEXT:    s_mov_b32 s15, 10
90 ; CHECK-NEXT:    v_lshlrev_b32_e64 v1, s15, v1
91 ; CHECK-NEXT:    v_or3_b32 v31, v0, v1, v2
92 ; CHECK-NEXT:    ; implicit-def: $sgpr15
93 ; CHECK-NEXT:    s_mov_b64 s[0:1], s[20:21]
94 ; CHECK-NEXT:    s_mov_b64 s[2:3], s[22:23]
95 ; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
96 ; CHECK-NEXT:    s_or_saveexec_b64 s[24:25], -1
97 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], 0 offset:4 ; 4-byte Folded Reload
98 ; CHECK-NEXT:    s_mov_b64 exec, s[24:25]
99 ; CHECK-NEXT:    ; kill: killed $vgpr0
100 ; CHECK-NEXT:    s_endpgm
102   tail call fastcc void @csr_vgpr_spill_fp_callee()
103   ret void
106 ; Same, except with a tail call.
107 define internal fastcc void @csr_vgpr_spill_fp_tailcall_callee() #0 {
108 ; CHECK-LABEL: csr_vgpr_spill_fp_tailcall_callee:
109 ; CHECK:       ; %bb.0: ; %bb
110 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
111 ; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -1
112 ; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Spill
113 ; CHECK-NEXT:    s_mov_b64 exec, s[16:17]
114 ; CHECK-NEXT:    buffer_store_dword v40, off, s[0:3], s32 ; 4-byte Folded Spill
115 ; CHECK-NEXT:    v_writelane_b32 v1, s33, 0
116 ; CHECK-NEXT:    ;;#ASMSTART
117 ; CHECK-NEXT:    ; clobber csr v40
118 ; CHECK-NEXT:    ;;#ASMEND
119 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
120 ; CHECK-NEXT:    s_add_u32 s16, s16, callee_has_fp@rel32@lo+4
121 ; CHECK-NEXT:    s_addc_u32 s17, s17, callee_has_fp@rel32@hi+12
122 ; CHECK-NEXT:    v_readlane_b32 s33, v1, 0
123 ; CHECK-NEXT:    buffer_load_dword v40, off, s[0:3], s32 ; 4-byte Folded Reload
124 ; CHECK-NEXT:    s_xor_saveexec_b64 s[18:19], -1
125 ; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s32 offset:4 ; 4-byte Folded Reload
126 ; CHECK-NEXT:    s_mov_b64 exec, s[18:19]
127 ; CHECK-NEXT:    s_setpc_b64 s[16:17]
129   call void asm sideeffect "; clobber csr v40", "~{v40}"()
130   tail call fastcc void @callee_has_fp()
131   ret void
134 define amdgpu_kernel void @kernel_tailcall() {
135 ; CHECK-LABEL: kernel_tailcall:
136 ; CHECK:       ; %bb.0: ; %bb
137 ; CHECK-NEXT:    s_mov_b32 s32, 0x400
138 ; CHECK-NEXT:    s_add_u32 flat_scratch_lo, s12, s17
139 ; CHECK-NEXT:    s_addc_u32 flat_scratch_hi, s13, 0
140 ; CHECK-NEXT:    s_add_u32 s0, s0, s17
141 ; CHECK-NEXT:    s_addc_u32 s1, s1, 0
142 ; CHECK-NEXT:    ; implicit-def: $vgpr3 : SGPR spill to VGPR lane
143 ; CHECK-NEXT:    v_writelane_b32 v3, s16, 0
144 ; CHECK-NEXT:    s_or_saveexec_b64 s[24:25], -1
145 ; CHECK-NEXT:    buffer_store_dword v3, off, s[0:3], 0 offset:4 ; 4-byte Folded Spill
146 ; CHECK-NEXT:    s_mov_b64 exec, s[24:25]
147 ; CHECK-NEXT:    s_mov_b32 s13, s15
148 ; CHECK-NEXT:    s_mov_b32 s12, s14
149 ; CHECK-NEXT:    v_readlane_b32 s14, v3, 0
150 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
151 ; CHECK-NEXT:    s_add_u32 s16, s16, csr_vgpr_spill_fp_tailcall_callee@rel32@lo+4
152 ; CHECK-NEXT:    s_addc_u32 s17, s17, csr_vgpr_spill_fp_tailcall_callee@rel32@hi+12
153 ; CHECK-NEXT:    s_mov_b64 s[22:23], s[2:3]
154 ; CHECK-NEXT:    s_mov_b64 s[20:21], s[0:1]
155 ; CHECK-NEXT:    s_mov_b32 s15, 20
156 ; CHECK-NEXT:    v_lshlrev_b32_e64 v2, s15, v2
157 ; CHECK-NEXT:    s_mov_b32 s15, 10
158 ; CHECK-NEXT:    v_lshlrev_b32_e64 v1, s15, v1
159 ; CHECK-NEXT:    v_or3_b32 v31, v0, v1, v2
160 ; CHECK-NEXT:    ; implicit-def: $sgpr15
161 ; CHECK-NEXT:    s_mov_b64 s[0:1], s[20:21]
162 ; CHECK-NEXT:    s_mov_b64 s[2:3], s[22:23]
163 ; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
164 ; CHECK-NEXT:    s_or_saveexec_b64 s[24:25], -1
165 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], 0 offset:4 ; 4-byte Folded Reload
166 ; CHECK-NEXT:    s_mov_b64 exec, s[24:25]
167 ; CHECK-NEXT:    ; kill: killed $vgpr0
168 ; CHECK-NEXT:    s_endpgm
170   tail call fastcc void @csr_vgpr_spill_fp_tailcall_callee()
171   ret void
174 define hidden i32 @tail_call() #1 {
175 ; CHECK-LABEL: tail_call:
176 ; CHECK:       ; %bb.0: ; %entry
177 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
178 ; CHECK-NEXT:    s_mov_b32 s4, s33
179 ; CHECK-NEXT:    s_mov_b32 s33, s32
180 ; CHECK-NEXT:    v_mov_b32_e32 v0, 0
181 ; CHECK-NEXT:    s_mov_b32 s33, s4
182 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
183 entry:
184   ret i32 0
187 define hidden i32 @caller_save_vgpr_spill_fp_tail_call() #0 {
188 ; CHECK-LABEL: caller_save_vgpr_spill_fp_tail_call:
189 ; CHECK:       ; %bb.0: ; %entry
190 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
191 ; CHECK-NEXT:    s_mov_b32 s18, s33
192 ; CHECK-NEXT:    s_mov_b32 s33, s32
193 ; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -1
194 ; CHECK-NEXT:    buffer_store_dword v1, off, s[0:3], s33 ; 4-byte Folded Spill
195 ; CHECK-NEXT:    s_mov_b64 exec, s[16:17]
196 ; CHECK-NEXT:    s_add_i32 s32, s32, 0x400
197 ; CHECK-NEXT:    v_writelane_b32 v1, s30, 0
198 ; CHECK-NEXT:    v_writelane_b32 v1, s31, 1
199 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
200 ; CHECK-NEXT:    s_add_u32 s16, s16, tail_call@rel32@lo+4
201 ; CHECK-NEXT:    s_addc_u32 s17, s17, tail_call@rel32@hi+12
202 ; CHECK-NEXT:    s_mov_b64 s[22:23], s[2:3]
203 ; CHECK-NEXT:    s_mov_b64 s[20:21], s[0:1]
204 ; CHECK-NEXT:    s_mov_b64 s[0:1], s[20:21]
205 ; CHECK-NEXT:    s_mov_b64 s[2:3], s[22:23]
206 ; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
207 ; CHECK-NEXT:    v_readlane_b32 s31, v1, 1
208 ; CHECK-NEXT:    v_readlane_b32 s30, v1, 0
209 ; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -1
210 ; CHECK-NEXT:    buffer_load_dword v1, off, s[0:3], s33 ; 4-byte Folded Reload
211 ; CHECK-NEXT:    s_mov_b64 exec, s[4:5]
212 ; CHECK-NEXT:    s_add_i32 s32, s32, 0xfffffc00
213 ; CHECK-NEXT:    s_mov_b32 s33, s18
214 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
215 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
216 entry:
217   %call = call i32 @tail_call()
218   ret i32 %call
221 define hidden i32 @caller_save_vgpr_spill_fp() #0 {
222 ; CHECK-LABEL: caller_save_vgpr_spill_fp:
223 ; CHECK:       ; %bb.0: ; %entry
224 ; CHECK-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
225 ; CHECK-NEXT:    s_mov_b32 s19, s33
226 ; CHECK-NEXT:    s_mov_b32 s33, s32
227 ; CHECK-NEXT:    s_xor_saveexec_b64 s[16:17], -1
228 ; CHECK-NEXT:    buffer_store_dword v2, off, s[0:3], s33 ; 4-byte Folded Spill
229 ; CHECK-NEXT:    s_mov_b64 exec, s[16:17]
230 ; CHECK-NEXT:    s_add_i32 s32, s32, 0x400
231 ; CHECK-NEXT:    v_writelane_b32 v2, s30, 0
232 ; CHECK-NEXT:    v_writelane_b32 v2, s31, 1
233 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
234 ; CHECK-NEXT:    s_add_u32 s16, s16, caller_save_vgpr_spill_fp_tail_call@rel32@lo+4
235 ; CHECK-NEXT:    s_addc_u32 s17, s17, caller_save_vgpr_spill_fp_tail_call@rel32@hi+12
236 ; CHECK-NEXT:    s_mov_b64 s[22:23], s[2:3]
237 ; CHECK-NEXT:    s_mov_b64 s[20:21], s[0:1]
238 ; CHECK-NEXT:    s_mov_b64 s[0:1], s[20:21]
239 ; CHECK-NEXT:    s_mov_b64 s[2:3], s[22:23]
240 ; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
241 ; CHECK-NEXT:    v_readlane_b32 s31, v2, 1
242 ; CHECK-NEXT:    v_readlane_b32 s30, v2, 0
243 ; CHECK-NEXT:    s_xor_saveexec_b64 s[4:5], -1
244 ; CHECK-NEXT:    buffer_load_dword v2, off, s[0:3], s33 ; 4-byte Folded Reload
245 ; CHECK-NEXT:    s_mov_b64 exec, s[4:5]
246 ; CHECK-NEXT:    s_add_i32 s32, s32, 0xfffffc00
247 ; CHECK-NEXT:    s_mov_b32 s33, s19
248 ; CHECK-NEXT:    s_waitcnt vmcnt(0)
249 ; CHECK-NEXT:    s_setpc_b64 s[30:31]
250 entry:
251   %call = call i32 @caller_save_vgpr_spill_fp_tail_call()
252   ret i32 %call
255 define protected amdgpu_kernel void @kernel() {
256 ; CHECK-LABEL: kernel:
257 ; CHECK:       ; %bb.0: ; %entry
258 ; CHECK-NEXT:    s_mov_b32 s32, 0x400
259 ; CHECK-NEXT:    s_add_u32 flat_scratch_lo, s12, s17
260 ; CHECK-NEXT:    s_addc_u32 flat_scratch_hi, s13, 0
261 ; CHECK-NEXT:    s_add_u32 s0, s0, s17
262 ; CHECK-NEXT:    s_addc_u32 s1, s1, 0
263 ; CHECK-NEXT:    ; implicit-def: $vgpr3 : SGPR spill to VGPR lane
264 ; CHECK-NEXT:    v_writelane_b32 v3, s16, 0
265 ; CHECK-NEXT:    s_or_saveexec_b64 s[24:25], -1
266 ; CHECK-NEXT:    buffer_store_dword v3, off, s[0:3], 0 offset:4 ; 4-byte Folded Spill
267 ; CHECK-NEXT:    s_mov_b64 exec, s[24:25]
268 ; CHECK-NEXT:    s_mov_b32 s13, s15
269 ; CHECK-NEXT:    s_mov_b32 s12, s14
270 ; CHECK-NEXT:    v_readlane_b32 s14, v3, 0
271 ; CHECK-NEXT:    s_getpc_b64 s[16:17]
272 ; CHECK-NEXT:    s_add_u32 s16, s16, caller_save_vgpr_spill_fp@rel32@lo+4
273 ; CHECK-NEXT:    s_addc_u32 s17, s17, caller_save_vgpr_spill_fp@rel32@hi+12
274 ; CHECK-NEXT:    s_mov_b64 s[22:23], s[2:3]
275 ; CHECK-NEXT:    s_mov_b64 s[20:21], s[0:1]
276 ; CHECK-NEXT:    s_mov_b32 s15, 20
277 ; CHECK-NEXT:    v_lshlrev_b32_e64 v2, s15, v2
278 ; CHECK-NEXT:    s_mov_b32 s15, 10
279 ; CHECK-NEXT:    v_lshlrev_b32_e64 v1, s15, v1
280 ; CHECK-NEXT:    v_or3_b32 v31, v0, v1, v2
281 ; CHECK-NEXT:    ; implicit-def: $sgpr15
282 ; CHECK-NEXT:    s_mov_b64 s[0:1], s[20:21]
283 ; CHECK-NEXT:    s_mov_b64 s[2:3], s[22:23]
284 ; CHECK-NEXT:    s_swappc_b64 s[30:31], s[16:17]
285 ; CHECK-NEXT:    ; kill: def $vgpr1 killed $vgpr0 killed $exec
286 ; CHECK-NEXT:    s_or_saveexec_b64 s[24:25], -1
287 ; CHECK-NEXT:    buffer_load_dword v0, off, s[0:3], 0 offset:4 ; 4-byte Folded Reload
288 ; CHECK-NEXT:    s_mov_b64 exec, s[24:25]
289 ; CHECK-NEXT:    ; kill: killed $vgpr0
290 ; CHECK-NEXT:    s_endpgm
291 entry:
292   %call = call i32 @caller_save_vgpr_spill_fp()
293   ret void
296 attributes #0 = { "frame-pointer"="none" noinline }
297 attributes #1 = { "frame-pointer"="all" noinline }