[ORC] Add std::tuple support to SimplePackedSerialization.
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / local-stack-alloc-block-sp-reference.ll
blobddd40b0cc343ff761469d447e27c313fe7cdc684
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 --amdgpu-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(i64 addrspace(1)* %out) {
20 ; MUBUF-LABEL: local_stack_offset_uses_sp:
21 ; MUBUF:       ; %bb.0: ; %entry
22 ; MUBUF-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x0
23 ; MUBUF-NEXT:    s_add_u32 s0, s0, s9
24 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x3000
25 ; MUBUF-NEXT:    s_addc_u32 s1, s1, 0
26 ; MUBUF-NEXT:    v_add_u32_e32 v0, 64, v1
27 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0
28 ; MUBUF-NEXT:    v_mov_b32_e32 v3, 0x2000
29 ; MUBUF-NEXT:    s_mov_b32 s6, 0
30 ; MUBUF-NEXT:    buffer_store_dword v2, v3, s[0:3], 0 offen
31 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
32 ; MUBUF-NEXT:  BB0_1: ; %loadstoreloop
33 ; MUBUF-NEXT:    ; =>This Inner Loop Header: Depth=1
34 ; MUBUF-NEXT:    v_add_u32_e32 v3, s6, v1
35 ; MUBUF-NEXT:    s_add_i32 s6, s6, 1
36 ; MUBUF-NEXT:    s_cmpk_lt_u32 s6, 0x2120
37 ; MUBUF-NEXT:    buffer_store_byte v2, v3, s[0:3], 0 offen
38 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
39 ; MUBUF-NEXT:    s_cbranch_scc1 BB0_1
40 ; MUBUF-NEXT:  ; %bb.2: ; %split
41 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0x3000
42 ; MUBUF-NEXT:    v_add_u32_e32 v1, 0x20d0, v1
43 ; MUBUF-NEXT:    buffer_load_dword v2, v1, s[0:3], 0 offen glc
44 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
45 ; MUBUF-NEXT:    buffer_load_dword v3, v1, s[0:3], 0 offen offset:4 glc
46 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
47 ; MUBUF-NEXT:    buffer_load_dword v4, v0, s[0:3], 0 offen glc
48 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
49 ; MUBUF-NEXT:    buffer_load_dword v5, v0, s[0:3], 0 offen offset:4 glc
50 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
51 ; MUBUF-NEXT:    v_add_co_u32_e32 v0, vcc, v2, v4
52 ; MUBUF-NEXT:    v_addc_co_u32_e32 v1, vcc, v3, v5, vcc
53 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0
54 ; MUBUF-NEXT:    s_waitcnt lgkmcnt(0)
55 ; MUBUF-NEXT:    global_store_dwordx2 v2, 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_load_dwordx2 s[0:1], s[0:1], 0x0
62 ; FLATSCR-NEXT:    s_add_u32 flat_scratch_lo, s2, s5
63 ; FLATSCR-NEXT:    s_addc_u32 flat_scratch_hi, s3, 0
64 ; FLATSCR-NEXT:    v_mov_b32_e32 v0, 0
65 ; FLATSCR-NEXT:    s_movk_i32 vcc_hi, 0x2000
66 ; FLATSCR-NEXT:    s_mov_b32 s2, 0
67 ; FLATSCR-NEXT:    scratch_store_dword off, v0, vcc_hi
68 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
69 ; FLATSCR-NEXT:  BB0_1: ; %loadstoreloop
70 ; FLATSCR-NEXT:    ; =>This Inner Loop Header: Depth=1
71 ; FLATSCR-NEXT:    s_add_i32 s3, s2, 0x3000
72 ; FLATSCR-NEXT:    s_add_i32 s2, s2, 1
73 ; FLATSCR-NEXT:    s_cmpk_lt_u32 s2, 0x2120
74 ; FLATSCR-NEXT:    scratch_store_byte off, v0, s3
75 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
76 ; FLATSCR-NEXT:    s_cbranch_scc1 BB0_1
77 ; FLATSCR-NEXT:  ; %bb.2: ; %split
78 ; FLATSCR-NEXT:    s_movk_i32 s2, 0x2000
79 ; FLATSCR-NEXT:    s_addk_i32 s2, 0x3000
80 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[0:1], off, s2 offset:208 glc
81 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
82 ; FLATSCR-NEXT:    s_movk_i32 s2, 0x3000
83 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[2:3], off, s2 offset:64 glc
84 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
85 ; FLATSCR-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v2
86 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v3, vcc
87 ; FLATSCR-NEXT:    v_mov_b32_e32 v2, 0
88 ; FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
89 ; FLATSCR-NEXT:    global_store_dwordx2 v2, 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, i32 addrspace(5)* %pin.low
96   %local.area.cast = bitcast [1060 x i64] addrspace(5)* %local.area to i8 addrspace(5)*
97   call void @llvm.memset.p5i8.i32(i8 addrspace(5)* align 4 %local.area.cast, i8 0, i32 8480, i1 true)
98   %gep.large.offset = getelementptr inbounds [1060 x i64], [1060 x i64] addrspace(5)* %local.area, i64 0, i64 1050
99   %gep.small.offset = getelementptr inbounds [1060 x i64], [1060 x i64] addrspace(5)* %local.area, i64 0, i64 8
100   %load0 = load volatile i64, i64 addrspace(5)* %gep.large.offset
101   %load1 = load volatile i64, i64 addrspace(5)* %gep.small.offset
102   %add0 = add i64 %load0, %load1
103   store volatile i64 %add0, i64 addrspace(1)* %out
104   ret void
107 define void @func_local_stack_offset_uses_sp(i64 addrspace(1)* %out) {
108 ; MUBUF-LABEL: func_local_stack_offset_uses_sp:
109 ; MUBUF:       ; %bb.0: ; %entry
110 ; MUBUF-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
111 ; MUBUF-NEXT:    s_mov_b32 s5, s33
112 ; MUBUF-NEXT:    s_add_i32 s33, s32, 0x7ffc0
113 ; MUBUF-NEXT:    s_and_b32 s33, s33, 0xfff80000
114 ; MUBUF-NEXT:    v_lshrrev_b32_e64 v3, 6, s33
115 ; MUBUF-NEXT:    v_add_u32_e32 v3, 0x1000, v3
116 ; MUBUF-NEXT:    v_mov_b32_e32 v4, 0
117 ; MUBUF-NEXT:    v_add_u32_e32 v2, 64, v3
118 ; MUBUF-NEXT:    s_mov_b32 s4, 0
119 ; MUBUF-NEXT:    s_add_i32 s32, s32, 0x180000
120 ; MUBUF-NEXT:    buffer_store_dword v4, off, s[0:3], s33
121 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
122 ; MUBUF-NEXT:  BB1_1: ; %loadstoreloop
123 ; MUBUF-NEXT:    ; =>This Inner Loop Header: Depth=1
124 ; MUBUF-NEXT:    v_add_u32_e32 v5, s4, v3
125 ; MUBUF-NEXT:    s_add_i32 s4, s4, 1
126 ; MUBUF-NEXT:    s_cmpk_lt_u32 s4, 0x2120
127 ; MUBUF-NEXT:    buffer_store_byte v4, v5, s[0:3], 0 offen
128 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
129 ; MUBUF-NEXT:    s_cbranch_scc1 BB1_1
130 ; MUBUF-NEXT:  ; %bb.2: ; %split
131 ; MUBUF-NEXT:    v_lshrrev_b32_e64 v3, 6, s33
132 ; MUBUF-NEXT:    v_add_u32_e32 v3, 0x1000, v3
133 ; MUBUF-NEXT:    v_add_u32_e32 v3, 0x20d0, v3
134 ; MUBUF-NEXT:    buffer_load_dword v4, v3, s[0:3], 0 offen glc
135 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
136 ; MUBUF-NEXT:    buffer_load_dword v5, v3, s[0:3], 0 offen offset:4 glc
137 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
138 ; MUBUF-NEXT:    buffer_load_dword v6, v2, s[0:3], 0 offen glc
139 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
140 ; MUBUF-NEXT:    buffer_load_dword v7, v2, s[0:3], 0 offen offset:4 glc
141 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
142 ; MUBUF-NEXT:    s_add_i32 s32, s32, 0xffe80000
143 ; MUBUF-NEXT:    s_mov_b32 s33, s5
144 ; MUBUF-NEXT:    v_add_co_u32_e32 v2, vcc, v4, v6
145 ; MUBUF-NEXT:    v_addc_co_u32_e32 v3, vcc, v5, v7, vcc
146 ; MUBUF-NEXT:    global_store_dwordx2 v[0:1], v[2:3], off
147 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
148 ; MUBUF-NEXT:    s_setpc_b64 s[30:31]
150 ; FLATSCR-LABEL: func_local_stack_offset_uses_sp:
151 ; FLATSCR:       ; %bb.0: ; %entry
152 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
153 ; FLATSCR-NEXT:    s_mov_b32 s2, s33
154 ; FLATSCR-NEXT:    s_add_i32 s33, s32, 0x1fff
155 ; FLATSCR-NEXT:    s_and_b32 s33, s33, 0xffffe000
156 ; FLATSCR-NEXT:    v_mov_b32_e32 v2, 0
157 ; FLATSCR-NEXT:    s_mov_b32 s0, 0
158 ; FLATSCR-NEXT:    s_addk_i32 s32, 0x6000
159 ; FLATSCR-NEXT:    scratch_store_dword off, v2, s33
160 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
161 ; FLATSCR-NEXT:  BB1_1: ; %loadstoreloop
162 ; FLATSCR-NEXT:    ; =>This Inner Loop Header: Depth=1
163 ; FLATSCR-NEXT:    s_add_i32 vcc_hi, s33, 0x1000
164 ; FLATSCR-NEXT:    s_add_i32 s1, s0, vcc_hi
165 ; FLATSCR-NEXT:    s_add_i32 s0, s0, 1
166 ; FLATSCR-NEXT:    s_cmpk_lt_u32 s0, 0x2120
167 ; FLATSCR-NEXT:    scratch_store_byte off, v2, s1
168 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
169 ; FLATSCR-NEXT:    s_cbranch_scc1 BB1_1
170 ; FLATSCR-NEXT:  ; %bb.2: ; %split
171 ; FLATSCR-NEXT:    s_movk_i32 s0, 0x2000
172 ; FLATSCR-NEXT:    s_add_i32 s1, s33, 0x1000
173 ; FLATSCR-NEXT:    s_add_i32 s0, s0, s1
174 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[2:3], off, s0 offset:208 glc
175 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
176 ; FLATSCR-NEXT:    s_add_i32 s0, s33, 0x1000
177 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[4:5], off, s0 offset:64 glc
178 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
179 ; FLATSCR-NEXT:    s_addk_i32 s32, 0xa000
180 ; FLATSCR-NEXT:    s_mov_b32 s33, s2
181 ; FLATSCR-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v4
182 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v3, vcc, v3, v5, vcc
183 ; FLATSCR-NEXT:    global_store_dwordx2 v[0:1], v[2:3], off
184 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
185 ; FLATSCR-NEXT:    s_setpc_b64 s[30:31]
186 entry:
187   %pin.low = alloca i32, align 8192, addrspace(5)
188   %local.area = alloca [1060 x i64], align 4096, addrspace(5)
189   store volatile i32 0, i32 addrspace(5)* %pin.low
190   %local.area.cast = bitcast [1060 x i64] addrspace(5)* %local.area to i8 addrspace(5)*
191   call void @llvm.memset.p5i8.i32(i8 addrspace(5)* align 4 %local.area.cast, i8 0, i32 8480, i1 true)
192   %gep.large.offset = getelementptr inbounds [1060 x i64], [1060 x i64] addrspace(5)* %local.area, i64 0, i64 1050
193   %gep.small.offset = getelementptr inbounds [1060 x i64], [1060 x i64] addrspace(5)* %local.area, i64 0, i64 8
194   %load0 = load volatile i64, i64 addrspace(5)* %gep.large.offset
195   %load1 = load volatile i64, i64 addrspace(5)* %gep.small.offset
196   %add0 = add i64 %load0, %load1
197   store volatile i64 %add0, i64 addrspace(1)* %out
198   ret void
201 define amdgpu_kernel void @local_stack_offset_uses_sp_flat(<3 x i64> addrspace(1)* %out) {
202 ; MUBUF-LABEL: local_stack_offset_uses_sp_flat:
203 ; MUBUF:       ; %bb.0: ; %entry
204 ; MUBUF-NEXT:    s_load_dwordx2 s[4:5], s[4:5], 0x0
205 ; MUBUF-NEXT:    s_add_u32 s0, s0, s9
206 ; MUBUF-NEXT:    s_addc_u32 s1, s1, 0
207 ; MUBUF-NEXT:    v_mov_b32_e32 v0, 0x4000
208 ; MUBUF-NEXT:    v_mov_b32_e32 v1, 0
209 ; MUBUF-NEXT:    v_mov_b32_e32 v2, 0x2000
210 ; MUBUF-NEXT:    s_mov_b32 s6, 0
211 ; MUBUF-NEXT:    buffer_store_dword v1, v2, s[0:3], 0 offen
212 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
213 ; MUBUF-NEXT:  BB2_1: ; %loadstoreloop
214 ; MUBUF-NEXT:    ; =>This Inner Loop Header: Depth=1
215 ; MUBUF-NEXT:    v_add_u32_e32 v2, s6, v0
216 ; MUBUF-NEXT:    s_add_i32 s6, s6, 1
217 ; MUBUF-NEXT:    s_cmpk_lt_u32 s6, 0x2120
218 ; MUBUF-NEXT:    buffer_store_byte v1, v2, s[0:3], 0 offen
219 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
220 ; MUBUF-NEXT:    s_cbranch_scc1 BB2_1
221 ; MUBUF-NEXT:  ; %bb.2: ; %split
222 ; MUBUF-NEXT:    v_mov_b32_e32 v0, 0x4000
223 ; MUBUF-NEXT:    v_or_b32_e32 v2, 0x12d4, v0
224 ; MUBUF-NEXT:    buffer_load_dword v5, v2, s[0:3], 0 offen glc
225 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
226 ; MUBUF-NEXT:    v_or_b32_e32 v2, 0x12d0, v0
227 ; MUBUF-NEXT:    buffer_load_dword v4, v2, s[0:3], 0 offen glc
228 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
229 ; MUBUF-NEXT:    v_or_b32_e32 v1, 0x12c0, v0
230 ; MUBUF-NEXT:    v_or_b32_e32 v2, 0x12c4, v0
231 ; MUBUF-NEXT:    buffer_load_dword v6, v2, s[0:3], 0 offen glc
232 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
233 ; MUBUF-NEXT:    buffer_load_dword v7, v1, s[0:3], 0 offen glc
234 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
235 ; MUBUF-NEXT:    v_or_b32_e32 v1, 0x12cc, v0
236 ; MUBUF-NEXT:    v_or_b32_e32 v0, 0x12c8, v0
237 ; MUBUF-NEXT:    v_mov_b32_e32 v13, 0x4000
238 ; MUBUF-NEXT:    buffer_load_dword v1, v1, s[0:3], 0 offen glc
239 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
240 ; MUBUF-NEXT:    v_mov_b32_e32 v12, 0
241 ; MUBUF-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen glc
242 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
243 ; MUBUF-NEXT:    buffer_load_dword v8, v13, s[0:3], 0 offen glc
244 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
245 ; MUBUF-NEXT:    v_mov_b32_e32 v13, 0x4000
246 ; MUBUF-NEXT:    buffer_load_dword v9, v13, s[0:3], 0 offen offset:4 glc
247 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
248 ; MUBUF-NEXT:    v_mov_b32_e32 v13, 0x4000
249 ; MUBUF-NEXT:    buffer_load_dword v2, v13, s[0:3], 0 offen offset:8 glc
250 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
251 ; MUBUF-NEXT:    v_mov_b32_e32 v13, 0x4000
252 ; MUBUF-NEXT:    buffer_load_dword v3, v13, s[0:3], 0 offen offset:12 glc
253 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
254 ; MUBUF-NEXT:    v_mov_b32_e32 v13, 0x4000
255 ; MUBUF-NEXT:    buffer_load_dword v10, v13, s[0:3], 0 offen offset:16 glc
256 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
257 ; MUBUF-NEXT:    v_mov_b32_e32 v13, 0x4000
258 ; MUBUF-NEXT:    buffer_load_dword v11, v13, s[0:3], 0 offen offset:20 glc
259 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
260 ; MUBUF-NEXT:    v_add_co_u32_e32 v2, vcc, v0, v2
261 ; MUBUF-NEXT:    v_addc_co_u32_e32 v3, vcc, v1, v3, vcc
262 ; MUBUF-NEXT:    v_add_co_u32_e32 v0, vcc, v7, v8
263 ; MUBUF-NEXT:    v_addc_co_u32_e32 v1, vcc, v6, v9, vcc
264 ; MUBUF-NEXT:    v_add_co_u32_e32 v4, vcc, v4, v10
265 ; MUBUF-NEXT:    v_addc_co_u32_e32 v5, vcc, v5, v11, vcc
266 ; MUBUF-NEXT:    s_waitcnt lgkmcnt(0)
267 ; MUBUF-NEXT:    global_store_dwordx2 v12, v[4:5], s[4:5] offset:16
268 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
269 ; MUBUF-NEXT:    global_store_dwordx4 v12, v[0:3], s[4:5]
270 ; MUBUF-NEXT:    s_waitcnt vmcnt(0)
271 ; MUBUF-NEXT:    s_endpgm
273 ; FLATSCR-LABEL: local_stack_offset_uses_sp_flat:
274 ; FLATSCR:       ; %bb.0: ; %entry
275 ; FLATSCR-NEXT:    s_load_dwordx2 s[0:1], s[0:1], 0x0
276 ; FLATSCR-NEXT:    s_add_u32 flat_scratch_lo, s2, s5
277 ; FLATSCR-NEXT:    s_addc_u32 flat_scratch_hi, s3, 0
278 ; FLATSCR-NEXT:    v_mov_b32_e32 v0, 0
279 ; FLATSCR-NEXT:    s_mov_b32 vcc_hi, 0
280 ; FLATSCR-NEXT:    s_mov_b32 s2, 0
281 ; FLATSCR-NEXT:    scratch_store_dword off, v0, vcc_hi offset:1024
282 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
283 ; FLATSCR-NEXT:  BB2_1: ; %loadstoreloop
284 ; FLATSCR-NEXT:    ; =>This Inner Loop Header: Depth=1
285 ; FLATSCR-NEXT:    s_add_i32 s3, s2, 0x2000
286 ; FLATSCR-NEXT:    s_add_i32 s2, s2, 1
287 ; FLATSCR-NEXT:    s_cmpk_lt_u32 s2, 0x2120
288 ; FLATSCR-NEXT:    scratch_store_byte off, v0, s3
289 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
290 ; FLATSCR-NEXT:    s_cbranch_scc1 BB2_1
291 ; FLATSCR-NEXT:  ; %bb.2: ; %split
292 ; FLATSCR-NEXT:    s_movk_i32 s2, 0x1000
293 ; FLATSCR-NEXT:    s_addk_i32 s2, 0x2000
294 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[8:9], off, s2 offset:720 glc
295 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
296 ; FLATSCR-NEXT:    scratch_load_dwordx4 v[0:3], off, s2 offset:704 glc
297 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
298 ; FLATSCR-NEXT:    s_movk_i32 s2, 0x2000
299 ; FLATSCR-NEXT:    scratch_load_dwordx2 v[10:11], off, s2 offset:16 glc
300 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
301 ; FLATSCR-NEXT:    s_movk_i32 s2, 0x2000
302 ; FLATSCR-NEXT:    scratch_load_dwordx4 v[4:7], off, s2 glc
303 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
304 ; FLATSCR-NEXT:    v_mov_b32_e32 v12, 0
305 ; FLATSCR-NEXT:    v_add_co_u32_e32 v2, vcc, v2, v6
306 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v3, vcc, v3, v7, vcc
307 ; FLATSCR-NEXT:    v_add_co_u32_e32 v0, vcc, v0, v4
308 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v1, vcc, v1, v5, vcc
309 ; FLATSCR-NEXT:    v_add_co_u32_e32 v4, vcc, v8, v10
310 ; FLATSCR-NEXT:    v_addc_co_u32_e32 v5, vcc, v9, v11, vcc
311 ; FLATSCR-NEXT:    s_waitcnt lgkmcnt(0)
312 ; FLATSCR-NEXT:    global_store_dwordx2 v12, v[4:5], s[0:1] offset:16
313 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
314 ; FLATSCR-NEXT:    global_store_dwordx4 v12, v[0:3], s[0:1]
315 ; FLATSCR-NEXT:    s_waitcnt vmcnt(0)
316 ; FLATSCR-NEXT:    s_endpgm
317 entry:
318   %pin.low = alloca i32, align 1024, addrspace(5)
319   %local.area = alloca [160 x <3 x i64>], align 8192, addrspace(5)
320   store volatile i32 0, i32 addrspace(5)* %pin.low
321   %local.area.cast = bitcast [160 x <3 x i64>] addrspace(5)* %local.area to i8 addrspace(5)*
322   call void @llvm.memset.p5i8.i32(i8 addrspace(5)* align 4 %local.area.cast, i8 0, i32 8480, i1 true)
323   %gep.large.offset = getelementptr inbounds [160 x <3 x i64>], [160 x <3 x i64>] addrspace(5)* %local.area, i64 0, i64 150
324   %gep.small.offset = getelementptr inbounds [160 x <3 x i64>], [160 x <3 x i64>] addrspace(5)* %local.area, i64 0, i64 0
325   %load0 = load volatile <3 x i64>, <3 x i64> addrspace(5)* %gep.large.offset
326   %load1 = load volatile <3 x i64>, <3 x i64> addrspace(5)* %gep.small.offset
327   %add0 = add <3 x i64> %load0, %load1
328   store volatile <3 x i64> %add0, <3 x i64> addrspace(1)* %out
329   ret void
332 declare void @llvm.memset.p5i8.i32(i8 addrspace(5)* nocapture writeonly, i8, i32, i1 immarg) #0
334 attributes #0 = { argmemonly nounwind willreturn writeonly }