[MachineScheduler] Fix physreg dependencies of ExitSU (#123541)
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / fast-unaligned-load-store.private.ll
blobf9694dcd89abfb496749a36c4bf07b20feec87dd
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -mattr=-unaligned-scratch-access < %s | FileCheck --check-prefix=GFX7-ALIGNED %s
3 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=hawaii -mattr=+unaligned-scratch-access < %s | FileCheck --check-prefix=GFX7-UNALIGNED %s
4 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -mattr=+unaligned-scratch-access < %s | FileCheck --check-prefix=GFX9 %s
5 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx900 -mattr=+unaligned-scratch-access -mattr=+enable-flat-scratch < %s | FileCheck --check-prefix=GFX9-FLASTSCR %s
6 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+unaligned-scratch-access < %s | FileCheck --check-prefix=GFX10 %s
7 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1010 -mattr=+unaligned-scratch-access -mattr=+enable-flat-scratch < %s | FileCheck --check-prefix=GFX10-FLASTSCR %s
8 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+unaligned-scratch-access < %s | FileCheck --check-prefix=GFX11 %s
9 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1100 -mattr=+unaligned-scratch-access -mattr=+enable-flat-scratch < %s | FileCheck --check-prefix=GFX11-FLASTSCR %s
10 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+unaligned-scratch-access < %s | FileCheck --check-prefix=GFX12 %s
11 ; RUN: llc -mtriple=amdgcn-amd-amdhsa -mcpu=gfx1200 -mattr=+unaligned-scratch-access -mattr=+enable-flat-scratch < %s | FileCheck --check-prefix=GFX12-FLASTSCR %s
13 ; Should not merge this to a dword load
14 define i32 @private_load_2xi16_align2(ptr addrspace(5) %p) #0 {
15 ; GFX7-ALIGNED-LABEL: private_load_2xi16_align2:
16 ; GFX7-ALIGNED:       ; %bb.0:
17 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
18 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 2, v0
19 ; GFX7-ALIGNED-NEXT:    buffer_load_ushort v1, v1, s[0:3], 0 offen
20 ; GFX7-ALIGNED-NEXT:    buffer_load_ushort v0, v0, s[0:3], 0 offen
21 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(1)
22 ; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
23 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
24 ; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v0, v0, v1
25 ; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
27 ; GFX7-UNALIGNED-LABEL: private_load_2xi16_align2:
28 ; GFX7-UNALIGNED:       ; %bb.0:
29 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
30 ; GFX7-UNALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
31 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
32 ; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
34 ; GFX9-LABEL: private_load_2xi16_align2:
35 ; GFX9:       ; %bb.0:
36 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
37 ; GFX9-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
38 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
39 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
41 ; GFX9-FLASTSCR-LABEL: private_load_2xi16_align2:
42 ; GFX9-FLASTSCR:       ; %bb.0:
43 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
44 ; GFX9-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
45 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
46 ; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
48 ; GFX10-LABEL: private_load_2xi16_align2:
49 ; GFX10:       ; %bb.0:
50 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
51 ; GFX10-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
52 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
53 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
55 ; GFX10-FLASTSCR-LABEL: private_load_2xi16_align2:
56 ; GFX10-FLASTSCR:       ; %bb.0:
57 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
58 ; GFX10-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
59 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
60 ; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
62 ; GFX11-LABEL: private_load_2xi16_align2:
63 ; GFX11:       ; %bb.0:
64 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
65 ; GFX11-NEXT:    scratch_load_b32 v0, v0, off
66 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
67 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
69 ; GFX11-FLASTSCR-LABEL: private_load_2xi16_align2:
70 ; GFX11-FLASTSCR:       ; %bb.0:
71 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
72 ; GFX11-FLASTSCR-NEXT:    scratch_load_b32 v0, v0, off
73 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
74 ; GFX11-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
76 ; GFX12-LABEL: private_load_2xi16_align2:
77 ; GFX12:       ; %bb.0:
78 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
79 ; GFX12-NEXT:    s_wait_expcnt 0x0
80 ; GFX12-NEXT:    s_wait_samplecnt 0x0
81 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
82 ; GFX12-NEXT:    s_wait_kmcnt 0x0
83 ; GFX12-NEXT:    scratch_load_b32 v0, v0, off
84 ; GFX12-NEXT:    s_wait_loadcnt 0x0
85 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
87 ; GFX12-FLASTSCR-LABEL: private_load_2xi16_align2:
88 ; GFX12-FLASTSCR:       ; %bb.0:
89 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt_dscnt 0x0
90 ; GFX12-FLASTSCR-NEXT:    s_wait_expcnt 0x0
91 ; GFX12-FLASTSCR-NEXT:    s_wait_samplecnt 0x0
92 ; GFX12-FLASTSCR-NEXT:    s_wait_bvhcnt 0x0
93 ; GFX12-FLASTSCR-NEXT:    s_wait_kmcnt 0x0
94 ; GFX12-FLASTSCR-NEXT:    scratch_load_b32 v0, v0, off
95 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt 0x0
96 ; GFX12-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
97   %gep.p = getelementptr i16, ptr addrspace(5) %p, i64 1
98   %p.0 = load i16, ptr addrspace(5) %p, align 2
99   %p.1 = load i16, ptr addrspace(5) %gep.p, align 2
100   %zext.0 = zext i16 %p.0 to i32
101   %zext.1 = zext i16 %p.1 to i32
102   %shl.1 = shl i32 %zext.1, 16
103   %or = or i32 %zext.0, %shl.1
104   ret i32 %or
107 ; Should not merge this to a dword store
108 define void @private_store_2xi16_align2(ptr addrspace(5) %p, ptr addrspace(5) %r) #0 {
109 ; GFX7-ALIGNED-LABEL: private_store_2xi16_align2:
110 ; GFX7-ALIGNED:       ; %bb.0:
111 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
112 ; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v3, 1
113 ; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v0, 2
114 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 2, v1
115 ; GFX7-ALIGNED-NEXT:    buffer_store_short v3, v1, s[0:3], 0 offen
116 ; GFX7-ALIGNED-NEXT:    buffer_store_short v0, v2, s[0:3], 0 offen
117 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
118 ; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
120 ; GFX7-UNALIGNED-LABEL: private_store_2xi16_align2:
121 ; GFX7-UNALIGNED:       ; %bb.0:
122 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
123 ; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
124 ; GFX7-UNALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
125 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
126 ; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
128 ; GFX9-LABEL: private_store_2xi16_align2:
129 ; GFX9:       ; %bb.0:
130 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
131 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x20001
132 ; GFX9-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
133 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
134 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
136 ; GFX9-FLASTSCR-LABEL: private_store_2xi16_align2:
137 ; GFX9-FLASTSCR:       ; %bb.0:
138 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
139 ; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
140 ; GFX9-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
141 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
142 ; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
144 ; GFX10-LABEL: private_store_2xi16_align2:
145 ; GFX10:       ; %bb.0:
146 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
147 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0x20001
148 ; GFX10-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
149 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
151 ; GFX10-FLASTSCR-LABEL: private_store_2xi16_align2:
152 ; GFX10-FLASTSCR:       ; %bb.0:
153 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
154 ; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
155 ; GFX10-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
156 ; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
158 ; GFX11-LABEL: private_store_2xi16_align2:
159 ; GFX11:       ; %bb.0:
160 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
161 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0x20001
162 ; GFX11-NEXT:    scratch_store_b32 v1, v0, off
163 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
165 ; GFX11-FLASTSCR-LABEL: private_store_2xi16_align2:
166 ; GFX11-FLASTSCR:       ; %bb.0:
167 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
168 ; GFX11-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
169 ; GFX11-FLASTSCR-NEXT:    scratch_store_b32 v1, v0, off
170 ; GFX11-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
172 ; GFX12-LABEL: private_store_2xi16_align2:
173 ; GFX12:       ; %bb.0:
174 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
175 ; GFX12-NEXT:    s_wait_expcnt 0x0
176 ; GFX12-NEXT:    s_wait_samplecnt 0x0
177 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
178 ; GFX12-NEXT:    s_wait_kmcnt 0x0
179 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0x20001
180 ; GFX12-NEXT:    scratch_store_b32 v1, v0, off
181 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
183 ; GFX12-FLASTSCR-LABEL: private_store_2xi16_align2:
184 ; GFX12-FLASTSCR:       ; %bb.0:
185 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt_dscnt 0x0
186 ; GFX12-FLASTSCR-NEXT:    s_wait_expcnt 0x0
187 ; GFX12-FLASTSCR-NEXT:    s_wait_samplecnt 0x0
188 ; GFX12-FLASTSCR-NEXT:    s_wait_bvhcnt 0x0
189 ; GFX12-FLASTSCR-NEXT:    s_wait_kmcnt 0x0
190 ; GFX12-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
191 ; GFX12-FLASTSCR-NEXT:    scratch_store_b32 v1, v0, off
192 ; GFX12-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
193   %gep.r = getelementptr i16, ptr addrspace(5) %r, i64 1
194   store i16 1, ptr addrspace(5) %r, align 2
195   store i16 2, ptr addrspace(5) %gep.r, align 2
196   ret void
199 ; Should produce align 1 dword when legal
200 define i32 @private_load_2xi16_align1(ptr addrspace(5) %p) #0 {
201 ; GFX7-ALIGNED-LABEL: private_load_2xi16_align1:
202 ; GFX7-ALIGNED:       ; %bb.0:
203 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
204 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 2, v0
205 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
206 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v3, vcc, 3, v0
207 ; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v3, v3, s[0:3], 0 offen
208 ; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v2, v2, s[0:3], 0 offen
209 ; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v1, v1, s[0:3], 0 offen
210 ; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v0, v0, s[0:3], 0 offen
211 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(3)
212 ; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v3, 24, v3
213 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(2)
214 ; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
215 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(1)
216 ; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
217 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
218 ; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v0, v2, v0
219 ; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v1, v3, v1
220 ; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v0, v0, v1
221 ; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
223 ; GFX7-UNALIGNED-LABEL: private_load_2xi16_align1:
224 ; GFX7-UNALIGNED:       ; %bb.0:
225 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
226 ; GFX7-UNALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
227 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
228 ; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
230 ; GFX9-LABEL: private_load_2xi16_align1:
231 ; GFX9:       ; %bb.0:
232 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
233 ; GFX9-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
234 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
235 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
237 ; GFX9-FLASTSCR-LABEL: private_load_2xi16_align1:
238 ; GFX9-FLASTSCR:       ; %bb.0:
239 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
240 ; GFX9-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
241 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
242 ; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
244 ; GFX10-LABEL: private_load_2xi16_align1:
245 ; GFX10:       ; %bb.0:
246 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
247 ; GFX10-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
248 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
249 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
251 ; GFX10-FLASTSCR-LABEL: private_load_2xi16_align1:
252 ; GFX10-FLASTSCR:       ; %bb.0:
253 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
254 ; GFX10-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
255 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
256 ; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
258 ; GFX11-LABEL: private_load_2xi16_align1:
259 ; GFX11:       ; %bb.0:
260 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
261 ; GFX11-NEXT:    scratch_load_b32 v0, v0, off
262 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
263 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
265 ; GFX11-FLASTSCR-LABEL: private_load_2xi16_align1:
266 ; GFX11-FLASTSCR:       ; %bb.0:
267 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
268 ; GFX11-FLASTSCR-NEXT:    scratch_load_b32 v0, v0, off
269 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
270 ; GFX11-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
272 ; GFX12-LABEL: private_load_2xi16_align1:
273 ; GFX12:       ; %bb.0:
274 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
275 ; GFX12-NEXT:    s_wait_expcnt 0x0
276 ; GFX12-NEXT:    s_wait_samplecnt 0x0
277 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
278 ; GFX12-NEXT:    s_wait_kmcnt 0x0
279 ; GFX12-NEXT:    scratch_load_b32 v0, v0, off
280 ; GFX12-NEXT:    s_wait_loadcnt 0x0
281 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
283 ; GFX12-FLASTSCR-LABEL: private_load_2xi16_align1:
284 ; GFX12-FLASTSCR:       ; %bb.0:
285 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt_dscnt 0x0
286 ; GFX12-FLASTSCR-NEXT:    s_wait_expcnt 0x0
287 ; GFX12-FLASTSCR-NEXT:    s_wait_samplecnt 0x0
288 ; GFX12-FLASTSCR-NEXT:    s_wait_bvhcnt 0x0
289 ; GFX12-FLASTSCR-NEXT:    s_wait_kmcnt 0x0
290 ; GFX12-FLASTSCR-NEXT:    scratch_load_b32 v0, v0, off
291 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt 0x0
292 ; GFX12-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
293   %gep.p = getelementptr i16, ptr addrspace(5) %p, i64 1
294   %p.0 = load i16, ptr addrspace(5) %p, align 1
295   %p.1 = load i16, ptr addrspace(5) %gep.p, align 1
296   %zext.0 = zext i16 %p.0 to i32
297   %zext.1 = zext i16 %p.1 to i32
298   %shl.1 = shl i32 %zext.1, 16
299   %or = or i32 %zext.0, %shl.1
300   ret i32 %or
303 ; Should produce align 1 dword when legal
304 define void @private_store_2xi16_align1(ptr addrspace(5) %p, ptr addrspace(5) %r) #0 {
305 ; GFX7-ALIGNED-LABEL: private_store_2xi16_align1:
306 ; GFX7-ALIGNED:       ; %bb.0:
307 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
308 ; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v3, 1
309 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 2, v1
310 ; GFX7-ALIGNED-NEXT:    buffer_store_byte v3, v1, s[0:3], 0 offen
311 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v3, vcc, 1, v1
312 ; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v4, 0
313 ; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 3, v1
314 ; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v0, 2
315 ; GFX7-ALIGNED-NEXT:    buffer_store_byte v4, v3, s[0:3], 0 offen
316 ; GFX7-ALIGNED-NEXT:    buffer_store_byte v4, v1, s[0:3], 0 offen
317 ; GFX7-ALIGNED-NEXT:    buffer_store_byte v0, v2, s[0:3], 0 offen
318 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
319 ; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
321 ; GFX7-UNALIGNED-LABEL: private_store_2xi16_align1:
322 ; GFX7-UNALIGNED:       ; %bb.0:
323 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
324 ; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
325 ; GFX7-UNALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
326 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
327 ; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
329 ; GFX9-LABEL: private_store_2xi16_align1:
330 ; GFX9:       ; %bb.0:
331 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
332 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x20001
333 ; GFX9-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
334 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
335 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
337 ; GFX9-FLASTSCR-LABEL: private_store_2xi16_align1:
338 ; GFX9-FLASTSCR:       ; %bb.0:
339 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
340 ; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
341 ; GFX9-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
342 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
343 ; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
345 ; GFX10-LABEL: private_store_2xi16_align1:
346 ; GFX10:       ; %bb.0:
347 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
348 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0x20001
349 ; GFX10-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
350 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
352 ; GFX10-FLASTSCR-LABEL: private_store_2xi16_align1:
353 ; GFX10-FLASTSCR:       ; %bb.0:
354 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
355 ; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
356 ; GFX10-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
357 ; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
359 ; GFX11-LABEL: private_store_2xi16_align1:
360 ; GFX11:       ; %bb.0:
361 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
362 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0x20001
363 ; GFX11-NEXT:    scratch_store_b32 v1, v0, off
364 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
366 ; GFX11-FLASTSCR-LABEL: private_store_2xi16_align1:
367 ; GFX11-FLASTSCR:       ; %bb.0:
368 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
369 ; GFX11-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
370 ; GFX11-FLASTSCR-NEXT:    scratch_store_b32 v1, v0, off
371 ; GFX11-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
373 ; GFX12-LABEL: private_store_2xi16_align1:
374 ; GFX12:       ; %bb.0:
375 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
376 ; GFX12-NEXT:    s_wait_expcnt 0x0
377 ; GFX12-NEXT:    s_wait_samplecnt 0x0
378 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
379 ; GFX12-NEXT:    s_wait_kmcnt 0x0
380 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0x20001
381 ; GFX12-NEXT:    scratch_store_b32 v1, v0, off
382 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
384 ; GFX12-FLASTSCR-LABEL: private_store_2xi16_align1:
385 ; GFX12-FLASTSCR:       ; %bb.0:
386 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt_dscnt 0x0
387 ; GFX12-FLASTSCR-NEXT:    s_wait_expcnt 0x0
388 ; GFX12-FLASTSCR-NEXT:    s_wait_samplecnt 0x0
389 ; GFX12-FLASTSCR-NEXT:    s_wait_bvhcnt 0x0
390 ; GFX12-FLASTSCR-NEXT:    s_wait_kmcnt 0x0
391 ; GFX12-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
392 ; GFX12-FLASTSCR-NEXT:    scratch_store_b32 v1, v0, off
393 ; GFX12-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
394   %gep.r = getelementptr i16, ptr addrspace(5) %r, i64 1
395   store i16 1, ptr addrspace(5) %r, align 1
396   store i16 2, ptr addrspace(5) %gep.r, align 1
397   ret void
400 ; Should merge this to a dword load
401 define i32 @private_load_2xi16_align4(ptr addrspace(5) %p) #0 {
402 ; GFX7-ALIGNED-LABEL: private_load_2xi16_align4:
403 ; GFX7-ALIGNED:       ; %bb.0:
404 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
405 ; GFX7-ALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
406 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
407 ; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
409 ; GFX7-UNALIGNED-LABEL: private_load_2xi16_align4:
410 ; GFX7-UNALIGNED:       ; %bb.0:
411 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
412 ; GFX7-UNALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
413 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
414 ; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
416 ; GFX9-LABEL: private_load_2xi16_align4:
417 ; GFX9:       ; %bb.0:
418 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
419 ; GFX9-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
420 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
421 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
423 ; GFX9-FLASTSCR-LABEL: private_load_2xi16_align4:
424 ; GFX9-FLASTSCR:       ; %bb.0:
425 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
426 ; GFX9-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
427 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
428 ; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
430 ; GFX10-LABEL: private_load_2xi16_align4:
431 ; GFX10:       ; %bb.0:
432 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
433 ; GFX10-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
434 ; GFX10-NEXT:    s_waitcnt vmcnt(0)
435 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
437 ; GFX10-FLASTSCR-LABEL: private_load_2xi16_align4:
438 ; GFX10-FLASTSCR:       ; %bb.0:
439 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
440 ; GFX10-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
441 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
442 ; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
444 ; GFX11-LABEL: private_load_2xi16_align4:
445 ; GFX11:       ; %bb.0:
446 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
447 ; GFX11-NEXT:    scratch_load_b32 v0, v0, off
448 ; GFX11-NEXT:    s_waitcnt vmcnt(0)
449 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
451 ; GFX11-FLASTSCR-LABEL: private_load_2xi16_align4:
452 ; GFX11-FLASTSCR:       ; %bb.0:
453 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
454 ; GFX11-FLASTSCR-NEXT:    scratch_load_b32 v0, v0, off
455 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
456 ; GFX11-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
458 ; GFX12-LABEL: private_load_2xi16_align4:
459 ; GFX12:       ; %bb.0:
460 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
461 ; GFX12-NEXT:    s_wait_expcnt 0x0
462 ; GFX12-NEXT:    s_wait_samplecnt 0x0
463 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
464 ; GFX12-NEXT:    s_wait_kmcnt 0x0
465 ; GFX12-NEXT:    scratch_load_b32 v0, v0, off
466 ; GFX12-NEXT:    s_wait_loadcnt 0x0
467 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
469 ; GFX12-FLASTSCR-LABEL: private_load_2xi16_align4:
470 ; GFX12-FLASTSCR:       ; %bb.0:
471 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt_dscnt 0x0
472 ; GFX12-FLASTSCR-NEXT:    s_wait_expcnt 0x0
473 ; GFX12-FLASTSCR-NEXT:    s_wait_samplecnt 0x0
474 ; GFX12-FLASTSCR-NEXT:    s_wait_bvhcnt 0x0
475 ; GFX12-FLASTSCR-NEXT:    s_wait_kmcnt 0x0
476 ; GFX12-FLASTSCR-NEXT:    scratch_load_b32 v0, v0, off
477 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt 0x0
478 ; GFX12-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
479   %gep.p = getelementptr i16, ptr addrspace(5) %p, i64 1
480   %p.0 = load i16, ptr addrspace(5) %p, align 4
481   %p.1 = load i16, ptr addrspace(5) %gep.p, align 2
482   %zext.0 = zext i16 %p.0 to i32
483   %zext.1 = zext i16 %p.1 to i32
484   %shl.1 = shl i32 %zext.1, 16
485   %or = or i32 %zext.0, %shl.1
486   ret i32 %or
489 ; Should merge this to a dword store
490 define void @private_store_2xi16_align4(ptr addrspace(5) %p, ptr addrspace(5) %r) #0 {
491 ; GFX7-ALIGNED-LABEL: private_store_2xi16_align4:
492 ; GFX7-ALIGNED:       ; %bb.0:
493 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
494 ; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
495 ; GFX7-ALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
496 ; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
497 ; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
499 ; GFX7-UNALIGNED-LABEL: private_store_2xi16_align4:
500 ; GFX7-UNALIGNED:       ; %bb.0:
501 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
502 ; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
503 ; GFX7-UNALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
504 ; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
505 ; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
507 ; GFX9-LABEL: private_store_2xi16_align4:
508 ; GFX9:       ; %bb.0:
509 ; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
510 ; GFX9-NEXT:    v_mov_b32_e32 v0, 0x20001
511 ; GFX9-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
512 ; GFX9-NEXT:    s_waitcnt vmcnt(0)
513 ; GFX9-NEXT:    s_setpc_b64 s[30:31]
515 ; GFX9-FLASTSCR-LABEL: private_store_2xi16_align4:
516 ; GFX9-FLASTSCR:       ; %bb.0:
517 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
518 ; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
519 ; GFX9-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
520 ; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
521 ; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
523 ; GFX10-LABEL: private_store_2xi16_align4:
524 ; GFX10:       ; %bb.0:
525 ; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
526 ; GFX10-NEXT:    v_mov_b32_e32 v0, 0x20001
527 ; GFX10-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
528 ; GFX10-NEXT:    s_setpc_b64 s[30:31]
530 ; GFX10-FLASTSCR-LABEL: private_store_2xi16_align4:
531 ; GFX10-FLASTSCR:       ; %bb.0:
532 ; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
533 ; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
534 ; GFX10-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
535 ; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
537 ; GFX11-LABEL: private_store_2xi16_align4:
538 ; GFX11:       ; %bb.0:
539 ; GFX11-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
540 ; GFX11-NEXT:    v_mov_b32_e32 v0, 0x20001
541 ; GFX11-NEXT:    scratch_store_b32 v1, v0, off
542 ; GFX11-NEXT:    s_setpc_b64 s[30:31]
544 ; GFX11-FLASTSCR-LABEL: private_store_2xi16_align4:
545 ; GFX11-FLASTSCR:       ; %bb.0:
546 ; GFX11-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
547 ; GFX11-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
548 ; GFX11-FLASTSCR-NEXT:    scratch_store_b32 v1, v0, off
549 ; GFX11-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
551 ; GFX12-LABEL: private_store_2xi16_align4:
552 ; GFX12:       ; %bb.0:
553 ; GFX12-NEXT:    s_wait_loadcnt_dscnt 0x0
554 ; GFX12-NEXT:    s_wait_expcnt 0x0
555 ; GFX12-NEXT:    s_wait_samplecnt 0x0
556 ; GFX12-NEXT:    s_wait_bvhcnt 0x0
557 ; GFX12-NEXT:    s_wait_kmcnt 0x0
558 ; GFX12-NEXT:    v_mov_b32_e32 v0, 0x20001
559 ; GFX12-NEXT:    scratch_store_b32 v1, v0, off
560 ; GFX12-NEXT:    s_setpc_b64 s[30:31]
562 ; GFX12-FLASTSCR-LABEL: private_store_2xi16_align4:
563 ; GFX12-FLASTSCR:       ; %bb.0:
564 ; GFX12-FLASTSCR-NEXT:    s_wait_loadcnt_dscnt 0x0
565 ; GFX12-FLASTSCR-NEXT:    s_wait_expcnt 0x0
566 ; GFX12-FLASTSCR-NEXT:    s_wait_samplecnt 0x0
567 ; GFX12-FLASTSCR-NEXT:    s_wait_bvhcnt 0x0
568 ; GFX12-FLASTSCR-NEXT:    s_wait_kmcnt 0x0
569 ; GFX12-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
570 ; GFX12-FLASTSCR-NEXT:    scratch_store_b32 v1, v0, off
571 ; GFX12-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
572   %gep.r = getelementptr i16, ptr addrspace(5) %r, i64 1
573   store i16 1, ptr addrspace(5) %r, align 4
574   store i16 2, ptr addrspace(5) %gep.r, align 2
575   ret void