1# RUN: llc -march=amdgcn -mcpu=gfx900 -verify-machineinstrs -run-pass si-load-store-opt -o - %s | FileCheck -check-prefix=GFX9 %s
2
3# GFX9-LABEL: name: image_load_merged_v1v3
4# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
5# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub0
6# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub1_sub2_sub3
7
8name: image_load_merged_v1v3
9body:             |
10  bb.0.entry:
11    %0:sgpr_64 = COPY $sgpr0_sgpr1
12    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
13    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
14    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
15    %4:vgpr_32 = COPY %2.sub3
16    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
17    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
18    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
19...
20---
21
22# GFX9-LABEL: name: image_load_merged_v1v3_reversed
23# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
24# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub3
25# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub0_sub1_sub2
26
27name: image_load_merged_v1v3_reversed
28body:             |
29  bb.0.entry:
30    %0:sgpr_64 = COPY $sgpr0_sgpr1
31    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
32    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
33    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
34    %4:vgpr_32 = COPY %2.sub3
35    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
36    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
37    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
38...
39---
40
41# GFX9-LABEL: name: image_load_merged_v2v2
42# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, addrspace 4)
43# GFX9: %{{[0-9]+}}:vreg_64 = COPY %8.sub0_sub1
44# GFX9: %{{[0-9]+}}:vreg_64 = COPY killed %8.sub2_sub3
45
46name: image_load_merged_v2v2
47body:             |
48  bb.0.entry:
49    %0:sgpr_64 = COPY $sgpr0_sgpr1
50    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
51    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
52    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
53    %4:vgpr_32 = COPY %2.sub3
54    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
55    %6:vreg_64 = IMAGE_LOAD_V2_V4 %5:vreg_128, %3:sgpr_256, 3, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
56    %7:vreg_64 = IMAGE_LOAD_V2_V4 %5:vreg_128, %3:sgpr_256, 12, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
57...
58---
59
60# GFX9-LABEL: name: image_load_merged_v2v2_reversed
61# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, addrspace 4)
62# GFX9: %{{[0-9]+}}:vreg_64 = COPY %8.sub2_sub3
63# GFX9: %{{[0-9]+}}:vreg_64 = COPY killed %8.sub0_sub1
64
65name: image_load_merged_v2v2_reversed
66body:             |
67  bb.0.entry:
68    %0:sgpr_64 = COPY $sgpr0_sgpr1
69    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
70    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
71    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
72    %4:vgpr_32 = COPY %2.sub3
73    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
74    %6:vreg_64 = IMAGE_LOAD_V2_V4 %5:vreg_128, %3:sgpr_256, 12, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
75    %7:vreg_64 = IMAGE_LOAD_V2_V4 %5:vreg_128, %3:sgpr_256, 3, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
76...
77---
78
79# GFX9-LABEL: name: image_load_merged_v3v1
80# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, addrspace 4)
81# GFX9: %{{[0-9]+}}:vreg_96 = COPY %8.sub0_sub1_sub2
82# GFX9: %{{[0-9]+}}:vgpr_32 = COPY killed %8.sub3
83
84name: image_load_merged_v3v1
85body:             |
86  bb.0.entry:
87    %0:sgpr_64 = COPY $sgpr0_sgpr1
88    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
89    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
90    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
91    %4:vgpr_32 = COPY %2.sub3
92    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
93    %6:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
94    %7:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
95...
96---
97
98# GFX9-LABEL: name: image_load_merged_v3v1_reversed
99# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, addrspace 4)
100# GFX9: %{{[0-9]+}}:vreg_96 = COPY %8.sub1_sub2_sub3
101# GFX9: %{{[0-9]+}}:vgpr_32 = COPY killed %8.sub0
102
103name: image_load_merged_v3v1_reversed
104body:             |
105  bb.0.entry:
106    %0:sgpr_64 = COPY $sgpr0_sgpr1
107    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
108    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
109    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
110    %4:vgpr_32 = COPY %2.sub3
111    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
112    %6:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
113    %7:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
114...
115---
116
117# GFX9-LABEL: name: image_load_divided_merged
118# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
119
120name: image_load_divided_merged
121body:             |
122  bb.0.entry:
123    %0:sgpr_64 = COPY $sgpr0_sgpr1
124    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
125    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
126    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
127    %4:vgpr_32 = COPY %2.sub3
128    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
129    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
130    %7:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
131    %8:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
132    %9:vreg_96 = IMAGE_LOAD_V3_V4 %7:vreg_128, %3:sgpr_256, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
133    %10:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
134    %11:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
135...
136---
137
138# GFX9-LABEL: name: image_load_divided_not_merged
139# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
140# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
141
142name: image_load_divided_not_merged
143body:             |
144  bb.0.entry:
145    %0:sgpr_64 = COPY $sgpr0_sgpr1
146    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
147    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
148    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
149    %4:vreg_128 = COPY %2
150    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
151    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
152    IMAGE_STORE_V4_V4 %4:vreg_128, %5:vreg_128, %3:sgpr_256, 15, -1, 0, 0, 0, 0, 0, 0, implicit $exec :: (store 16)
153    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
154...
155---
156
157# GFX9-LABEL: name: image_load_dmask_overlapped_not_merged
158# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 4, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
159# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
160
161name: image_load_dmask_overlapped_not_merged
162body:             |
163  bb.0.entry:
164    %0:sgpr_64 = COPY $sgpr0_sgpr1
165    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
166    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
167    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
168    %4:vgpr_32 = COPY %2.sub3
169    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
170    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 4, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
171    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
172...
173---
174
175# GFX9-LABEL: name: image_load_dmask_not_disjoint_not_merged
176# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 4, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
177# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 11, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
178
179name: image_load_dmask_not_disjoint_not_merged
180body:             |
181  bb.0.entry:
182    %0:sgpr_64 = COPY $sgpr0_sgpr1
183    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
184    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
185    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
186    %4:vgpr_32 = COPY %2.sub3
187    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
188    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5:vreg_128, %3:sgpr_256, 4, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
189    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5:vreg_128, %3:sgpr_256, 11, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
190...
191---
192
193# GFX9-LABEL: name: image_load_not_merged_0
194# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
195# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %6, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
196
197name: image_load_not_merged_0
198body:             |
199  bb.0.entry:
200    %0:sgpr_64 = COPY $sgpr0_sgpr1
201    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
202    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
203    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
204    %4:vgpr_32 = COPY %2.sub3
205    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
206    %6:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 1, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
207    %7:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
208    %8:vreg_96 = IMAGE_LOAD_V3_V4 %6, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
209...
210---
211
212# GFX9-LABEL: name: image_load_not_merged_1
213# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %6, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
214# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %6, %4, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
215
216name: image_load_not_merged_1
217body:             |
218  bb.0.entry:
219    %0:sgpr_64 = COPY $sgpr0_sgpr1
220    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
221    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
222    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
223    %4:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
224    %5:vgpr_32 = COPY %2.sub3
225    %6:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
226    %7:vgpr_32 = IMAGE_LOAD_V1_V4 %6, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
227    %8:vreg_96 = IMAGE_LOAD_V3_V4 %6, %4, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
228...
229---
230
231# GFX9-LABEL: name: image_load_not_merged_10
232# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
233# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 1, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
234
235name: image_load_not_merged_10
236body:             |
237  bb.0.entry:
238    %0:sgpr_64 = COPY $sgpr0_sgpr1
239    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
240    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
241    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
242    %4:vgpr_32 = COPY %2.sub3
243    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
244    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
245    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 1, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
246...
247---
248
249# GFX9-LABEL: name: image_load_not_merged_3
250# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
251# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 1, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
252
253name: image_load_not_merged_3
254body:             |
255  bb.0.entry:
256    %0:sgpr_64 = COPY $sgpr0_sgpr1
257    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
258    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
259    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
260    %4:vgpr_32 = COPY %2.sub3
261    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
262    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
263    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 1, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
264...
265---
266
267# GFX9-LABEL: name: image_load_not_merged_4
268# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
269# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 1, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
270
271name: image_load_not_merged_4
272body:             |
273  bb.0.entry:
274    %0:sgpr_64 = COPY $sgpr0_sgpr1
275    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
276    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
277    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
278    %4:vgpr_32 = COPY %2.sub3
279    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
280    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
281    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 1, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
282...
283---
284
285# GFX9-LABEL: name: image_load_not_merged_5
286# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
287# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 1, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
288
289name: image_load_not_merged_5
290body:             |
291  bb.0.entry:
292    %0:sgpr_64 = COPY $sgpr0_sgpr1
293    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
294    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
295    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
296    %4:vgpr_32 = COPY %2.sub3
297    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
298    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
299    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 1, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
300...
301---
302
303# GFX9-LABEL: name: image_load_not_merged_6
304# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
305# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 1, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
306
307name: image_load_not_merged_6
308body:             |
309  bb.0.entry:
310    %0:sgpr_64 = COPY $sgpr0_sgpr1
311    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
312    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
313    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
314    %4:vgpr_32 = COPY %2.sub3
315    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
316    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
317    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 1, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
318...
319---
320
321# GFX9-LABEL: name: image_load_not_merged_7
322# GFX9: %{{[0-9]+}}:vreg_64 = IMAGE_LOAD_V2_V4 %5, %3, 8, 0, 0, 0, 1, 0, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
323# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
324
325name: image_load_not_merged_7
326body:             |
327  bb.0.entry:
328    %0:sgpr_64 = COPY $sgpr0_sgpr1
329    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
330    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
331    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
332    %4:vgpr_32 = COPY %2.sub3
333    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
334    %6:vreg_64 = IMAGE_LOAD_V2_V4 %5, %3, 8, 0, 0, 0, 1, 0, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
335    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
336...
337---
338
339# GFX9-LABEL: name: image_load_not_merged_8
340# GFX9: %{{[0-9]+}}:vreg_64 = IMAGE_LOAD_V2_V4 %5, %3, 8, 0, 0, 0, 0, 1, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
341# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
342
343name: image_load_not_merged_8
344body:             |
345  bb.0.entry:
346    %0:sgpr_64 = COPY $sgpr0_sgpr1
347    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
348    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
349    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
350    %4:vgpr_32 = COPY %2.sub3
351    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
352    %6:vreg_64 = IMAGE_LOAD_V2_V4 %5, %3, 8, 0, 0, 0, 0, 1, -1, 0, implicit $exec :: (dereferenceable load 8, align 16, addrspace 4)
353    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
354...
355---
356
357# GFX9-LABEL: name: image_load_not_merged_9
358# GFX9: %{{[0-9]+}}:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
359# GFX9: %{{[0-9]+}}:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
360
361name: image_load_not_merged_9
362body:             |
363  bb.0.entry:
364    %0:sgpr_64 = COPY $sgpr0_sgpr1
365    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
366    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
367    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
368    %4:vgpr_32 = COPY %2.sub3
369    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
370    %6:vgpr_32 = IMAGE_LOAD_V1_V4 %5, %3, 8, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
371    %7:vreg_96 = IMAGE_LOAD_V3_V4 %5, %3, 7, 0, 0, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
372...
373---
374
375# GFX9-LABEL: name: image_load_mip_merged_v1v3
376# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_MIP_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, 0, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
377# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub0
378# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub1_sub2_sub3
379
380name: image_load_mip_merged_v1v3
381body:             |
382  bb.0.entry:
383    %0:sgpr_64 = COPY $sgpr0_sgpr1
384    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
385    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
386    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
387    %4:vgpr_32 = COPY %2.sub3
388    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
389    %6:vgpr_32 = IMAGE_LOAD_MIP_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 4, addrspace 4)
390    %7:vreg_96 = IMAGE_LOAD_MIP_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, 0, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
391...
392---
393
394# GFX9-LABEL: name: image_load_mip_pck_merged_v1v3
395# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_MIP_PCK_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
396# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub0
397# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub1_sub2_sub3
398
399name: image_load_mip_pck_merged_v1v3
400body:             |
401  bb.0.entry:
402    %0:sgpr_64 = COPY $sgpr0_sgpr1
403    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
404    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
405    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
406    %4:vgpr_32 = COPY %2.sub3
407    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
408    %6:vgpr_32 = IMAGE_LOAD_MIP_PCK_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 4, addrspace 4)
409    %7:vreg_96 = IMAGE_LOAD_MIP_PCK_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
410...
411---
412
413# GFX9-LABEL: name: image_load_mip_pck_sgn_merged_v1v3
414# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_MIP_PCK_SGN_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
415# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub0
416# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub1_sub2_sub3
417
418name: image_load_mip_pck_sgn_merged_v1v3
419body:             |
420  bb.0.entry:
421    %0:sgpr_64 = COPY $sgpr0_sgpr1
422    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
423    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
424    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
425    %4:vgpr_32 = COPY %2.sub3
426    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
427    %6:vgpr_32 = IMAGE_LOAD_MIP_PCK_SGN_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 4, addrspace 4)
428    %7:vreg_96 = IMAGE_LOAD_MIP_PCK_SGN_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
429...
430---
431
432# GFX9-LABEL: name: image_load_pck_merged_v1v3
433# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_PCK_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
434# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub0
435# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub1_sub2_sub3
436
437name: image_load_pck_merged_v1v3
438body:             |
439  bb.0.entry:
440    %0:sgpr_64 = COPY $sgpr0_sgpr1
441    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
442    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
443    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
444    %4:vgpr_32 = COPY %2.sub3
445    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
446    %6:vgpr_32 = IMAGE_LOAD_PCK_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 4, addrspace 4)
447    %7:vreg_96 = IMAGE_LOAD_PCK_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
448...
449---
450
451# GFX9-LABEL: name: image_load_pck_sgn_merged_v1v3
452# GFX9: %{{[0-9]+}}:vreg_128 = IMAGE_LOAD_PCK_SGN_V4_V4 %5, %3, 15, 0, 0, 0, 0, 0, -1, implicit $exec, implicit $exec :: (dereferenceable load 16, align 4, addrspace 4)
453# GFX9: %{{[0-9]+}}:vgpr_32 = COPY %8.sub0
454# GFX9: %{{[0-9]+}}:vreg_96 = COPY killed %8.sub1_sub2_sub3
455
456name: image_load_pck_sgn_merged_v1v3
457body:             |
458  bb.0.entry:
459    %0:sgpr_64 = COPY $sgpr0_sgpr1
460    %1:sreg_64_xexec = S_LOAD_DWORDX2_IMM %0, 36, 0
461    %2:sgpr_128 = COPY $sgpr96_sgpr97_sgpr98_sgpr99
462    %3:sgpr_256 = S_LOAD_DWORDX8_IMM %1, 208, 0
463    %4:vgpr_32 = COPY %2.sub3
464    %5:vreg_128 = BUFFER_LOAD_DWORDX4_OFFSET %2:sgpr_128, 0, 0, 0, 0, 0, implicit $exec :: (dereferenceable invariant load 16)
465    %6:vgpr_32 = IMAGE_LOAD_PCK_SGN_V1_V4 %5:vreg_128, %3:sgpr_256, 1, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 4, addrspace 4)
466    %7:vreg_96 = IMAGE_LOAD_PCK_SGN_V3_V4 %5:vreg_128, %3:sgpr_256, 14, 0, 0, 0, 0, 0, -1, implicit $exec :: (dereferenceable load 12, align 16, addrspace 4)
467...
468---
469
470