xref: /llvm-project/llvm/test/CodeGen/AMDGPU/GlobalISel/inst-select-store-local.mir (revision 9e9907f1cfa424366fba58d9520f9305b537cec9)
1# NOTE: Assertions have been autogenerated by utils/update_mir_test_checks.py
2# RUN: llc -mtriple=amdgcn -mcpu=tahiti -run-pass=instruction-select -verify-machineinstrs  -global-isel-abort=0 -disable-gisel-legality-check -o - %s | FileCheck -check-prefix=GFX6 %s
3# RUN: llc -mtriple=amdgcn -mcpu=hawaii -run-pass=instruction-select -verify-machineinstrs  -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX7 %s
4# RUN: llc -mtriple=amdgcn -mcpu=fiji -run-pass=instruction-select -verify-machineinstrs  -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX7 %s
5# RUN: llc -mtriple=amdgcn -mcpu=gfx900 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s
6# RUN: llc -mtriple=amdgcn -mcpu=gfx1010 -mattr=+cumode -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX10 %s
7# RUN: llc -mtriple=amdgcn -mcpu=gfx1100 -run-pass=instruction-select -verify-machineinstrs -global-isel-abort=0 -o - %s | FileCheck -check-prefix=GFX9 %s
8
9---
10
11name: store_local_s32_to_4
12legalized:       true
13regBankSelected: true
14tracksRegLiveness: true
15machineFunctionInfo:
16  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
17  stackPtrOffsetReg: $sgpr32
18
19body: |
20  bb.0:
21    liveins: $vgpr0, $vgpr1
22
23    ; GFX6-LABEL: name: store_local_s32_to_4
24    ; GFX6: liveins: $vgpr0, $vgpr1
25    ; GFX6-NEXT: {{  $}}
26    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
27    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
28    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
29    ; GFX6-NEXT: DS_WRITE_B32 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s32), addrspace 3)
30    ; GFX7-LABEL: name: store_local_s32_to_4
31    ; GFX7: liveins: $vgpr0, $vgpr1
32    ; GFX7-NEXT: {{  $}}
33    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
34    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
35    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
36    ; GFX7-NEXT: DS_WRITE_B32 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s32), addrspace 3)
37    ; GFX9-LABEL: name: store_local_s32_to_4
38    ; GFX9: liveins: $vgpr0, $vgpr1
39    ; GFX9-NEXT: {{  $}}
40    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
41    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
42    ; GFX9-NEXT: DS_WRITE_B32_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s32), addrspace 3)
43    ; GFX10-LABEL: name: store_local_s32_to_4
44    ; GFX10: liveins: $vgpr0, $vgpr1
45    ; GFX10-NEXT: {{  $}}
46    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
47    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
48    ; GFX10-NEXT: DS_WRITE_B32_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s32), addrspace 3)
49    %0:vgpr(s32) = COPY $vgpr0
50    %1:vgpr(p3) = COPY $vgpr1
51    G_STORE %0, %1 :: (store (s32), align 4, addrspace 3)
52
53...
54
55---
56
57name: store_local_s32_to_2
58legalized:       true
59regBankSelected: true
60tracksRegLiveness: true
61machineFunctionInfo:
62  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
63  stackPtrOffsetReg: $sgpr32
64
65body: |
66  bb.0:
67    liveins: $vgpr0, $vgpr1
68
69    ; GFX6-LABEL: name: store_local_s32_to_2
70    ; GFX6: liveins: $vgpr0, $vgpr1
71    ; GFX6-NEXT: {{  $}}
72    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
73    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
74    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
75    ; GFX6-NEXT: DS_WRITE_B16 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s16), addrspace 3)
76    ; GFX7-LABEL: name: store_local_s32_to_2
77    ; GFX7: liveins: $vgpr0, $vgpr1
78    ; GFX7-NEXT: {{  $}}
79    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
80    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
81    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
82    ; GFX7-NEXT: DS_WRITE_B16 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s16), addrspace 3)
83    ; GFX9-LABEL: name: store_local_s32_to_2
84    ; GFX9: liveins: $vgpr0, $vgpr1
85    ; GFX9-NEXT: {{  $}}
86    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
87    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
88    ; GFX9-NEXT: DS_WRITE_B16_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s16), addrspace 3)
89    ; GFX10-LABEL: name: store_local_s32_to_2
90    ; GFX10: liveins: $vgpr0, $vgpr1
91    ; GFX10-NEXT: {{  $}}
92    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
93    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
94    ; GFX10-NEXT: DS_WRITE_B16_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s16), addrspace 3)
95    %0:vgpr(s32) = COPY $vgpr0
96    %1:vgpr(p3) = COPY $vgpr1
97    G_STORE %0, %1 :: (store (s16), align 2, addrspace 3)
98
99...
100
101---
102
103name: store_local_s32_to_1
104legalized:       true
105regBankSelected: true
106tracksRegLiveness: true
107machineFunctionInfo:
108  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
109  stackPtrOffsetReg: $sgpr32
110
111body: |
112  bb.0:
113    liveins: $vgpr0, $vgpr1
114
115    ; GFX6-LABEL: name: store_local_s32_to_1
116    ; GFX6: liveins: $vgpr0, $vgpr1
117    ; GFX6-NEXT: {{  $}}
118    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
119    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
120    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
121    ; GFX6-NEXT: DS_WRITE_B8 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s8), addrspace 3)
122    ; GFX7-LABEL: name: store_local_s32_to_1
123    ; GFX7: liveins: $vgpr0, $vgpr1
124    ; GFX7-NEXT: {{  $}}
125    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
126    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
127    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
128    ; GFX7-NEXT: DS_WRITE_B8 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s8), addrspace 3)
129    ; GFX9-LABEL: name: store_local_s32_to_1
130    ; GFX9: liveins: $vgpr0, $vgpr1
131    ; GFX9-NEXT: {{  $}}
132    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
133    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
134    ; GFX9-NEXT: DS_WRITE_B8_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s8), addrspace 3)
135    ; GFX10-LABEL: name: store_local_s32_to_1
136    ; GFX10: liveins: $vgpr0, $vgpr1
137    ; GFX10-NEXT: {{  $}}
138    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
139    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
140    ; GFX10-NEXT: DS_WRITE_B8_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s8), addrspace 3)
141    %0:vgpr(s32) = COPY $vgpr0
142    %1:vgpr(p3) = COPY $vgpr1
143    G_STORE %0, %1 :: (store (s8), align 1, addrspace 3)
144
145...
146
147---
148
149name: store_local_v2s16
150legalized:       true
151regBankSelected: true
152tracksRegLiveness: true
153machineFunctionInfo:
154  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
155  stackPtrOffsetReg: $sgpr32
156
157body: |
158  bb.0:
159    liveins: $vgpr0, $vgpr1
160
161    ; GFX6-LABEL: name: store_local_v2s16
162    ; GFX6: liveins: $vgpr0, $vgpr1
163    ; GFX6-NEXT: {{  $}}
164    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
165    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
166    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
167    ; GFX6-NEXT: DS_WRITE_B32 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (<2 x s16>), addrspace 3)
168    ; GFX7-LABEL: name: store_local_v2s16
169    ; GFX7: liveins: $vgpr0, $vgpr1
170    ; GFX7-NEXT: {{  $}}
171    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
172    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
173    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
174    ; GFX7-NEXT: DS_WRITE_B32 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (<2 x s16>), addrspace 3)
175    ; GFX9-LABEL: name: store_local_v2s16
176    ; GFX9: liveins: $vgpr0, $vgpr1
177    ; GFX9-NEXT: {{  $}}
178    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
179    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
180    ; GFX9-NEXT: DS_WRITE_B32_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (<2 x s16>), addrspace 3)
181    ; GFX10-LABEL: name: store_local_v2s16
182    ; GFX10: liveins: $vgpr0, $vgpr1
183    ; GFX10-NEXT: {{  $}}
184    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
185    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
186    ; GFX10-NEXT: DS_WRITE_B32_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (<2 x s16>), addrspace 3)
187    %0:vgpr(<2 x s16>) = COPY $vgpr0
188    %1:vgpr(p3) = COPY $vgpr1
189    G_STORE %0, %1 :: (store (<2 x s16>), align 4, addrspace 3)
190
191...
192
193---
194
195name: store_local_p3
196legalized:       true
197regBankSelected: true
198tracksRegLiveness: true
199machineFunctionInfo:
200  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
201  stackPtrOffsetReg: $sgpr32
202
203body: |
204  bb.0:
205    liveins: $vgpr0, $vgpr1
206
207    ; GFX6-LABEL: name: store_local_p3
208    ; GFX6: liveins: $vgpr0, $vgpr1
209    ; GFX6-NEXT: {{  $}}
210    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
211    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
212    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
213    ; GFX6-NEXT: DS_WRITE_B32 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (p3), addrspace 3)
214    ; GFX7-LABEL: name: store_local_p3
215    ; GFX7: liveins: $vgpr0, $vgpr1
216    ; GFX7-NEXT: {{  $}}
217    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
218    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
219    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
220    ; GFX7-NEXT: DS_WRITE_B32 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (p3), addrspace 3)
221    ; GFX9-LABEL: name: store_local_p3
222    ; GFX9: liveins: $vgpr0, $vgpr1
223    ; GFX9-NEXT: {{  $}}
224    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
225    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
226    ; GFX9-NEXT: DS_WRITE_B32_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (p3), addrspace 3)
227    ; GFX10-LABEL: name: store_local_p3
228    ; GFX10: liveins: $vgpr0, $vgpr1
229    ; GFX10-NEXT: {{  $}}
230    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vgpr_32 = COPY $vgpr0
231    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr1
232    ; GFX10-NEXT: DS_WRITE_B32_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (p3), addrspace 3)
233    %0:vgpr(p3) = COPY $vgpr0
234    %1:vgpr(p3) = COPY $vgpr1
235    G_STORE %0, %1 :: (store (p3), align 4, addrspace 3)
236
237...
238
239---
240
241name: store_local_s32_to_1_constant_4095
242legalized:       true
243regBankSelected: true
244tracksRegLiveness: true
245
246body: |
247  bb.0:
248
249    ; GFX6-LABEL: name: store_local_s32_to_1_constant_4095
250    ; GFX6: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4095, implicit $exec
251    ; GFX6-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
252    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
253    ; GFX6-NEXT: DS_WRITE_B8 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $m0, implicit $exec :: (store (s8), addrspace 3)
254    ; GFX7-LABEL: name: store_local_s32_to_1_constant_4095
255    ; GFX7: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4095, implicit $exec
256    ; GFX7-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
257    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
258    ; GFX7-NEXT: DS_WRITE_B8 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $m0, implicit $exec :: (store (s8), addrspace 3)
259    ; GFX9-LABEL: name: store_local_s32_to_1_constant_4095
260    ; GFX9: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4095, implicit $exec
261    ; GFX9-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
262    ; GFX9-NEXT: DS_WRITE_B8_gfx9 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $exec :: (store (s8), addrspace 3)
263    ; GFX10-LABEL: name: store_local_s32_to_1_constant_4095
264    ; GFX10: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4095, implicit $exec
265    ; GFX10-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
266    ; GFX10-NEXT: DS_WRITE_B8_gfx9 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $exec :: (store (s8), addrspace 3)
267    %0:vgpr(p3) = G_CONSTANT i32 4095
268    %1:vgpr(s32) = G_CONSTANT i32 0
269    G_STORE %1, %0 :: (store (s8), align 1, addrspace 3)
270
271...
272
273---
274
275name: store_local_s32_to_1_constant_4096
276legalized:       true
277regBankSelected: true
278tracksRegLiveness: true
279machineFunctionInfo:
280  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
281  stackPtrOffsetReg: $sgpr32
282stack:
283  - { id: 0, size: 4096, alignment: 4 }
284
285body: |
286  bb.0:
287
288    ; GFX6-LABEL: name: store_local_s32_to_1_constant_4096
289    ; GFX6: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec
290    ; GFX6-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
291    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
292    ; GFX6-NEXT: DS_WRITE_B8 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $m0, implicit $exec :: (store (s8), addrspace 3)
293    ; GFX7-LABEL: name: store_local_s32_to_1_constant_4096
294    ; GFX7: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec
295    ; GFX7-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
296    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
297    ; GFX7-NEXT: DS_WRITE_B8 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $m0, implicit $exec :: (store (s8), addrspace 3)
298    ; GFX9-LABEL: name: store_local_s32_to_1_constant_4096
299    ; GFX9: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec
300    ; GFX9-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
301    ; GFX9-NEXT: DS_WRITE_B8_gfx9 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $exec :: (store (s8), addrspace 3)
302    ; GFX10-LABEL: name: store_local_s32_to_1_constant_4096
303    ; GFX10: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 4096, implicit $exec
304    ; GFX10-NEXT: [[V_MOV_B32_e32_1:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 0, implicit $exec
305    ; GFX10-NEXT: DS_WRITE_B8_gfx9 [[V_MOV_B32_e32_]], [[V_MOV_B32_e32_1]], 0, 0, implicit $exec :: (store (s8), addrspace 3)
306    %0:vgpr(p3) = G_CONSTANT i32 4096
307    %1:vgpr(s32) = G_CONSTANT i32 0
308    G_STORE %1, %0 :: (store (s8), align 1, addrspace 3)
309
310...
311
312---
313
314name: store_local_s64_align4
315legalized:       true
316regBankSelected: true
317tracksRegLiveness: true
318machineFunctionInfo:
319  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
320  stackPtrOffsetReg: $sgpr32
321
322body: |
323  bb.0:
324    liveins: $vgpr0_vgpr1, $vgpr2
325
326    ; GFX6-LABEL: name: store_local_s64_align4
327    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
328    ; GFX6-NEXT: {{  $}}
329    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(s64) = COPY $vgpr0_vgpr1
330    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr(p3) = COPY $vgpr2
331    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
332    ; GFX6-NEXT: G_STORE [[COPY]](s64), [[COPY1]](p3) :: (store (s64), align 4, addrspace 3)
333    ; GFX7-LABEL: name: store_local_s64_align4
334    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
335    ; GFX7-NEXT: {{  $}}
336    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
337    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
338    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
339    ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
340    ; GFX7-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
341    ; GFX7-NEXT: DS_WRITE2_B32 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $m0, implicit $exec :: (store (s64), align 4, addrspace 3)
342    ; GFX9-LABEL: name: store_local_s64_align4
343    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
344    ; GFX9-NEXT: {{  $}}
345    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
346    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
347    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
348    ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
349    ; GFX9-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (s64), align 4, addrspace 3)
350    ; GFX10-LABEL: name: store_local_s64_align4
351    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
352    ; GFX10-NEXT: {{  $}}
353    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
354    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
355    ; GFX10-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
356    ; GFX10-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
357    ; GFX10-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (s64), align 4, addrspace 3)
358    %0:vgpr(s64) = COPY $vgpr0_vgpr1
359    %1:vgpr(p3) = COPY $vgpr2
360    G_STORE %0, %1 :: (store (s64), align 4, addrspace 3)
361
362...
363
364---
365
366name: store_local_p1_align4
367legalized:       true
368regBankSelected: true
369tracksRegLiveness: true
370machineFunctionInfo:
371  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
372  stackPtrOffsetReg: $sgpr32
373
374body: |
375  bb.0:
376    liveins: $vgpr0_vgpr1, $vgpr2
377
378    ; GFX6-LABEL: name: store_local_p1_align4
379    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
380    ; GFX6-NEXT: {{  $}}
381    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(p1) = COPY $vgpr0_vgpr1
382    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr(p3) = COPY $vgpr2
383    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
384    ; GFX6-NEXT: G_STORE [[COPY]](p1), [[COPY1]](p3) :: (store (p1), align 4, addrspace 3)
385    ; GFX7-LABEL: name: store_local_p1_align4
386    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
387    ; GFX7-NEXT: {{  $}}
388    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
389    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
390    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
391    ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
392    ; GFX7-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
393    ; GFX7-NEXT: DS_WRITE2_B32 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $m0, implicit $exec :: (store (p1), align 4, addrspace 3)
394    ; GFX9-LABEL: name: store_local_p1_align4
395    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
396    ; GFX9-NEXT: {{  $}}
397    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
398    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
399    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
400    ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
401    ; GFX9-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (p1), align 4, addrspace 3)
402    ; GFX10-LABEL: name: store_local_p1_align4
403    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
404    ; GFX10-NEXT: {{  $}}
405    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
406    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
407    ; GFX10-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
408    ; GFX10-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
409    ; GFX10-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (p1), align 4, addrspace 3)
410    %0:vgpr(p1) = COPY $vgpr0_vgpr1
411    %1:vgpr(p3) = COPY $vgpr2
412    G_STORE %0, %1 :: (store (p1), align 4, addrspace 3)
413
414...
415
416---
417
418name: store_local_v2s32_align4
419legalized:       true
420regBankSelected: true
421tracksRegLiveness: true
422machineFunctionInfo:
423  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
424  stackPtrOffsetReg: $sgpr32
425
426body: |
427  bb.0:
428    liveins: $vgpr0_vgpr1, $vgpr2
429
430    ; GFX6-LABEL: name: store_local_v2s32_align4
431    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
432    ; GFX6-NEXT: {{  $}}
433    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(<2 x s32>) = COPY $vgpr0_vgpr1
434    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr(p3) = COPY $vgpr2
435    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
436    ; GFX6-NEXT: G_STORE [[COPY]](<2 x s32>), [[COPY1]](p3) :: (store (<2 x s32>), align 4, addrspace 3)
437    ; GFX7-LABEL: name: store_local_v2s32_align4
438    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
439    ; GFX7-NEXT: {{  $}}
440    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
441    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
442    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
443    ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
444    ; GFX7-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
445    ; GFX7-NEXT: DS_WRITE2_B32 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $m0, implicit $exec :: (store (<2 x s32>), align 4, addrspace 3)
446    ; GFX9-LABEL: name: store_local_v2s32_align4
447    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
448    ; GFX9-NEXT: {{  $}}
449    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
450    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
451    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
452    ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
453    ; GFX9-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (<2 x s32>), align 4, addrspace 3)
454    ; GFX10-LABEL: name: store_local_v2s32_align4
455    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
456    ; GFX10-NEXT: {{  $}}
457    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
458    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
459    ; GFX10-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
460    ; GFX10-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
461    ; GFX10-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (<2 x s32>), align 4, addrspace 3)
462    %0:vgpr(<2 x s32>) = COPY $vgpr0_vgpr1
463    %1:vgpr(p3) = COPY $vgpr2
464    G_STORE %0, %1 :: (store (<2 x s32>), align 4, addrspace 3)
465
466...
467
468---
469
470name: store_local_v4s16_align4
471legalized:       true
472regBankSelected: true
473tracksRegLiveness: true
474machineFunctionInfo:
475  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
476  stackPtrOffsetReg: $sgpr32
477
478body: |
479  bb.0:
480    liveins: $vgpr0_vgpr1, $vgpr2
481
482    ; GFX6-LABEL: name: store_local_v4s16_align4
483    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
484    ; GFX6-NEXT: {{  $}}
485    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(<4 x s16>) = COPY $vgpr0_vgpr1
486    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr(p3) = COPY $vgpr2
487    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
488    ; GFX6-NEXT: G_STORE [[COPY]](<4 x s16>), [[COPY1]](p3) :: (store (<4 x s16>), align 4, addrspace 3)
489    ; GFX7-LABEL: name: store_local_v4s16_align4
490    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
491    ; GFX7-NEXT: {{  $}}
492    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
493    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
494    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
495    ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
496    ; GFX7-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
497    ; GFX7-NEXT: DS_WRITE2_B32 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $m0, implicit $exec :: (store (<4 x s16>), align 4, addrspace 3)
498    ; GFX9-LABEL: name: store_local_v4s16_align4
499    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
500    ; GFX9-NEXT: {{  $}}
501    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
502    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
503    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
504    ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
505    ; GFX9-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (<4 x s16>), align 4, addrspace 3)
506    ; GFX10-LABEL: name: store_local_v4s16_align4
507    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
508    ; GFX10-NEXT: {{  $}}
509    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
510    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
511    ; GFX10-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
512    ; GFX10-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
513    ; GFX10-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (<4 x s16>), align 4, addrspace 3)
514    %0:vgpr(<4 x s16>) = COPY $vgpr0_vgpr1
515    %1:vgpr(p3) = COPY $vgpr2
516    G_STORE %0, %1 :: (store (<4 x s16>), align 4, addrspace 3)
517
518...
519
520---
521
522name: store_local_s64_align8
523legalized:       true
524regBankSelected: true
525tracksRegLiveness: true
526machineFunctionInfo:
527  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
528  stackPtrOffsetReg: $sgpr32
529
530body: |
531  bb.0:
532    liveins: $vgpr0_vgpr1, $vgpr2
533
534    ; GFX6-LABEL: name: store_local_s64_align8
535    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
536    ; GFX6-NEXT: {{  $}}
537    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
538    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
539    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
540    ; GFX6-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s64), addrspace 3)
541    ; GFX7-LABEL: name: store_local_s64_align8
542    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
543    ; GFX7-NEXT: {{  $}}
544    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
545    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
546    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
547    ; GFX7-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (s64), addrspace 3)
548    ; GFX9-LABEL: name: store_local_s64_align8
549    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
550    ; GFX9-NEXT: {{  $}}
551    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
552    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
553    ; GFX9-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s64), addrspace 3)
554    ; GFX10-LABEL: name: store_local_s64_align8
555    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
556    ; GFX10-NEXT: {{  $}}
557    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
558    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
559    ; GFX10-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (s64), addrspace 3)
560    %0:vgpr(s64) = COPY $vgpr0_vgpr1
561    %1:vgpr(p3) = COPY $vgpr2
562    G_STORE %0, %1 :: (store (s64), align 8, addrspace 3)
563
564...
565
566---
567
568name: store_local_p1_align8
569legalized:       true
570regBankSelected: true
571tracksRegLiveness: true
572machineFunctionInfo:
573  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
574  stackPtrOffsetReg: $sgpr32
575
576body: |
577  bb.0:
578    liveins: $vgpr0_vgpr1, $vgpr2
579
580    ; GFX6-LABEL: name: store_local_p1_align8
581    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
582    ; GFX6-NEXT: {{  $}}
583    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
584    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
585    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
586    ; GFX6-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (p1), addrspace 3)
587    ; GFX7-LABEL: name: store_local_p1_align8
588    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
589    ; GFX7-NEXT: {{  $}}
590    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
591    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
592    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
593    ; GFX7-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (p1), addrspace 3)
594    ; GFX9-LABEL: name: store_local_p1_align8
595    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
596    ; GFX9-NEXT: {{  $}}
597    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
598    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
599    ; GFX9-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (p1), addrspace 3)
600    ; GFX10-LABEL: name: store_local_p1_align8
601    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
602    ; GFX10-NEXT: {{  $}}
603    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
604    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
605    ; GFX10-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (p1), addrspace 3)
606    %0:vgpr(p1) = COPY $vgpr0_vgpr1
607    %1:vgpr(p3) = COPY $vgpr2
608    G_STORE %0, %1 :: (store (p1), align 8, addrspace 3)
609
610...
611
612---
613
614name: store_local_v2s32_align8
615legalized:       true
616regBankSelected: true
617tracksRegLiveness: true
618machineFunctionInfo:
619  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
620  stackPtrOffsetReg: $sgpr32
621
622body: |
623  bb.0:
624    liveins: $vgpr0_vgpr1, $vgpr2
625
626    ; GFX6-LABEL: name: store_local_v2s32_align8
627    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
628    ; GFX6-NEXT: {{  $}}
629    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
630    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
631    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
632    ; GFX6-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (<2 x s32>), addrspace 3)
633    ; GFX7-LABEL: name: store_local_v2s32_align8
634    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
635    ; GFX7-NEXT: {{  $}}
636    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
637    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
638    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
639    ; GFX7-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (<2 x s32>), addrspace 3)
640    ; GFX9-LABEL: name: store_local_v2s32_align8
641    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
642    ; GFX9-NEXT: {{  $}}
643    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
644    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
645    ; GFX9-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (<2 x s32>), addrspace 3)
646    ; GFX10-LABEL: name: store_local_v2s32_align8
647    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
648    ; GFX10-NEXT: {{  $}}
649    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
650    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
651    ; GFX10-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (<2 x s32>), addrspace 3)
652    %0:vgpr(<2 x s32>) = COPY $vgpr0_vgpr1
653    %1:vgpr(p3) = COPY $vgpr2
654    G_STORE %0, %1 :: (store (<2 x s32>), align 8, addrspace 3)
655
656...
657
658---
659
660name: store_local_v4s16_align8
661legalized:       true
662regBankSelected: true
663tracksRegLiveness: true
664machineFunctionInfo:
665  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
666  stackPtrOffsetReg: $sgpr32
667
668body: |
669  bb.0:
670    liveins: $vgpr0_vgpr1, $vgpr2
671
672    ; GFX6-LABEL: name: store_local_v4s16_align8
673    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
674    ; GFX6-NEXT: {{  $}}
675    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
676    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
677    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
678    ; GFX6-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (<4 x s16>), addrspace 3)
679    ; GFX7-LABEL: name: store_local_v4s16_align8
680    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
681    ; GFX7-NEXT: {{  $}}
682    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
683    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
684    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
685    ; GFX7-NEXT: DS_WRITE_B64 [[COPY1]], [[COPY]], 0, 0, implicit $m0, implicit $exec :: (store (<4 x s16>), addrspace 3)
686    ; GFX9-LABEL: name: store_local_v4s16_align8
687    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
688    ; GFX9-NEXT: {{  $}}
689    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
690    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
691    ; GFX9-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (<4 x s16>), addrspace 3)
692    ; GFX10-LABEL: name: store_local_v4s16_align8
693    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
694    ; GFX10-NEXT: {{  $}}
695    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
696    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
697    ; GFX10-NEXT: DS_WRITE_B64_gfx9 [[COPY1]], [[COPY]], 0, 0, implicit $exec :: (store (<4 x s16>), addrspace 3)
698    %0:vgpr(<4 x s16>) = COPY $vgpr0_vgpr1
699    %1:vgpr(p3) = COPY $vgpr2
700    G_STORE %0, %1 :: (store (<4 x s16>), align 8, addrspace 3)
701
702...
703
704---
705
706name: store_local_s64_align4_from_1_gep_1016
707legalized:       true
708regBankSelected: true
709tracksRegLiveness: true
710machineFunctionInfo:
711  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
712  stackPtrOffsetReg: $sgpr32
713
714body: |
715  bb.0:
716    liveins:  $vgpr0_vgpr1, $vgpr2
717
718    ; GFX6-LABEL: name: store_local_s64_align4_from_1_gep_1016
719    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
720    ; GFX6-NEXT: {{  $}}
721    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(s64) = COPY $vgpr0_vgpr1
722    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr(p3) = COPY $vgpr2
723    ; GFX6-NEXT: [[C:%[0-9]+]]:vgpr(s32) = G_CONSTANT i32 1016
724    ; GFX6-NEXT: [[PTR_ADD:%[0-9]+]]:vgpr(p3) = G_PTR_ADD [[COPY1]], [[C]](s32)
725    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
726    ; GFX6-NEXT: G_STORE [[COPY]](s64), [[PTR_ADD]](p3) :: (store (s64), align 4, addrspace 3)
727    ; GFX7-LABEL: name: store_local_s64_align4_from_1_gep_1016
728    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
729    ; GFX7-NEXT: {{  $}}
730    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
731    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
732    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
733    ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
734    ; GFX7-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
735    ; GFX7-NEXT: DS_WRITE2_B32 [[COPY1]], [[COPY3]], [[COPY2]], 254, 255, 0, implicit $m0, implicit $exec :: (store (s64), align 4, addrspace 3)
736    ; GFX9-LABEL: name: store_local_s64_align4_from_1_gep_1016
737    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
738    ; GFX9-NEXT: {{  $}}
739    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
740    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
741    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
742    ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
743    ; GFX9-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 254, 255, 0, implicit $exec :: (store (s64), align 4, addrspace 3)
744    ; GFX10-LABEL: name: store_local_s64_align4_from_1_gep_1016
745    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
746    ; GFX10-NEXT: {{  $}}
747    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
748    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
749    ; GFX10-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
750    ; GFX10-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
751    ; GFX10-NEXT: DS_WRITE2_B32_gfx9 [[COPY1]], [[COPY3]], [[COPY2]], 254, 255, 0, implicit $exec :: (store (s64), align 4, addrspace 3)
752    %0:vgpr(s64) = COPY $vgpr0_vgpr1
753    %1:vgpr(p3) = COPY $vgpr2
754    %2:vgpr(s32) = G_CONSTANT i32 1016
755    %3:vgpr(p3) = G_PTR_ADD %1, %2
756    G_STORE %0, %3 :: (store (s64), align 4, addrspace 3)
757
758...
759
760---
761
762name: store_local_s64_align4_from_1_gep_1020
763legalized:       true
764regBankSelected: true
765tracksRegLiveness: true
766machineFunctionInfo:
767  scratchRSrcReg: $sgpr0_sgpr1_sgpr2_sgpr3
768  stackPtrOffsetReg: $sgpr32
769
770body: |
771  bb.0:
772    liveins:  $vgpr0_vgpr1, $vgpr2
773
774    ; GFX6-LABEL: name: store_local_s64_align4_from_1_gep_1020
775    ; GFX6: liveins: $vgpr0_vgpr1, $vgpr2
776    ; GFX6-NEXT: {{  $}}
777    ; GFX6-NEXT: [[COPY:%[0-9]+]]:vgpr(s64) = COPY $vgpr0_vgpr1
778    ; GFX6-NEXT: [[COPY1:%[0-9]+]]:vgpr(p3) = COPY $vgpr2
779    ; GFX6-NEXT: [[C:%[0-9]+]]:vgpr(s32) = G_CONSTANT i32 1020
780    ; GFX6-NEXT: [[PTR_ADD:%[0-9]+]]:vgpr(p3) = G_PTR_ADD [[COPY1]], [[C]](s32)
781    ; GFX6-NEXT: $m0 = S_MOV_B32 -1
782    ; GFX6-NEXT: G_STORE [[COPY]](s64), [[PTR_ADD]](p3) :: (store (s64), align 4, addrspace 3)
783    ; GFX7-LABEL: name: store_local_s64_align4_from_1_gep_1020
784    ; GFX7: liveins: $vgpr0_vgpr1, $vgpr2
785    ; GFX7-NEXT: {{  $}}
786    ; GFX7-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
787    ; GFX7-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
788    ; GFX7-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1020, implicit $exec
789    ; GFX7-NEXT: [[V_ADD_CO_U32_e64_:%[0-9]+]]:vgpr_32, dead [[V_ADD_CO_U32_e64_1:%[0-9]+]]:sreg_64_xexec = V_ADD_CO_U32_e64 [[COPY1]], [[V_MOV_B32_e32_]], 0, implicit $exec
790    ; GFX7-NEXT: $m0 = S_MOV_B32 -1
791    ; GFX7-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
792    ; GFX7-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
793    ; GFX7-NEXT: DS_WRITE2_B32 [[V_ADD_CO_U32_e64_]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $m0, implicit $exec :: (store (s64), align 4, addrspace 3)
794    ; GFX9-LABEL: name: store_local_s64_align4_from_1_gep_1020
795    ; GFX9: liveins: $vgpr0_vgpr1, $vgpr2
796    ; GFX9-NEXT: {{  $}}
797    ; GFX9-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
798    ; GFX9-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
799    ; GFX9-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1020, implicit $exec
800    ; GFX9-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY1]], [[V_MOV_B32_e32_]], 0, implicit $exec
801    ; GFX9-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
802    ; GFX9-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
803    ; GFX9-NEXT: DS_WRITE2_B32_gfx9 [[V_ADD_U32_e64_]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (s64), align 4, addrspace 3)
804    ; GFX10-LABEL: name: store_local_s64_align4_from_1_gep_1020
805    ; GFX10: liveins: $vgpr0_vgpr1, $vgpr2
806    ; GFX10-NEXT: {{  $}}
807    ; GFX10-NEXT: [[COPY:%[0-9]+]]:vreg_64 = COPY $vgpr0_vgpr1
808    ; GFX10-NEXT: [[COPY1:%[0-9]+]]:vgpr_32 = COPY $vgpr2
809    ; GFX10-NEXT: [[V_MOV_B32_e32_:%[0-9]+]]:vgpr_32 = V_MOV_B32_e32 1020, implicit $exec
810    ; GFX10-NEXT: [[V_ADD_U32_e64_:%[0-9]+]]:vgpr_32 = V_ADD_U32_e64 [[COPY1]], [[V_MOV_B32_e32_]], 0, implicit $exec
811    ; GFX10-NEXT: [[COPY2:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub1
812    ; GFX10-NEXT: [[COPY3:%[0-9]+]]:vgpr_32 = COPY [[COPY]].sub0
813    ; GFX10-NEXT: DS_WRITE2_B32_gfx9 [[V_ADD_U32_e64_]], [[COPY3]], [[COPY2]], 0, 1, 0, implicit $exec :: (store (s64), align 4, addrspace 3)
814    %0:vgpr(s64) = COPY $vgpr0_vgpr1
815    %1:vgpr(p3) = COPY $vgpr2
816    %2:vgpr(s32) = G_CONSTANT i32 1020
817    %3:vgpr(p3) = G_PTR_ADD %1, %2
818    G_STORE %0, %3 :: (store (s64), align 4, addrspace 3)
819
820...
821