1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx940 < %s | FileCheck %s -check-prefixes=GFX940-SDAG
3; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx940 < %s | FileCheck %s -check-prefixes=GFX940-GISEL
4; RUN: llc -global-isel=0 -march=amdgcn -mcpu=gfx1100 < %s | FileCheck %s -check-prefixes=GFX11-SDAG
5; RUN: llc -global-isel=1 -march=amdgcn -mcpu=gfx1100 < %s | FileCheck %s -check-prefixes=GFX11-GISEL
6
7; Test flat scratch SVS addressing mode with various combinations of alignment
8; of soffset, voffset and inst_offset.
9
10declare i32 @llvm.amdgcn.workitem.id.x()
11
12define amdgpu_kernel void @soff1_voff1(i32 %soff) {
13; GFX940-SDAG-LABEL: soff1_voff1:
14; GFX940-SDAG:       ; %bb.0: ; %bb
15; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
16; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
17; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
18; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
19; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
20; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
21; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
22; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
23; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
24; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
25; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
26; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
27; GFX940-SDAG-NEXT:    s_endpgm
28;
29; GFX940-GISEL-LABEL: soff1_voff1:
30; GFX940-GISEL:       ; %bb.0: ; %bb
31; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
32; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
33; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
34; GFX940-GISEL-NEXT:    v_mov_b32_e32 v3, 2
35; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
36; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
37; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
38; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
39; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
40; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
41; GFX940-GISEL-NEXT:    scratch_store_byte v0, v3, off offset:2 sc0 sc1
42; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
43; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
44; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
45; GFX940-GISEL-NEXT:    s_endpgm
46;
47; GFX11-SDAG-LABEL: soff1_voff1:
48; GFX11-SDAG:       ; %bb.0: ; %bb
49; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
50; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
51; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
52; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
53; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
54; GFX11-SDAG-NEXT:    v_add3_u32 v0, 4, s0, v0
55; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, off offset:1 dlc
56; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
57; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, off offset:2 dlc
58; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
59; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
60; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
61; GFX11-SDAG-NEXT:    s_endpgm
62;
63; GFX11-GISEL-LABEL: soff1_voff1:
64; GFX11-GISEL:       ; %bb.0: ; %bb
65; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
66; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
67; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
68; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
69; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
70; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
71; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
72; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
73; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
74; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
75; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
76; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
77; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
78; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
79; GFX11-GISEL-NEXT:    s_endpgm
80bb:
81  %soff1 = mul i32 %soff, 1
82  %a = alloca i8, i32 64, align 4, addrspace(5)
83  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff1
84  %voff = call i32 @llvm.amdgcn.workitem.id.x()
85  %voff1 = mul i32 %voff, 1
86  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff1
87  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
88  store volatile i8 1, i8 addrspace(5)* %p1
89  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
90  store volatile i8 2, i8 addrspace(5)* %p2
91  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
92  store volatile i8 4, i8 addrspace(5)* %p4
93  ret void
94}
95
96define amdgpu_kernel void @soff1_voff2(i32 %soff) {
97; GFX940-SDAG-LABEL: soff1_voff2:
98; GFX940-SDAG:       ; %bb.0: ; %bb
99; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
100; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
101; GFX940-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
102; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
103; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
104; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
105; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
106; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
107; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
108; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
109; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
110; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
111; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
112; GFX940-SDAG-NEXT:    s_endpgm
113;
114; GFX940-GISEL-LABEL: soff1_voff2:
115; GFX940-GISEL:       ; %bb.0: ; %bb
116; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
117; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
118; GFX940-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
119; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
120; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
121; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
122; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
123; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 2
124; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
125; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
126; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:2 sc0 sc1
127; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
128; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
129; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
130; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
131; GFX940-GISEL-NEXT:    s_endpgm
132;
133; GFX11-SDAG-LABEL: soff1_voff2:
134; GFX11-SDAG:       ; %bb.0: ; %bb
135; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
136; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
137; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
138; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
139; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
140; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
141; GFX11-SDAG-NEXT:    v_add3_u32 v0, 4, s0, v0
142; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, off offset:1 dlc
143; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
144; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, off offset:2 dlc
145; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
146; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
147; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
148; GFX11-SDAG-NEXT:    s_endpgm
149;
150; GFX11-GISEL-LABEL: soff1_voff2:
151; GFX11-GISEL:       ; %bb.0: ; %bb
152; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
153; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
154; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
155; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
156; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
157; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
158; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
159; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
160; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
161; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
162; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
163; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
164; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
165; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
166; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
167; GFX11-GISEL-NEXT:    s_endpgm
168bb:
169  %soff1 = mul i32 %soff, 1
170  %a = alloca i8, i32 64, align 4, addrspace(5)
171  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff1
172  %voff = call i32 @llvm.amdgcn.workitem.id.x()
173  %voff2 = mul i32 %voff, 2
174  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff2
175  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
176  store volatile i8 1, i8 addrspace(5)* %p1
177  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
178  store volatile i8 2, i8 addrspace(5)* %p2
179  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
180  store volatile i8 4, i8 addrspace(5)* %p4
181  ret void
182}
183
184define amdgpu_kernel void @soff1_voff4(i32 %soff) {
185; GFX940-SDAG-LABEL: soff1_voff4:
186; GFX940-SDAG:       ; %bb.0: ; %bb
187; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
188; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
189; GFX940-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
190; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
191; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
192; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
193; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
194; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
195; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
196; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
197; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
198; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
199; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
200; GFX940-SDAG-NEXT:    s_endpgm
201;
202; GFX940-GISEL-LABEL: soff1_voff4:
203; GFX940-GISEL:       ; %bb.0: ; %bb
204; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
205; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
206; GFX940-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
207; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
208; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
209; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
210; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
211; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 2
212; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
213; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
214; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:2 sc0 sc1
215; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
216; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
217; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
218; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
219; GFX940-GISEL-NEXT:    s_endpgm
220;
221; GFX11-SDAG-LABEL: soff1_voff4:
222; GFX11-SDAG:       ; %bb.0: ; %bb
223; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
224; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
225; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
226; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
227; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
228; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
229; GFX11-SDAG-NEXT:    s_add_i32 s0, s0, 4
230; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, s0 offset:1 dlc
231; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
232; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, s0 offset:2 dlc
233; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
234; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, s0 offset:4 dlc
235; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
236; GFX11-SDAG-NEXT:    s_endpgm
237;
238; GFX11-GISEL-LABEL: soff1_voff4:
239; GFX11-GISEL:       ; %bb.0: ; %bb
240; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
241; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
242; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
243; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
244; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
245; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
246; GFX11-GISEL-NEXT:    s_delay_alu instid0(VALU_DEP_1)
247; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
248; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
249; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
250; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
251; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
252; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
253; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
254; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
255; GFX11-GISEL-NEXT:    s_endpgm
256bb:
257  %soff1 = mul i32 %soff, 1
258  %a = alloca i8, i32 64, align 4, addrspace(5)
259  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff1
260  %voff = call i32 @llvm.amdgcn.workitem.id.x()
261  %voff4 = mul i32 %voff, 4
262  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff4
263  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
264  store volatile i8 1, i8 addrspace(5)* %p1
265  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
266  store volatile i8 2, i8 addrspace(5)* %p2
267  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
268  store volatile i8 4, i8 addrspace(5)* %p4
269  ret void
270}
271
272define amdgpu_kernel void @soff2_voff1(i32 %soff) {
273; GFX940-SDAG-LABEL: soff2_voff1:
274; GFX940-SDAG:       ; %bb.0: ; %bb
275; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
276; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
277; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
278; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
279; GFX940-SDAG-NEXT:    s_lshl_b32 s0, s0, 1
280; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
281; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
282; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
283; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
284; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
285; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
286; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
287; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
288; GFX940-SDAG-NEXT:    s_endpgm
289;
290; GFX940-GISEL-LABEL: soff2_voff1:
291; GFX940-GISEL:       ; %bb.0: ; %bb
292; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
293; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
294; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
295; GFX940-GISEL-NEXT:    v_mov_b32_e32 v3, 2
296; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
297; GFX940-GISEL-NEXT:    s_lshl_b32 s0, s0, 1
298; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
299; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
300; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
301; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
302; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
303; GFX940-GISEL-NEXT:    scratch_store_byte v0, v3, off offset:2 sc0 sc1
304; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
305; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
306; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
307; GFX940-GISEL-NEXT:    s_endpgm
308;
309; GFX11-SDAG-LABEL: soff2_voff1:
310; GFX11-SDAG:       ; %bb.0: ; %bb
311; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
312; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
313; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
314; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
315; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
316; GFX11-SDAG-NEXT:    s_lshl_b32 s0, s0, 1
317; GFX11-SDAG-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
318; GFX11-SDAG-NEXT:    v_add3_u32 v0, 4, s0, v0
319; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, off offset:1 dlc
320; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
321; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, off offset:2 dlc
322; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
323; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
324; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
325; GFX11-SDAG-NEXT:    s_endpgm
326;
327; GFX11-GISEL-LABEL: soff2_voff1:
328; GFX11-GISEL:       ; %bb.0: ; %bb
329; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
330; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
331; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
332; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
333; GFX11-GISEL-NEXT:    s_lshl_b32 s0, s0, 1
334; GFX11-GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
335; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
336; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
337; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
338; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
339; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
340; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
341; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
342; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
343; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
344; GFX11-GISEL-NEXT:    s_endpgm
345bb:
346  %soff2 = mul i32 %soff, 2
347  %a = alloca i8, i32 64, align 4, addrspace(5)
348  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff2
349  %voff = call i32 @llvm.amdgcn.workitem.id.x()
350  %voff1 = mul i32 %voff, 1
351  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff1
352  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
353  store volatile i8 1, i8 addrspace(5)* %p1
354  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
355  store volatile i8 2, i8 addrspace(5)* %p2
356  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
357  store volatile i8 4, i8 addrspace(5)* %p4
358  ret void
359}
360
361define amdgpu_kernel void @soff2_voff2(i32 %soff) {
362; GFX940-SDAG-LABEL: soff2_voff2:
363; GFX940-SDAG:       ; %bb.0: ; %bb
364; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
365; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
366; GFX940-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
367; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
368; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
369; GFX940-SDAG-NEXT:    s_lshl_b32 s0, s0, 1
370; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
371; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
372; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
373; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
374; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
375; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
376; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
377; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
378; GFX940-SDAG-NEXT:    s_endpgm
379;
380; GFX940-GISEL-LABEL: soff2_voff2:
381; GFX940-GISEL:       ; %bb.0: ; %bb
382; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
383; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
384; GFX940-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
385; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
386; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
387; GFX940-GISEL-NEXT:    s_lshl_b32 s0, s0, 1
388; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
389; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
390; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 2
391; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
392; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
393; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:2 sc0 sc1
394; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
395; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
396; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
397; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
398; GFX940-GISEL-NEXT:    s_endpgm
399;
400; GFX11-SDAG-LABEL: soff2_voff2:
401; GFX11-SDAG:       ; %bb.0: ; %bb
402; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
403; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
404; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
405; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
406; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
407; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
408; GFX11-SDAG-NEXT:    s_lshl_b32 s0, s0, 1
409; GFX11-SDAG-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
410; GFX11-SDAG-NEXT:    v_add3_u32 v0, 4, s0, v0
411; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, off offset:1 dlc
412; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
413; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, off offset:2 dlc
414; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
415; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
416; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
417; GFX11-SDAG-NEXT:    s_endpgm
418;
419; GFX11-GISEL-LABEL: soff2_voff2:
420; GFX11-GISEL:       ; %bb.0: ; %bb
421; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
422; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
423; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
424; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
425; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
426; GFX11-GISEL-NEXT:    s_lshl_b32 s0, s0, 1
427; GFX11-GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
428; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
429; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
430; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
431; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
432; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
433; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
434; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
435; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
436; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
437; GFX11-GISEL-NEXT:    s_endpgm
438bb:
439  %soff2 = mul i32 %soff, 2
440  %a = alloca i8, i32 64, align 4, addrspace(5)
441  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff2
442  %voff = call i32 @llvm.amdgcn.workitem.id.x()
443  %voff2 = mul i32 %voff, 2
444  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff2
445  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
446  store volatile i8 1, i8 addrspace(5)* %p1
447  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
448  store volatile i8 2, i8 addrspace(5)* %p2
449  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
450  store volatile i8 4, i8 addrspace(5)* %p4
451  ret void
452}
453
454define amdgpu_kernel void @soff2_voff4(i32 %soff) {
455; GFX940-SDAG-LABEL: soff2_voff4:
456; GFX940-SDAG:       ; %bb.0: ; %bb
457; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
458; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
459; GFX940-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
460; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
461; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
462; GFX940-SDAG-NEXT:    s_lshl_b32 s0, s0, 1
463; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
464; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
465; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
466; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
467; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
468; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
469; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
470; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
471; GFX940-SDAG-NEXT:    s_endpgm
472;
473; GFX940-GISEL-LABEL: soff2_voff4:
474; GFX940-GISEL:       ; %bb.0: ; %bb
475; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
476; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
477; GFX940-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
478; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
479; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
480; GFX940-GISEL-NEXT:    s_lshl_b32 s0, s0, 1
481; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
482; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
483; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 2
484; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
485; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
486; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:2 sc0 sc1
487; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
488; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
489; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
490; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
491; GFX940-GISEL-NEXT:    s_endpgm
492;
493; GFX11-SDAG-LABEL: soff2_voff4:
494; GFX11-SDAG:       ; %bb.0: ; %bb
495; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
496; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
497; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
498; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
499; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
500; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
501; GFX11-SDAG-NEXT:    s_lshl_b32 s0, s0, 1
502; GFX11-SDAG-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
503; GFX11-SDAG-NEXT:    s_add_i32 s0, s0, 4
504; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, s0 offset:1 dlc
505; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
506; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, s0 offset:2 dlc
507; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
508; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, s0 offset:4 dlc
509; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
510; GFX11-SDAG-NEXT:    s_endpgm
511;
512; GFX11-GISEL-LABEL: soff2_voff4:
513; GFX11-GISEL:       ; %bb.0: ; %bb
514; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
515; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
516; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
517; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
518; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
519; GFX11-GISEL-NEXT:    s_lshl_b32 s0, s0, 1
520; GFX11-GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
521; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
522; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
523; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
524; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
525; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
526; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
527; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
528; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
529; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
530; GFX11-GISEL-NEXT:    s_endpgm
531bb:
532  %soff2 = mul i32 %soff, 2
533  %a = alloca i8, i32 64, align 4, addrspace(5)
534  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff2
535  %voff = call i32 @llvm.amdgcn.workitem.id.x()
536  %voff4 = mul i32 %voff, 4
537  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff4
538  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
539  store volatile i8 1, i8 addrspace(5)* %p1
540  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
541  store volatile i8 2, i8 addrspace(5)* %p2
542  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
543  store volatile i8 4, i8 addrspace(5)* %p4
544  ret void
545}
546
547define amdgpu_kernel void @soff4_voff1(i32 %soff) {
548; GFX940-SDAG-LABEL: soff4_voff1:
549; GFX940-SDAG:       ; %bb.0: ; %bb
550; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
551; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
552; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
553; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
554; GFX940-SDAG-NEXT:    s_lshl_b32 s0, s0, 2
555; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
556; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
557; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
558; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
559; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
560; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
561; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
562; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
563; GFX940-SDAG-NEXT:    s_endpgm
564;
565; GFX940-GISEL-LABEL: soff4_voff1:
566; GFX940-GISEL:       ; %bb.0: ; %bb
567; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
568; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
569; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
570; GFX940-GISEL-NEXT:    v_mov_b32_e32 v3, 2
571; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
572; GFX940-GISEL-NEXT:    s_lshl_b32 s0, s0, 2
573; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
574; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
575; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
576; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
577; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
578; GFX940-GISEL-NEXT:    scratch_store_byte v0, v3, off offset:2 sc0 sc1
579; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
580; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
581; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
582; GFX940-GISEL-NEXT:    s_endpgm
583;
584; GFX11-SDAG-LABEL: soff4_voff1:
585; GFX11-SDAG:       ; %bb.0: ; %bb
586; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
587; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
588; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 2
589; GFX11-SDAG-NEXT:    v_mov_b32_e32 v4, 4
590; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
591; GFX11-SDAG-NEXT:    s_lshl_b32 s0, s0, 2
592; GFX11-SDAG-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
593; GFX11-SDAG-NEXT:    v_add3_u32 v2, 4, s0, v0
594; GFX11-SDAG-NEXT:    s_add_i32 s0, s0, 4
595; GFX11-SDAG-NEXT:    scratch_store_b8 v2, v1, off offset:1 dlc
596; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
597; GFX11-SDAG-NEXT:    scratch_store_b8 v2, v3, off offset:2 dlc
598; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
599; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v4, s0 offset:4 dlc
600; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
601; GFX11-SDAG-NEXT:    s_endpgm
602;
603; GFX11-GISEL-LABEL: soff4_voff1:
604; GFX11-GISEL:       ; %bb.0: ; %bb
605; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
606; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
607; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
608; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
609; GFX11-GISEL-NEXT:    s_lshl_b32 s0, s0, 2
610; GFX11-GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
611; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
612; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
613; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
614; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
615; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
616; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
617; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
618; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
619; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
620; GFX11-GISEL-NEXT:    s_endpgm
621bb:
622  %soff4 = mul i32 %soff, 4
623  %a = alloca i8, i32 64, align 4, addrspace(5)
624  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff4
625  %voff = call i32 @llvm.amdgcn.workitem.id.x()
626  %voff1 = mul i32 %voff, 1
627  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff1
628  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
629  store volatile i8 1, i8 addrspace(5)* %p1
630  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
631  store volatile i8 2, i8 addrspace(5)* %p2
632  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
633  store volatile i8 4, i8 addrspace(5)* %p4
634  ret void
635}
636
637define amdgpu_kernel void @soff4_voff2(i32 %soff) {
638; GFX940-SDAG-LABEL: soff4_voff2:
639; GFX940-SDAG:       ; %bb.0: ; %bb
640; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
641; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
642; GFX940-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
643; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
644; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
645; GFX940-SDAG-NEXT:    s_lshl_b32 s0, s0, 2
646; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
647; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
648; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
649; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
650; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
651; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
652; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
653; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
654; GFX940-SDAG-NEXT:    s_endpgm
655;
656; GFX940-GISEL-LABEL: soff4_voff2:
657; GFX940-GISEL:       ; %bb.0: ; %bb
658; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
659; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
660; GFX940-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
661; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
662; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
663; GFX940-GISEL-NEXT:    s_lshl_b32 s0, s0, 2
664; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
665; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
666; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 2
667; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
668; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
669; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:2 sc0 sc1
670; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
671; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
672; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
673; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
674; GFX940-GISEL-NEXT:    s_endpgm
675;
676; GFX11-SDAG-LABEL: soff4_voff2:
677; GFX11-SDAG:       ; %bb.0: ; %bb
678; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
679; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
680; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
681; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
682; GFX11-SDAG-NEXT:    v_mov_b32_e32 v4, 4
683; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
684; GFX11-SDAG-NEXT:    s_lshl_b32 s0, s0, 2
685; GFX11-SDAG-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
686; GFX11-SDAG-NEXT:    v_add3_u32 v3, 4, s0, v0
687; GFX11-SDAG-NEXT:    s_add_i32 s0, s0, 4
688; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, s0 offset:1 dlc
689; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
690; GFX11-SDAG-NEXT:    scratch_store_b8 v3, v2, off offset:2 dlc
691; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
692; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v4, s0 offset:4 dlc
693; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
694; GFX11-SDAG-NEXT:    s_endpgm
695;
696; GFX11-GISEL-LABEL: soff4_voff2:
697; GFX11-GISEL:       ; %bb.0: ; %bb
698; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
699; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
700; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
701; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
702; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
703; GFX11-GISEL-NEXT:    s_lshl_b32 s0, s0, 2
704; GFX11-GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
705; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
706; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
707; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
708; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
709; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
710; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
711; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
712; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
713; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
714; GFX11-GISEL-NEXT:    s_endpgm
715bb:
716  %soff4 = mul i32 %soff, 4
717  %a = alloca i8, i32 64, align 4, addrspace(5)
718  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff4
719  %voff = call i32 @llvm.amdgcn.workitem.id.x()
720  %voff2 = mul i32 %voff, 2
721  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff2
722  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
723  store volatile i8 1, i8 addrspace(5)* %p1
724  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
725  store volatile i8 2, i8 addrspace(5)* %p2
726  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
727  store volatile i8 4, i8 addrspace(5)* %p4
728  ret void
729}
730
731define amdgpu_kernel void @soff4_voff4(i32 %soff) {
732; GFX940-SDAG-LABEL: soff4_voff4:
733; GFX940-SDAG:       ; %bb.0: ; %bb
734; GFX940-SDAG-NEXT:    s_load_dword s0, s[0:1], 0x24
735; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 1
736; GFX940-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
737; GFX940-SDAG-NEXT:    v_mov_b32_e32 v2, 2
738; GFX940-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
739; GFX940-SDAG-NEXT:    s_lshl_b32 s0, s0, 2
740; GFX940-SDAG-NEXT:    s_add_i32 s0, s0, 4
741; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:1 sc0 sc1
742; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
743; GFX940-SDAG-NEXT:    scratch_store_byte v0, v2, s0 offset:2 sc0 sc1
744; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
745; GFX940-SDAG-NEXT:    v_mov_b32_e32 v1, 4
746; GFX940-SDAG-NEXT:    scratch_store_byte v0, v1, s0 offset:4 sc0 sc1
747; GFX940-SDAG-NEXT:    s_waitcnt vmcnt(0)
748; GFX940-SDAG-NEXT:    s_endpgm
749;
750; GFX940-GISEL-LABEL: soff4_voff4:
751; GFX940-GISEL:       ; %bb.0: ; %bb
752; GFX940-GISEL-NEXT:    s_load_dword s0, s[0:1], 0x24
753; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
754; GFX940-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
755; GFX940-GISEL-NEXT:    v_mov_b32_e32 v2, 1
756; GFX940-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
757; GFX940-GISEL-NEXT:    s_lshl_b32 s0, s0, 2
758; GFX940-GISEL-NEXT:    v_add_u32_e32 v1, s0, v1
759; GFX940-GISEL-NEXT:    v_add_u32_e32 v0, v1, v0
760; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 2
761; GFX940-GISEL-NEXT:    scratch_store_byte v0, v2, off offset:1 sc0 sc1
762; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
763; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:2 sc0 sc1
764; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
765; GFX940-GISEL-NEXT:    v_mov_b32_e32 v1, 4
766; GFX940-GISEL-NEXT:    scratch_store_byte v0, v1, off offset:4 sc0 sc1
767; GFX940-GISEL-NEXT:    s_waitcnt vmcnt(0)
768; GFX940-GISEL-NEXT:    s_endpgm
769;
770; GFX11-SDAG-LABEL: soff4_voff4:
771; GFX11-SDAG:       ; %bb.0: ; %bb
772; GFX11-SDAG-NEXT:    s_load_b32 s0, s[0:1], 0x24
773; GFX11-SDAG-NEXT:    v_mov_b32_e32 v1, 1
774; GFX11-SDAG-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
775; GFX11-SDAG-NEXT:    v_mov_b32_e32 v2, 2
776; GFX11-SDAG-NEXT:    v_mov_b32_e32 v3, 4
777; GFX11-SDAG-NEXT:    s_waitcnt lgkmcnt(0)
778; GFX11-SDAG-NEXT:    s_lshl_b32 s0, s0, 2
779; GFX11-SDAG-NEXT:    s_delay_alu instid0(SALU_CYCLE_1)
780; GFX11-SDAG-NEXT:    s_add_i32 s0, s0, 4
781; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v1, s0 offset:1 dlc
782; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
783; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v2, s0 offset:2 dlc
784; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
785; GFX11-SDAG-NEXT:    scratch_store_b8 v0, v3, s0 offset:4 dlc
786; GFX11-SDAG-NEXT:    s_waitcnt_vscnt null, 0x0
787; GFX11-SDAG-NEXT:    s_endpgm
788;
789; GFX11-GISEL-LABEL: soff4_voff4:
790; GFX11-GISEL:       ; %bb.0: ; %bb
791; GFX11-GISEL-NEXT:    s_load_b32 s0, s[0:1], 0x24
792; GFX11-GISEL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
793; GFX11-GISEL-NEXT:    v_mov_b32_e32 v2, 1
794; GFX11-GISEL-NEXT:    v_mov_b32_e32 v3, 4
795; GFX11-GISEL-NEXT:    s_waitcnt lgkmcnt(0)
796; GFX11-GISEL-NEXT:    s_lshl_b32 s0, s0, 2
797; GFX11-GISEL-NEXT:    s_delay_alu instid0(SALU_CYCLE_1) | instskip(NEXT) | instid1(VALU_DEP_1)
798; GFX11-GISEL-NEXT:    v_add_nc_u32_e64 v1, s0, 4
799; GFX11-GISEL-NEXT:    v_add_nc_u32_e32 v0, v1, v0
800; GFX11-GISEL-NEXT:    v_mov_b32_e32 v1, 2
801; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v2, off offset:1 dlc
802; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
803; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v1, off offset:2 dlc
804; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
805; GFX11-GISEL-NEXT:    scratch_store_b8 v0, v3, off offset:4 dlc
806; GFX11-GISEL-NEXT:    s_waitcnt_vscnt null, 0x0
807; GFX11-GISEL-NEXT:    s_endpgm
808bb:
809  %soff4 = mul i32 %soff, 4
810  %a = alloca i8, i32 64, align 4, addrspace(5)
811  %as = getelementptr i8, i8 addrspace(5)* %a, i32 %soff4
812  %voff = call i32 @llvm.amdgcn.workitem.id.x()
813  %voff4 = mul i32 %voff, 4
814  %asv = getelementptr i8, i8 addrspace(5)* %as, i32 %voff4
815  %p1 = getelementptr i8, i8 addrspace(5)* %asv, i32 1
816  store volatile i8 1, i8 addrspace(5)* %p1
817  %p2 = getelementptr i8, i8 addrspace(5)* %asv, i32 2
818  store volatile i8 2, i8 addrspace(5)* %p2
819  %p4 = getelementptr i8, i8 addrspace(5)* %asv, i32 4
820  store volatile i8 4, i8 addrspace(5)* %p4
821  ret void
822}
823