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 -amdgpu-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 -amdgpu-enable-flat-scratch < %s | FileCheck --check-prefix=GFX10-FLASTSCR %s
8
9; Should not merge this to a dword load
10define i32 @private_load_2xi16_align2(i16 addrspace(5)* %p) #0 {
11; GFX7-ALIGNED-LABEL: private_load_2xi16_align2:
12; GFX7-ALIGNED:       ; %bb.0:
13; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
14; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 2, v0
15; GFX7-ALIGNED-NEXT:    buffer_load_ushort v1, v1, s[0:3], 0 offen
16; GFX7-ALIGNED-NEXT:    buffer_load_ushort v0, v0, s[0:3], 0 offen
17; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(1)
18; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
19; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
20; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v0, v0, v1
21; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
22;
23; GFX7-UNALIGNED-LABEL: private_load_2xi16_align2:
24; GFX7-UNALIGNED:       ; %bb.0:
25; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
26; GFX7-UNALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 2, v0
27; GFX7-UNALIGNED-NEXT:    buffer_load_ushort v1, v1, s[0:3], 0 offen
28; GFX7-UNALIGNED-NEXT:    buffer_load_ushort v0, v0, s[0:3], 0 offen
29; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(1)
30; GFX7-UNALIGNED-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
31; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
32; GFX7-UNALIGNED-NEXT:    v_or_b32_e32 v0, v0, v1
33; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
34;
35; GFX9-LABEL: private_load_2xi16_align2:
36; GFX9:       ; %bb.0:
37; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
38; GFX9-NEXT:    buffer_load_ushort v1, v0, s[0:3], 0 offen
39; GFX9-NEXT:    buffer_load_ushort v2, v0, s[0:3], 0 offen offset:2
40; GFX9-NEXT:    s_waitcnt vmcnt(0)
41; GFX9-NEXT:    v_lshl_or_b32 v0, v2, 16, v1
42; GFX9-NEXT:    s_setpc_b64 s[30:31]
43;
44; GFX9-FLASTSCR-LABEL: private_load_2xi16_align2:
45; GFX9-FLASTSCR:       ; %bb.0:
46; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
47; GFX9-FLASTSCR-NEXT:    scratch_load_ushort v1, v0, off
48; GFX9-FLASTSCR-NEXT:    scratch_load_ushort v2, v0, off offset:2
49; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
50; GFX9-FLASTSCR-NEXT:    v_lshl_or_b32 v0, v2, 16, v1
51; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
52;
53; GFX10-LABEL: private_load_2xi16_align2:
54; GFX10:       ; %bb.0:
55; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
56; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
57; GFX10-NEXT:    s_clause 0x1
58; GFX10-NEXT:    buffer_load_ushort v1, v0, s[0:3], 0 offen
59; GFX10-NEXT:    buffer_load_ushort v2, v0, s[0:3], 0 offen offset:2
60; GFX10-NEXT:    s_waitcnt vmcnt(0)
61; GFX10-NEXT:    v_lshl_or_b32 v0, v2, 16, v1
62; GFX10-NEXT:    s_setpc_b64 s[30:31]
63;
64; GFX10-FLASTSCR-LABEL: private_load_2xi16_align2:
65; GFX10-FLASTSCR:       ; %bb.0:
66; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
67; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
68; GFX10-FLASTSCR-NEXT:    s_clause 0x1
69; GFX10-FLASTSCR-NEXT:    scratch_load_ushort v1, v0, off
70; GFX10-FLASTSCR-NEXT:    scratch_load_ushort v2, v0, off offset:2
71; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
72; GFX10-FLASTSCR-NEXT:    v_lshl_or_b32 v0, v2, 16, v1
73; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
74  %gep.p = getelementptr i16, i16 addrspace(5)* %p, i64 1
75  %p.0 = load i16, i16 addrspace(5)* %p, align 2
76  %p.1 = load i16, i16 addrspace(5)* %gep.p, align 2
77  %zext.0 = zext i16 %p.0 to i32
78  %zext.1 = zext i16 %p.1 to i32
79  %shl.1 = shl i32 %zext.1, 16
80  %or = or i32 %zext.0, %shl.1
81  ret i32 %or
82}
83
84; Should not merge this to a dword store
85define void @private_store_2xi16_align2(i16 addrspace(5)* %p, i16 addrspace(5)* %r) #0 {
86; GFX7-ALIGNED-LABEL: private_store_2xi16_align2:
87; GFX7-ALIGNED:       ; %bb.0:
88; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
89; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v3, 1
90; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v0, 2
91; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 2, v1
92; GFX7-ALIGNED-NEXT:    buffer_store_short v3, v1, s[0:3], 0 offen
93; GFX7-ALIGNED-NEXT:    buffer_store_short v0, v2, s[0:3], 0 offen
94; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
95; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
96;
97; GFX7-UNALIGNED-LABEL: private_store_2xi16_align2:
98; GFX7-UNALIGNED:       ; %bb.0:
99; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
100; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v3, 1
101; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v0, 2
102; GFX7-UNALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 2, v1
103; GFX7-UNALIGNED-NEXT:    buffer_store_short v3, v1, s[0:3], 0 offen
104; GFX7-UNALIGNED-NEXT:    buffer_store_short v0, v2, s[0:3], 0 offen
105; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
106; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
107;
108; GFX9-LABEL: private_store_2xi16_align2:
109; GFX9:       ; %bb.0:
110; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
111; GFX9-NEXT:    v_mov_b32_e32 v0, 1
112; GFX9-NEXT:    buffer_store_short v0, v1, s[0:3], 0 offen
113; GFX9-NEXT:    v_mov_b32_e32 v0, 2
114; GFX9-NEXT:    buffer_store_short v0, v1, s[0:3], 0 offen offset:2
115; GFX9-NEXT:    s_waitcnt vmcnt(0)
116; GFX9-NEXT:    s_setpc_b64 s[30:31]
117;
118; GFX9-FLASTSCR-LABEL: private_store_2xi16_align2:
119; GFX9-FLASTSCR:       ; %bb.0:
120; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
121; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 1
122; GFX9-FLASTSCR-NEXT:    scratch_store_short v1, v0, off
123; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 2
124; GFX9-FLASTSCR-NEXT:    scratch_store_short v1, v0, off offset:2
125; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
126; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
127;
128; GFX10-LABEL: private_store_2xi16_align2:
129; GFX10:       ; %bb.0:
130; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
131; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
132; GFX10-NEXT:    v_mov_b32_e32 v0, 1
133; GFX10-NEXT:    v_mov_b32_e32 v2, 2
134; GFX10-NEXT:    buffer_store_short v0, v1, s[0:3], 0 offen
135; GFX10-NEXT:    buffer_store_short v2, v1, s[0:3], 0 offen offset:2
136; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
137; GFX10-NEXT:    s_setpc_b64 s[30:31]
138;
139; GFX10-FLASTSCR-LABEL: private_store_2xi16_align2:
140; GFX10-FLASTSCR:       ; %bb.0:
141; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
142; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
143; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 1
144; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v2, 2
145; GFX10-FLASTSCR-NEXT:    scratch_store_short v1, v0, off
146; GFX10-FLASTSCR-NEXT:    scratch_store_short v1, v2, off offset:2
147; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
148; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
149  %gep.r = getelementptr i16, i16 addrspace(5)* %r, i64 1
150  store i16 1, i16 addrspace(5)* %r, align 2
151  store i16 2, i16 addrspace(5)* %gep.r, align 2
152  ret void
153}
154
155; Should produce align 1 dword when legal
156define i32 @private_load_2xi16_align1(i16 addrspace(5)* %p) #0 {
157; GFX7-ALIGNED-LABEL: private_load_2xi16_align1:
158; GFX7-ALIGNED:       ; %bb.0:
159; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
160; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 2, v0
161; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 1, v0
162; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v3, vcc, 3, v0
163; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v2, v2, s[0:3], 0 offen
164; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v3, v3, s[0:3], 0 offen
165; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v0, v0, s[0:3], 0 offen
166; GFX7-ALIGNED-NEXT:    buffer_load_ubyte v1, v1, s[0:3], 0 offen
167; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(3)
168; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v2, 8, v2
169; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(2)
170; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v3, 8, v3
171; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(1)
172; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v0, v2, v0
173; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
174; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v1, v3, v1
175; GFX7-ALIGNED-NEXT:    v_lshlrev_b32_e32 v1, 16, v1
176; GFX7-ALIGNED-NEXT:    v_or_b32_e32 v0, v0, v1
177; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
178;
179; GFX7-UNALIGNED-LABEL: private_load_2xi16_align1:
180; GFX7-UNALIGNED:       ; %bb.0:
181; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
182; GFX7-UNALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
183; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
184; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
185;
186; GFX9-LABEL: private_load_2xi16_align1:
187; GFX9:       ; %bb.0:
188; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
189; GFX9-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
190; GFX9-NEXT:    v_mov_b32_e32 v1, 0xffff
191; GFX9-NEXT:    s_mov_b32 s4, 0xffff
192; GFX9-NEXT:    s_waitcnt vmcnt(0)
193; GFX9-NEXT:    v_bfi_b32 v1, v1, 0, v0
194; GFX9-NEXT:    v_and_or_b32 v0, v0, s4, v1
195; GFX9-NEXT:    s_setpc_b64 s[30:31]
196;
197; GFX9-FLASTSCR-LABEL: private_load_2xi16_align1:
198; GFX9-FLASTSCR:       ; %bb.0:
199; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
200; GFX9-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
201; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v1, 0xffff
202; GFX9-FLASTSCR-NEXT:    s_mov_b32 s0, 0xffff
203; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
204; GFX9-FLASTSCR-NEXT:    v_bfi_b32 v1, v1, 0, v0
205; GFX9-FLASTSCR-NEXT:    v_and_or_b32 v0, v0, s0, v1
206; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
207;
208; GFX10-LABEL: private_load_2xi16_align1:
209; GFX10:       ; %bb.0:
210; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
211; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
212; GFX10-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
213; GFX10-NEXT:    s_waitcnt vmcnt(0)
214; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, 0, v0
215; GFX10-NEXT:    v_and_or_b32 v0, 0xffff, v0, v1
216; GFX10-NEXT:    s_setpc_b64 s[30:31]
217;
218; GFX10-FLASTSCR-LABEL: private_load_2xi16_align1:
219; GFX10-FLASTSCR:       ; %bb.0:
220; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
221; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
222; GFX10-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
223; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
224; GFX10-FLASTSCR-NEXT:    v_bfi_b32 v1, 0xffff, 0, v0
225; GFX10-FLASTSCR-NEXT:    v_and_or_b32 v0, 0xffff, v0, v1
226; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
227  %gep.p = getelementptr i16, i16 addrspace(5)* %p, i64 1
228  %p.0 = load i16, i16 addrspace(5)* %p, align 1
229  %p.1 = load i16, i16 addrspace(5)* %gep.p, align 1
230  %zext.0 = zext i16 %p.0 to i32
231  %zext.1 = zext i16 %p.1 to i32
232  %shl.1 = shl i32 %zext.1, 16
233  %or = or i32 %zext.0, %shl.1
234  ret i32 %or
235}
236
237; Should produce align 1 dword when legal
238define void @private_store_2xi16_align1(i16 addrspace(5)* %p, i16 addrspace(5)* %r) #0 {
239; GFX7-ALIGNED-LABEL: private_store_2xi16_align1:
240; GFX7-ALIGNED:       ; %bb.0:
241; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
242; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v3, 1
243; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v2, vcc, 2, v1
244; GFX7-ALIGNED-NEXT:    buffer_store_byte v3, v1, s[0:3], 0 offen
245; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v3, vcc, 1, v1
246; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v4, 0
247; GFX7-ALIGNED-NEXT:    v_add_i32_e32 v1, vcc, 3, v1
248; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v0, 2
249; GFX7-ALIGNED-NEXT:    buffer_store_byte v4, v3, s[0:3], 0 offen
250; GFX7-ALIGNED-NEXT:    buffer_store_byte v4, v1, s[0:3], 0 offen
251; GFX7-ALIGNED-NEXT:    buffer_store_byte v0, v2, s[0:3], 0 offen
252; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
253; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
254;
255; GFX7-UNALIGNED-LABEL: private_store_2xi16_align1:
256; GFX7-UNALIGNED:       ; %bb.0:
257; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
258; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
259; GFX7-UNALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
260; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
261; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
262;
263; GFX9-LABEL: private_store_2xi16_align1:
264; GFX9:       ; %bb.0:
265; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
266; GFX9-NEXT:    v_mov_b32_e32 v0, 0x20001
267; GFX9-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
268; GFX9-NEXT:    s_waitcnt vmcnt(0)
269; GFX9-NEXT:    s_setpc_b64 s[30:31]
270;
271; GFX9-FLASTSCR-LABEL: private_store_2xi16_align1:
272; GFX9-FLASTSCR:       ; %bb.0:
273; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
274; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
275; GFX9-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
276; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
277; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
278;
279; GFX10-LABEL: private_store_2xi16_align1:
280; GFX10:       ; %bb.0:
281; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
282; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
283; GFX10-NEXT:    v_mov_b32_e32 v0, 0x20001
284; GFX10-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
285; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
286; GFX10-NEXT:    s_setpc_b64 s[30:31]
287;
288; GFX10-FLASTSCR-LABEL: private_store_2xi16_align1:
289; GFX10-FLASTSCR:       ; %bb.0:
290; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
291; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
292; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
293; GFX10-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
294; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
295; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
296  %gep.r = getelementptr i16, i16 addrspace(5)* %r, i64 1
297  store i16 1, i16 addrspace(5)* %r, align 1
298  store i16 2, i16 addrspace(5)* %gep.r, align 1
299  ret void
300}
301
302; Should merge this to a dword load
303define i32 @private_load_2xi16_align4(i16 addrspace(5)* %p) #0 {
304; GFX7-LABEL: load_2xi16_align4:
305; GFX7:       ; %bb.0:
306; GFX7-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
307; GFX7-NEXT:    flat_load_dword v0, v[0:1]
308; GFX7-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
309; GFX7-NEXT:    s_setpc_b64 s[30:31]
310;
311; GFX7-ALIGNED-LABEL: private_load_2xi16_align4:
312; GFX7-ALIGNED:       ; %bb.0:
313; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
314; GFX7-ALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
315; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
316; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
317;
318; GFX7-UNALIGNED-LABEL: private_load_2xi16_align4:
319; GFX7-UNALIGNED:       ; %bb.0:
320; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
321; GFX7-UNALIGNED-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
322; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
323; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
324;
325; GFX9-LABEL: private_load_2xi16_align4:
326; GFX9:       ; %bb.0:
327; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
328; GFX9-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
329; GFX9-NEXT:    v_mov_b32_e32 v1, 0xffff
330; GFX9-NEXT:    s_mov_b32 s4, 0xffff
331; GFX9-NEXT:    s_waitcnt vmcnt(0)
332; GFX9-NEXT:    v_bfi_b32 v1, v1, 0, v0
333; GFX9-NEXT:    v_and_or_b32 v0, v0, s4, v1
334; GFX9-NEXT:    s_setpc_b64 s[30:31]
335;
336; GFX9-FLASTSCR-LABEL: private_load_2xi16_align4:
337; GFX9-FLASTSCR:       ; %bb.0:
338; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
339; GFX9-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
340; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v1, 0xffff
341; GFX9-FLASTSCR-NEXT:    s_mov_b32 s0, 0xffff
342; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
343; GFX9-FLASTSCR-NEXT:    v_bfi_b32 v1, v1, 0, v0
344; GFX9-FLASTSCR-NEXT:    v_and_or_b32 v0, v0, s0, v1
345; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
346;
347; GFX10-LABEL: private_load_2xi16_align4:
348; GFX10:       ; %bb.0:
349; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
350; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
351; GFX10-NEXT:    buffer_load_dword v0, v0, s[0:3], 0 offen
352; GFX10-NEXT:    s_waitcnt vmcnt(0)
353; GFX10-NEXT:    v_bfi_b32 v1, 0xffff, 0, v0
354; GFX10-NEXT:    v_and_or_b32 v0, 0xffff, v0, v1
355; GFX10-NEXT:    s_setpc_b64 s[30:31]
356;
357; GFX10-FLASTSCR-LABEL: private_load_2xi16_align4:
358; GFX10-FLASTSCR:       ; %bb.0:
359; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
360; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
361; GFX10-FLASTSCR-NEXT:    scratch_load_dword v0, v0, off
362; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
363; GFX10-FLASTSCR-NEXT:    v_bfi_b32 v1, 0xffff, 0, v0
364; GFX10-FLASTSCR-NEXT:    v_and_or_b32 v0, 0xffff, v0, v1
365; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
366  %gep.p = getelementptr i16, i16 addrspace(5)* %p, i64 1
367  %p.0 = load i16, i16 addrspace(5)* %p, align 4
368  %p.1 = load i16, i16 addrspace(5)* %gep.p, align 2
369  %zext.0 = zext i16 %p.0 to i32
370  %zext.1 = zext i16 %p.1 to i32
371  %shl.1 = shl i32 %zext.1, 16
372  %or = or i32 %zext.0, %shl.1
373  ret i32 %or
374}
375
376; Should merge this to a dword store
377define void @private_store_2xi16_align4(i16 addrspace(5)* %p, i16 addrspace(5)* %r) #0 {
378; GFX7-LABEL: private_store_2xi16_align4:
379; GFX7:       ; %bb.0:
380; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[4:5], 0x2
381; GFX7-NEXT:    v_mov_b32_e32 v2, 0x20001
382; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
383; GFX7-NEXT:    v_mov_b32_e32 v0, s0
384; GFX7-NEXT:    v_mov_b32_e32 v1, s1
385; GFX7-NEXT:    flat_store_dword v[0:1], v2
386; GFX7-NEXT:    s_endpgm
387;
388; GFX7-ALIGNED-LABEL: private_store_2xi16_align4:
389; GFX7-ALIGNED:       ; %bb.0:
390; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
391; GFX7-ALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
392; GFX7-ALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
393; GFX7-ALIGNED-NEXT:    s_waitcnt vmcnt(0)
394; GFX7-ALIGNED-NEXT:    s_setpc_b64 s[30:31]
395;
396; GFX7-UNALIGNED-LABEL: private_store_2xi16_align4:
397; GFX7-UNALIGNED:       ; %bb.0:
398; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
399; GFX7-UNALIGNED-NEXT:    v_mov_b32_e32 v0, 0x20001
400; GFX7-UNALIGNED-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
401; GFX7-UNALIGNED-NEXT:    s_waitcnt vmcnt(0)
402; GFX7-UNALIGNED-NEXT:    s_setpc_b64 s[30:31]
403;
404; GFX9-LABEL: private_store_2xi16_align4:
405; GFX9:       ; %bb.0:
406; GFX9-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
407; GFX9-NEXT:    v_mov_b32_e32 v0, 0x20001
408; GFX9-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
409; GFX9-NEXT:    s_waitcnt vmcnt(0)
410; GFX9-NEXT:    s_setpc_b64 s[30:31]
411;
412; GFX9-FLASTSCR-LABEL: private_store_2xi16_align4:
413; GFX9-FLASTSCR:       ; %bb.0:
414; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
415; GFX9-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
416; GFX9-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
417; GFX9-FLASTSCR-NEXT:    s_waitcnt vmcnt(0)
418; GFX9-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
419;
420; GFX10-LABEL: private_store_2xi16_align4:
421; GFX10:       ; %bb.0:
422; GFX10-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
423; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
424; GFX10-NEXT:    v_mov_b32_e32 v0, 0x20001
425; GFX10-NEXT:    buffer_store_dword v0, v1, s[0:3], 0 offen
426; GFX10-NEXT:    s_waitcnt_vscnt null, 0x0
427; GFX10-NEXT:    s_setpc_b64 s[30:31]
428;
429; GFX10-FLASTSCR-LABEL: private_store_2xi16_align4:
430; GFX10-FLASTSCR:       ; %bb.0:
431; GFX10-FLASTSCR-NEXT:    s_waitcnt vmcnt(0) expcnt(0) lgkmcnt(0)
432; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
433; GFX10-FLASTSCR-NEXT:    v_mov_b32_e32 v0, 0x20001
434; GFX10-FLASTSCR-NEXT:    scratch_store_dword v1, v0, off
435; GFX10-FLASTSCR-NEXT:    s_waitcnt_vscnt null, 0x0
436; GFX10-FLASTSCR-NEXT:    s_setpc_b64 s[30:31]
437  %gep.r = getelementptr i16, i16 addrspace(5)* %r, i64 1
438  store i16 1, i16 addrspace(5)* %r, align 4
439  store i16 2, i16 addrspace(5)* %gep.r, align 2
440  ret void
441}
442