[AMDGPU] Mark AGPR tuple implicit in the first instr of AGPR spills. (#115285)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / local-stack-alloc-block-sp-reference.ll
blob29fbb0bb1c6c97e4d36d34154a3523e3b0a07638
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 < %s | FileCheck --check-prefix=MUBUF %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx906 --mattr=+enable-flat-scratch < %s | FileCheck --check-prefix=FLATSCR %s
5 ; Make sure we use the correct frame offset is used with the local
6 ; frame area.
8 ; %pin.low is allocated to offset 0.
10 ; %local.area is assigned to the local frame offset by the
11 ; LocalStackSlotAllocation pass at offset 4096.
13 ; The %load1 access to %gep.large.offset initially used the stack
14 ; pointer register and directly referenced the frame index. After
15 ; LocalStackSlotAllocation, it would no longer refer to a frame index
16 ; so eliminateFrameIndex would not adjust the access to use the
17 ; correct FP offset.
19 define amdgpu_kernel void @local_stack_offset_uses_sp(ptr addrspace(1) %out) {
20 ; MUBUF-LABEL: local_stack_offset_uses_sp:
21 ; MUBUF:       ; %bb.0: ; %entry
22 ; MUBUF-NEXT:    s_add_u32 s0, s0, s17
23 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x3000
24 ; MUBUF-NEXT:    s_addc_u32 s1, s1, 0
25 ; MUBUF-NEXT:    v_add_u32_e32 v0, 64, v1
26 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0
27 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x2000
28 ; MUBUF-NEXT:    s_mov_b32 s4, 0
29 ; MUBUF-NEXT:    buffer_store_dword v1, v2, s[0:3], 0 offen
30 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
31 ; MUBUF-NEXT:  .LBB0_1: ; %loadstoreloop
32 ; MUBUF-NEXT:    ; =>This Inner Loop Header: Depth=1
33 ; MUBUF-NEXT:    v_mov_b32_e32 v3, 0x3000
34 ; MUBUF-NEXT:    v_add_u32_e32 v2, s4, v3
35 ; MUBUF-NEXT:    s_add_i32 s4, s4, 1
36 ; MUBUF-NEXT:    s_cmpk_lt_u32 s4, 0x2120
37 ; MUBUF-NEXT:    buffer_store_byte v1, v2, s[0:3], 0 offen
38 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
39 ; MUBUF-NEXT:    s_cbranch_scc1 .LBB0_1
40 ; MUBUF-NEXT:  ; %bb.2: ; %split
41 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x50d0
42 ; MUBUF-NEXT:    buffer_load_dword v2, v1, s[0:3], 0 offen glc
43 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
44 ; MUBUF-NEXT:    buffer_load_dword v3, v1, s[0:3], 0 offen offset:4 glc
45 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
46 ; MUBUF-NEXT:    buffer_load_dword v4, v0, s[0:3], 0 offen glc
47 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
48 ; MUBUF-NEXT:    buffer_load_dword v5, v0, s[0:3], 0 offen offset:4 glc
49 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
50 ; MUBUF-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0
51 ; MUBUF-NEXT:    v_mov_b32_e32 v6, 0
52 ; MUBUF-NEXT:    v_add_co_u32_e32 v0, vcc, v2, v4
53 ; MUBUF-NEXT:    v_addc_co_u32_e32 v1, vcc, v3, v5, vcc
54 ; MUBUF-NEXT:    s_waitcnt lgkmcnt(0)
55 ; MUBUF-NEXT:    global_store_dwordx2 v6, v[0:1], s[4:5]
56 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
57 ; MUBUF-NEXT:    s_endpgm
59 ; FLATSCR-LABEL: local_stack_offset_uses_sp:
60 ; FLATSCR:       ; %bb.0: ; %entry
61 ; FLATSCR-NEXT:    s_add_u32 flat_scratch_lo, s8, s13
62 ; FLATSCR-NEXT:    s_addc_u32 flat_scratch_hi, s9, 0
63 ; FLATSCR-NEXT:    v_mov_b32_e32 v0, 0
64 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x2000
65 ; FLATSCR-NEXT:    scratch_store_dword off, v0, s0
66 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
67 ; FLATSCR-NEXT:    s_mov_b32 s0, 0
68 ; FLATSCR-NEXT:  .LBB0_1: ; %loadstoreloop
69 ; FLATSCR-NEXT:    ; =>This Inner Loop Header: Depth=1
70 ; FLATSCR-NEXT:    s_add_i32 s1, s0, 0x3000
71 ; FLATSCR-NEXT:    s_add_i32 s0, s0, 1
72 ; FLATSCR-NEXT:    s_cmpk_lt_u32 s0, 0x2120
73 ; FLATSCR-NEXT:    scratch_store_byte off, v0, s1
74 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
75 ; FLATSCR-NEXT:    s_cbranch_scc1 .LBB0_1
76 ; FLATSCR-NEXT:  ; %bb.2: ; %split
77 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x2000
78 ; FLATSCR-NEXT:    s_addk_i32 s0, 0x3000
79 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[0:1], off, s0 offset:208 glc
80 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
81 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x3000
82 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[2:3], off, s0 offset:64 glc
83 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
84 ; FLATSCR-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
85 ; FLATSCR-NEXT:    v_mov_b32_e32 v4, 0
86 ; FLATSCR-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v2
87 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v3, vcc
88 ; FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
89 ; FLATSCR-NEXT:    global_store_dwordx2 v4, v[0:1], s[0:1]
90 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
91 ; FLATSCR-NEXT:    s_endpgm
92 entry:
93   %pin.low = alloca i32, align 8192, addrspace(5)
94   %local.area = alloca [1060 x i64], align 4096, addrspace(5)
95   store volatile i32 0, ptr addrspace(5) %pin.low
96   call void @llvm.memset.p5.i32(ptr addrspace(5) align 4 %local.area, i8 0, i32 8480, i1 true)
97   %gep.large.offset = getelementptr inbounds [1060 x i64], ptr addrspace(5) %local.area, i64 0, i64 1050
98   %gep.small.offset = getelementptr inbounds [1060 x i64], ptr addrspace(5) %local.area, i64 0, i64 8
99   %load0 = load volatile i64, ptr addrspace(5) %gep.large.offset
100   %load1 = load volatile i64, ptr addrspace(5) %gep.small.offset
101   %add0 = add i64 %load0, %load1
102   store volatile i64 %add0, ptr addrspace(1) %out
103   ret void
106 define void @func_local_stack_offset_uses_sp(ptr addrspace(1) %out) {
107 ; MUBUF-LABEL: func_local_stack_offset_uses_sp:
108 ; MUBUF:       ; %bb.0: ; %entry
109 ; MUBUF-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
110 ; MUBUF-NEXT:    s_mov_b32 s5, s33
111 ; MUBUF-NEXT:    s_add_i32 s33, s32, 0x7ffc0
112 ; MUBUF-NEXT:    s_and_b32 s33, s33, 0xfff80000
113 ; MUBUF-NEXT:    v_lshrrev_b32_e64 v3, 6, s33
114 ; MUBUF-NEXT:    v_add_u32_e32 v3, 0x3000, v3
115 ; MUBUF-NEXT:    v_add_u32_e32 v2, 64, v3
116 ; MUBUF-NEXT:    v_mov_b32_e32 v3, 0
117 ; MUBUF-NEXT:    v_mov_b32_e32 v4, 0x2000
118 ; MUBUF-NEXT:    s_mov_b32 s4, 0
119 ; MUBUF-NEXT:    s_add_i32 s32, s32, 0x200000
120 ; MUBUF-NEXT:    buffer_store_dword v3, v4, s[0:3], s33 offen
121 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
122 ; MUBUF-NEXT:  .LBB1_1: ; %loadstoreloop
123 ; MUBUF-NEXT:    ; =>This Inner Loop Header: Depth=1
124 ; MUBUF-NEXT:    v_lshrrev_b32_e64 v5, 6, s33
125 ; MUBUF-NEXT:    v_add_u32_e32 v4, s4, v5
126 ; MUBUF-NEXT:    v_mov_b32_e32 v5, 0x3000
127 ; MUBUF-NEXT:    s_add_i32 s4, s4, 1
128 ; MUBUF-NEXT:    v_add_u32_e32 v4, v5, v4
129 ; MUBUF-NEXT:    s_cmpk_lt_u32 s4, 0x2120
130 ; MUBUF-NEXT:    buffer_store_byte v3, v4, s[0:3], 0 offen
131 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
132 ; MUBUF-NEXT:    s_cbranch_scc1 .LBB1_1
133 ; MUBUF-NEXT:  ; %bb.2: ; %split
134 ; MUBUF-NEXT:    v_lshrrev_b32_e64 v4, 6, s33
135 ; MUBUF-NEXT:    v_add_u32_e32 v3, 0x50d0, v4
136 ; MUBUF-NEXT:    buffer_load_dword v4, v3, s[0:3], 0 offen glc
137 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
138 ; MUBUF-NEXT:    buffer_load_dword v5, v3, s[0:3], 0 offen offset:4 glc
139 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
140 ; MUBUF-NEXT:    buffer_load_dword v6, v2, s[0:3], 0 offen glc
141 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
142 ; MUBUF-NEXT:    buffer_load_dword v7, v2, s[0:3], 0 offen offset:4 glc
143 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
144 ; MUBUF-NEXT:    s_add_i32 s32, s32, 0xffe00000
145 ; MUBUF-NEXT:    s_mov_b32 s33, s5
146 ; MUBUF-NEXT:    v_add_co_u32_e32 v2, vcc, v4, v6
147 ; MUBUF-NEXT:    v_addc_co_u32_e32 v3, vcc, v5, v7, vcc
148 ; MUBUF-NEXT:    global_store_dwordx2 v[0:1], v[2:3], off
149 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
150 ; MUBUF-NEXT:    s_setpc_b64 s[30:31]
152 ; FLATSCR-LABEL: func_local_stack_offset_uses_sp:
153 ; FLATSCR:       ; %bb.0: ; %entry
154 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
155 ; FLATSCR-NEXT:    s_mov_b32 s2, s33
156 ; FLATSCR-NEXT:    s_add_i32 s33, s32, 0x1fff
157 ; FLATSCR-NEXT:    s_and_b32 s33, s33, 0xffffe000
158 ; FLATSCR-NEXT:    s_add_i32 s32, s32, 0x8000
159 ; FLATSCR-NEXT:    v_mov_b32_e32 v2, 0
160 ; FLATSCR-NEXT:    s_add_i32 s0, s33, 0x2000
161 ; FLATSCR-NEXT:    scratch_store_dword off, v2, s0
162 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
163 ; FLATSCR-NEXT:    s_mov_b32 s0, 0
164 ; FLATSCR-NEXT:  .LBB1_1: ; %loadstoreloop
165 ; FLATSCR-NEXT:    ; =>This Inner Loop Header: Depth=1
166 ; FLATSCR-NEXT:    s_add_i32 s1, s33, s0
167 ; FLATSCR-NEXT:    s_addk_i32 s1, 0x3000
168 ; FLATSCR-NEXT:    s_add_i32 s0, s0, 1
169 ; FLATSCR-NEXT:    s_cmpk_lt_u32 s0, 0x2120
170 ; FLATSCR-NEXT:    scratch_store_byte off, v2, s1
171 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
172 ; FLATSCR-NEXT:    s_cbranch_scc1 .LBB1_1
173 ; FLATSCR-NEXT:  ; %bb.2: ; %split
174 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x2000
175 ; FLATSCR-NEXT:    s_add_i32 s1, s33, s0
176 ; FLATSCR-NEXT:    s_add_i32 s0, s1, 0x3000
177 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[2:3], off, s0 offset:208 glc
178 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
179 ; FLATSCR-NEXT:    s_add_i32 s0, s33, 0x3000
180 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[4:5], off, s0 offset:64 glc
181 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
182 ; FLATSCR-NEXT:    s_addk_i32 s32, 0x8000
183 ; FLATSCR-NEXT:    s_mov_b32 s33, s2
184 ; FLATSCR-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v4
185 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v3, vcc, v3, v5, vcc
186 ; FLATSCR-NEXT:    global_store_dwordx2 v[0:1], v[2:3], off
187 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
188 ; FLATSCR-NEXT:    s_setpc_b64 s[30:31]
189 entry:
190   %pin.low = alloca i32, align 8192, addrspace(5)
191   %local.area = alloca [1060 x i64], align 4096, addrspace(5)
192   store volatile i32 0, ptr addrspace(5) %pin.low
193   call void @llvm.memset.p5.i32(ptr addrspace(5) align 4 %local.area, i8 0, i32 8480, i1 true)
194   %gep.large.offset = getelementptr inbounds [1060 x i64], ptr addrspace(5) %local.area, i64 0, i64 1050
195   %gep.small.offset = getelementptr inbounds [1060 x i64], ptr addrspace(5) %local.area, i64 0, i64 8
196   %load0 = load volatile i64, ptr addrspace(5) %gep.large.offset
197   %load1 = load volatile i64, ptr addrspace(5) %gep.small.offset
198   %add0 = add i64 %load0, %load1
199   store volatile i64 %add0, ptr addrspace(1) %out
200   ret void
203 define amdgpu_kernel void @local_stack_offset_uses_sp_flat(ptr addrspace(1) %out) {
204 ; MUBUF-LABEL: local_stack_offset_uses_sp_flat:
205 ; MUBUF:       ; %bb.0: ; %entry
206 ; MUBUF-NEXT:    s_add_u32 s0, s0, s17
207 ; MUBUF-NEXT:    s_addc_u32 s1, s1, 0
208 ; MUBUF-NEXT:    v_mov_b32_e32 v0, 0
209 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x2000
210 ; MUBUF-NEXT:    s_mov_b32 s4, 0
211 ; MUBUF-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
212 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
213 ; MUBUF-NEXT:  .LBB2_1: ; %loadstoreloop
214 ; MUBUF-NEXT:    ; =>This Inner Loop Header: Depth=1
215 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
216 ; MUBUF-NEXT:    v_add_u32_e32 v1, s4, v2
217 ; MUBUF-NEXT:    s_add_i32 s4, s4, 1
218 ; MUBUF-NEXT:    s_cmpk_lt_u32 s4, 0x2120
219 ; MUBUF-NEXT:    buffer_store_byte v0, v1, s[0:3], 0 offen
220 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
221 ; MUBUF-NEXT:    s_cbranch_scc1 .LBB2_1
222 ; MUBUF-NEXT:  ; %bb.2: ; %split
223 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x4000
224 ; MUBUF-NEXT:    s_movk_i32 s4, 0x12d4
225 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
226 ; MUBUF-NEXT:    v_or_b32_e32 v0, 0x12c0, v1
227 ; MUBUF-NEXT:    v_or_b32_e32 v1, s4, v2
228 ; MUBUF-NEXT:    s_movk_i32 s4, 0x12d0
229 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
230 ; MUBUF-NEXT:    buffer_load_dword v5, v1, s[0:3], 0 offen glc
231 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
232 ; MUBUF-NEXT:    v_or_b32_e32 v1, s4, v2
233 ; MUBUF-NEXT:    s_movk_i32 s4, 0x12c4
234 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
235 ; MUBUF-NEXT:    buffer_load_dword v4, v1, s[0:3], 0 offen glc
236 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
237 ; MUBUF-NEXT:    v_or_b32_e32 v1, s4, v2
238 ; MUBUF-NEXT:    buffer_load_dword v6, v1, s[0:3], 0 offen glc
239 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
240 ; MUBUF-NEXT:    buffer_load_dword v7, v0, s[0:3], 0 offen glc
241 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
242 ; MUBUF-NEXT:    s_movk_i32 s4, 0x12cc
243 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x4000
244 ; MUBUF-NEXT:    v_or_b32_e32 v0, s4, v1
245 ; MUBUF-NEXT:    s_movk_i32 s4, 0x12c8
246 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
247 ; MUBUF-NEXT:    v_or_b32_e32 v1, s4, v2
248 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
249 ; MUBUF-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen glc
250 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
251 ; MUBUF-NEXT:    v_mov_b32_e32 v3, 0x4000
252 ; MUBUF-NEXT:    buffer_load_dword v1, v1, s[0:3], 0 offen glc
253 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
254 ; MUBUF-NEXT:    v_mov_b32_e32 v10, 0x4000
255 ; MUBUF-NEXT:    buffer_load_dword v8, v2, s[0:3], 0 offen glc
256 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
257 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x4000
258 ; MUBUF-NEXT:    buffer_load_dword v9, v2, s[0:3], 0 offen offset:4 glc
259 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
260 ; MUBUF-NEXT:    v_mov_b32_e32 v11, 0x4000
261 ; MUBUF-NEXT:    buffer_load_dword v2, v3, s[0:3], 0 offen offset:8 glc
262 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
263 ; MUBUF-NEXT:    v_mov_b32_e32 v12, 0x4000
264 ; MUBUF-NEXT:    buffer_load_dword v3, v10, s[0:3], 0 offen offset:12 glc
265 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
266 ; MUBUF-NEXT:    s_load_dwordx2 s[4:5], s[8:9], 0x0
267 ; MUBUF-NEXT:    buffer_load_dword v10, v11, s[0:3], 0 offen offset:16 glc
268 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
269 ; MUBUF-NEXT:    v_add_co_u32_e32 v2, vcc, v1, v2
270 ; MUBUF-NEXT:    buffer_load_dword v11, v12, s[0:3], 0 offen offset:20 glc
271 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
272 ; MUBUF-NEXT:    v_addc_co_u32_e32 v3, vcc, v0, v3, vcc
273 ; MUBUF-NEXT:    v_add_co_u32_e32 v0, vcc, v7, v8
274 ; MUBUF-NEXT:    v_addc_co_u32_e32 v1, vcc, v6, v9, vcc
275 ; MUBUF-NEXT:    v_add_co_u32_e32 v4, vcc, v4, v10
276 ; MUBUF-NEXT:    v_mov_b32_e32 v12, 0
277 ; MUBUF-NEXT:    v_addc_co_u32_e32 v5, vcc, v5, v11, vcc
278 ; MUBUF-NEXT:    s_waitcnt lgkmcnt(0)
279 ; MUBUF-NEXT:    global_store_dwordx2 v12, v[4:5], s[4:5] offset:16
280 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
281 ; MUBUF-NEXT:    global_store_dwordx4 v12, v[0:3], s[4:5]
282 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
283 ; MUBUF-NEXT:    s_endpgm
285 ; FLATSCR-LABEL: local_stack_offset_uses_sp_flat:
286 ; FLATSCR:       ; %bb.0: ; %entry
287 ; FLATSCR-NEXT:    s_add_u32 flat_scratch_lo, s8, s13
288 ; FLATSCR-NEXT:    s_addc_u32 flat_scratch_hi, s9, 0
289 ; FLATSCR-NEXT:    v_mov_b32_e32 v0, 0
290 ; FLATSCR-NEXT:    s_mov_b32 s0, 0
291 ; FLATSCR-NEXT:    scratch_store_dword off, v0, s0 offset:1024
292 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
293 ; FLATSCR-NEXT:  .LBB2_1: ; %loadstoreloop
294 ; FLATSCR-NEXT:    ; =>This Inner Loop Header: Depth=1
295 ; FLATSCR-NEXT:    s_add_i32 s1, s0, 0x2000
296 ; FLATSCR-NEXT:    s_add_i32 s0, s0, 1
297 ; FLATSCR-NEXT:    s_cmpk_lt_u32 s0, 0x2120
298 ; FLATSCR-NEXT:    scratch_store_byte off, v0, s1
299 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
300 ; FLATSCR-NEXT:    s_cbranch_scc1 .LBB2_1
301 ; FLATSCR-NEXT:  ; %bb.2: ; %split
302 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x1000
303 ; FLATSCR-NEXT:    s_addk_i32 s0, 0x2000
304 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[8:9], off, s0 offset:720 glc
305 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
306 ; FLATSCR-NEXT:    scratch_load_dwordx4 v[0:3], off, s0 offset:704 glc
307 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
308 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x2000
309 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[10:11], off, s0 offset:16 glc
310 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
311 ; FLATSCR-NEXT:    scratch_load_dwordx4 v[4:7], off, s0 glc
312 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
313 ; FLATSCR-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x0
314 ; FLATSCR-NEXT:    v_mov_b32_e32 v12, 0
315 ; FLATSCR-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v6
316 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v3, vcc, v3, v7, vcc
317 ; FLATSCR-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v4
318 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v5, vcc
319 ; FLATSCR-NEXT:    v_add_co_u32_e32 v4, vcc, v8, v10
320 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v5, vcc, v9, v11, vcc
321 ; FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
322 ; FLATSCR-NEXT:    global_store_dwordx2 v12, v[4:5], s[0:1] offset:16
323 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
324 ; FLATSCR-NEXT:    global_store_dwordx4 v12, v[0:3], s[0:1]
325 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
326 ; FLATSCR-NEXT:    s_endpgm
327 entry:
328   %pin.low = alloca i32, align 1024, addrspace(5)
329   %local.area = alloca [160 x <3 x i64>], align 8192, addrspace(5)
330   store volatile i32 0, ptr addrspace(5) %pin.low
331   call void @llvm.memset.p5.i32(ptr addrspace(5) align 4 %local.area, i8 0, i32 8480, i1 true)
332   %gep.large.offset = getelementptr inbounds [160 x <3 x i64>], ptr addrspace(5) %local.area, i64 0, i64 150
333   %load0 = load volatile <3 x i64>, ptr addrspace(5) %gep.large.offset
334   %load1 = load volatile <3 x i64>, ptr addrspace(5) %local.area
335   %add0 = add <3 x i64> %load0, %load1
336   store volatile <3 x i64> %add0, ptr addrspace(1) %out
337   ret void
340 declare void @llvm.memset.p5.i32(ptr addrspace(5) nocapture writeonly, i8, i32, i1 immarg) #0
342 attributes #0 = { argmemonly nounwind willreturn writeonly }