Bump version to 19.1.0-rc3
[llvm-project.git] / llvm / test / CodeGen / AMDGPU / idot2.ll
blob011a366267afe1f687ac669b3bcf8c07ddf6c357
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=amdgcn -mcpu=gfx700 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX7 %s
3 ; RUN: llc -mtriple=amdgcn -mcpu=gfx803 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX8 %s
4 ; RUN: llc -mtriple=amdgcn -mcpu=gfx900 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX9-NODL %s
5 ; RUN: llc -mtriple=amdgcn -mcpu=gfx906 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX9-DL %s
6 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1011 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-DL %s
7 ; RUN: llc -mtriple=amdgcn -mcpu=gfx1012 -verify-machineinstrs < %s | FileCheck --check-prefixes=GFX10-DL %s
9 ; add(mul(S0.x, S1.y),
10 ;     add (mul (S0.y, S1.y), S3)) -> v_dot2_{I|U}32_{I|U}16(S1, S2, S3)
12 define amdgpu_kernel void @udot2(ptr addrspace(1) %src1,
13 ; GFX7-LABEL: udot2:
14 ; GFX7:       ; %bb.0: ; %entry
15 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
16 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
17 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
18 ; GFX7-NEXT:    s_mov_b32 s10, 0
19 ; GFX7-NEXT:    s_mov_b32 s11, s3
20 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
21 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
22 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
23 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
24 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
25 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
26 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
27 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
28 ; GFX7-NEXT:    s_mov_b32 s2, -1
29 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
30 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
31 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
32 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
33 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
34 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
35 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
36 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v1, s4
37 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
38 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
39 ; GFX7-NEXT:    s_endpgm
41 ; GFX8-LABEL: udot2:
42 ; GFX8:       ; %bb.0: ; %entry
43 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
44 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
45 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
46 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
47 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
48 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
49 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
50 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
51 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
52 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
53 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
54 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
55 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
56 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
57 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
58 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
59 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
60 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
61 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
62 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
63 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, s2
64 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v1, v0
65 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
66 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
67 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
68 ; GFX8-NEXT:    s_endpgm
70 ; GFX9-NODL-LABEL: udot2:
71 ; GFX9-NODL:       ; %bb.0: ; %entry
72 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
73 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
74 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
75 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
76 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
77 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
78 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
79 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
80 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
81 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
82 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
83 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
84 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
85 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
86 ; GFX9-NODL-NEXT:    s_endpgm
88 ; GFX9-DL-LABEL: udot2:
89 ; GFX9-DL:       ; %bb.0: ; %entry
90 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
91 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
92 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
93 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
94 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
95 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
96 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
97 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
98 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
99 ; GFX9-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
100 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
101 ; GFX9-DL-NEXT:    s_endpgm
103 ; GFX10-DL-LABEL: udot2:
104 ; GFX10-DL:       ; %bb.0: ; %entry
105 ; GFX10-DL-NEXT:    s_clause 0x1
106 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
107 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
108 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
109 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
110 ; GFX10-DL-NEXT:    s_clause 0x1
111 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
112 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
113 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
114 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, 0
115 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
116 ; GFX10-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
117 ; GFX10-DL-NEXT:    global_store_dword v0, v1, s[0:1]
118 ; GFX10-DL-NEXT:    s_endpgm
119                                  ptr addrspace(1) %src2,
120                                  ptr addrspace(1) nocapture %dst) {
121 entry:
122   %idx = call i32 @llvm.amdgcn.workitem.id.x()
123   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
124   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
125   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
126   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
128   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
129   %conv = zext i16 %s1.elt1 to i32
130   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
131   %conv2 = zext i16 %s2.elt1 to i32
132   %mul1 = mul nuw i32 %conv2, %conv
134   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
135   %conv3 = zext i16 %s1.elt2 to i32
136   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
137   %conv4 = zext i16 %s2.elt2 to i32
138   %mul2 = mul nuw i32 %conv4, %conv3
140   %s3 = load i32, ptr addrspace(1) %dst, align 4
141   %add = add i32 %mul2, %s3
142   %add6 = add i32 %add, %mul1
143   store i32 %add6, ptr addrspace(1) %dst, align 4
144   ret void
147 ; TODO: Support this pattern
148 ;      add(S3,
149 ;          add (mul (S0.y, S1.y), mul (S0.y, S1.y))) -> v_dot2_{I|U}32_{I|U}16(S1, S2, S3)
150 define amdgpu_kernel void @udot2_MulMul(ptr addrspace(1) %src1,
151 ; GFX7-LABEL: udot2_MulMul:
152 ; GFX7:       ; %bb.0: ; %entry
153 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
154 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
155 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
156 ; GFX7-NEXT:    s_mov_b32 s10, 0
157 ; GFX7-NEXT:    s_mov_b32 s11, s3
158 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
159 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
160 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
161 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
162 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
163 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
164 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
165 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
166 ; GFX7-NEXT:    s_mov_b32 s2, -1
167 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
168 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
169 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
170 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
171 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
172 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
173 ; GFX7-NEXT:    v_mul_u32_u24_e32 v0, v0, v2
174 ; GFX7-NEXT:    v_mad_u32_u24 v0, v3, v1, v0
175 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
176 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, s4, v0
177 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
178 ; GFX7-NEXT:    s_endpgm
180 ; GFX8-LABEL: udot2_MulMul:
181 ; GFX8:       ; %bb.0: ; %entry
182 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
183 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
184 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
185 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
186 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
187 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
188 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
189 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
190 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
191 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
192 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
193 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
194 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
195 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
196 ; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 16, v3
197 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
198 ; GFX8-NEXT:    v_mul_u32_u24_sdwa v1, v0, v3 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
199 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
200 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
201 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
202 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s2, v0
203 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
204 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
205 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
206 ; GFX8-NEXT:    s_endpgm
208 ; GFX9-NODL-LABEL: udot2_MulMul:
209 ; GFX9-NODL:       ; %bb.0: ; %entry
210 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
211 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
212 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
213 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
214 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
215 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
216 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
217 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
218 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
219 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
220 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
221 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
222 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, v3, s2
223 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
224 ; GFX9-NODL-NEXT:    s_endpgm
226 ; GFX9-DL-LABEL: udot2_MulMul:
227 ; GFX9-DL:       ; %bb.0: ; %entry
228 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
229 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
230 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
231 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
232 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
233 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
234 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
235 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
236 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
237 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
238 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
239 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
240 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, v3, s2
241 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
242 ; GFX9-DL-NEXT:    s_endpgm
244 ; GFX10-DL-LABEL: udot2_MulMul:
245 ; GFX10-DL:       ; %bb.0: ; %entry
246 ; GFX10-DL-NEXT:    s_clause 0x1
247 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
248 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
249 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
250 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
251 ; GFX10-DL-NEXT:    s_clause 0x1
252 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
253 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
254 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
255 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
256 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
257 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
258 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
259 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
260 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, v0, s2
261 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
262 ; GFX10-DL-NEXT:    s_endpgm
263                                         ptr addrspace(1) %src2,
264                                         ptr addrspace(1) nocapture %dst) {
265 entry:
266   %idx = call i32 @llvm.amdgcn.workitem.id.x()
267   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
268   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
269   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
270   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
272   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
273   %conv = zext i16 %s1.elt1 to i32
274   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
275   %conv2 = zext i16 %s2.elt1 to i32
276   %mul1 = mul nuw i32 %conv2, %conv
278   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
279   %conv3 = zext i16 %s1.elt2 to i32
280   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
281   %conv4 = zext i16 %s2.elt2 to i32
282   %mul2 = mul nuw i32 %conv4, %conv3
283   %s3 = load i32, ptr addrspace(1) %dst, align 4
284   %add = add i32 %mul2, %mul1
285   %add6 = add i32 %add, %s3
286   store i32 %add6, ptr addrspace(1) %dst, align 4
287   ret void
290 define amdgpu_kernel void @idot2(ptr addrspace(1) %src1,
291 ; GFX7-LABEL: idot2:
292 ; GFX7:       ; %bb.0: ; %entry
293 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
294 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
295 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
296 ; GFX7-NEXT:    s_mov_b32 s10, 0
297 ; GFX7-NEXT:    s_mov_b32 s11, s3
298 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
299 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
300 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
301 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
302 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
303 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
304 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
305 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
306 ; GFX7-NEXT:    s_mov_b32 s2, -1
307 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
308 ; GFX7-NEXT:    v_bfe_i32 v1, v2, 0, 16
309 ; GFX7-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
310 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
311 ; GFX7-NEXT:    v_bfe_i32 v3, v0, 0, 16
312 ; GFX7-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
313 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
314 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, s4
315 ; GFX7-NEXT:    v_mad_i32_i24 v0, v3, v1, v0
316 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
317 ; GFX7-NEXT:    s_endpgm
319 ; GFX8-LABEL: idot2:
320 ; GFX8:       ; %bb.0: ; %entry
321 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
322 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
323 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
324 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
325 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
326 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
327 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
328 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
329 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
330 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
331 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
332 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
333 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
334 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
335 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 16
336 ; GFX8-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
337 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
338 ; GFX8-NEXT:    v_bfe_i32 v2, v0, 0, 16
339 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
340 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
341 ; GFX8-NEXT:    v_mad_i32_i24 v0, v0, v3, s2
342 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v1, v0
343 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
344 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
345 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
346 ; GFX8-NEXT:    s_endpgm
348 ; GFX9-NODL-LABEL: idot2:
349 ; GFX9-NODL:       ; %bb.0: ; %entry
350 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
351 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
352 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
353 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
354 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
355 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
356 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
357 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
358 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
359 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
360 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
361 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
362 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
363 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
364 ; GFX9-NODL-NEXT:    s_endpgm
366 ; GFX9-DL-LABEL: idot2:
367 ; GFX9-DL:       ; %bb.0: ; %entry
368 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
369 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
370 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
371 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
372 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
373 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
374 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
375 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
376 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
377 ; GFX9-DL-NEXT:    v_dot2_i32_i16 v1, v2, v1, s2
378 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
379 ; GFX9-DL-NEXT:    s_endpgm
381 ; GFX10-DL-LABEL: idot2:
382 ; GFX10-DL:       ; %bb.0: ; %entry
383 ; GFX10-DL-NEXT:    s_clause 0x1
384 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
385 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
386 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
387 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
388 ; GFX10-DL-NEXT:    s_clause 0x1
389 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
390 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
391 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
392 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, 0
393 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
394 ; GFX10-DL-NEXT:    v_dot2_i32_i16 v1, v2, v1, s2
395 ; GFX10-DL-NEXT:    global_store_dword v0, v1, s[0:1]
396 ; GFX10-DL-NEXT:    s_endpgm
397                                  ptr addrspace(1) %src2,
398                                  ptr addrspace(1) nocapture %dst) {
399 entry:
400   %idx = call i32 @llvm.amdgcn.workitem.id.x()
401   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
402   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
403   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
404   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
406   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
407   %conv = sext i16 %s1.elt1 to i32
408   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
409   %conv2 = sext i16 %s2.elt1 to i32
410   %mul1 = mul nuw i32 %conv2, %conv
412   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
413   %conv3 = sext i16 %s1.elt2 to i32
414   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
415   %conv4 = sext i16 %s2.elt2 to i32
416   %mul2 = mul nuw i32 %conv4, %conv3
418   %s3 = load i32, ptr addrspace(1) %dst, align 4
419   %add = add i32 %mul2, %s3
420   %add6 = add i32 %add, %mul1
421   store i32 %add6, ptr addrspace(1) %dst, align 4
422   ret void
425 define amdgpu_kernel void @idot2_MixedTypedMul(ptr addrspace(1) %src1,
426 ; GFX7-LABEL: idot2_MixedTypedMul:
427 ; GFX7:       ; %bb.0: ; %entry
428 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
429 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
430 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
431 ; GFX7-NEXT:    s_mov_b32 s10, 0
432 ; GFX7-NEXT:    s_mov_b32 s11, s3
433 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
434 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
435 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
436 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
437 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
438 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
439 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
440 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
441 ; GFX7-NEXT:    s_mov_b32 s2, -1
442 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
443 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
444 ; GFX7-NEXT:    v_bfe_i32 v2, v2, 0, 16
445 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
446 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
447 ; GFX7-NEXT:    v_bfe_i32 v0, v0, 0, 16
448 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
449 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v1, s4
450 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, v1
451 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
452 ; GFX7-NEXT:    s_endpgm
454 ; GFX8-LABEL: idot2_MixedTypedMul:
455 ; GFX8:       ; %bb.0: ; %entry
456 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
457 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
458 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
459 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
460 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
461 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
462 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
463 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
464 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
465 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
466 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
467 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
468 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
469 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
470 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 16
471 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
472 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
473 ; GFX8-NEXT:    v_bfe_i32 v2, v0, 0, 16
474 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
475 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
476 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, s2
477 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v1, v0
478 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
479 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
480 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
481 ; GFX8-NEXT:    s_endpgm
483 ; GFX9-NODL-LABEL: idot2_MixedTypedMul:
484 ; GFX9-NODL:       ; %bb.0: ; %entry
485 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
486 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
487 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
488 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
489 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
490 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
491 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
492 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
493 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
494 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
495 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
496 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
497 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
498 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
499 ; GFX9-NODL-NEXT:    s_endpgm
501 ; GFX9-DL-LABEL: idot2_MixedTypedMul:
502 ; GFX9-DL:       ; %bb.0: ; %entry
503 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
504 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
505 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
506 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
507 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
508 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
509 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
510 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
511 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
512 ; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
513 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
514 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
515 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, s2, v3
516 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
517 ; GFX9-DL-NEXT:    s_endpgm
519 ; GFX10-DL-LABEL: idot2_MixedTypedMul:
520 ; GFX10-DL:       ; %bb.0: ; %entry
521 ; GFX10-DL-NEXT:    s_clause 0x1
522 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
523 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
524 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
525 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
526 ; GFX10-DL-NEXT:    s_clause 0x1
527 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
528 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
529 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
530 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
531 ; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v0, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
532 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
533 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
534 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
535 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
536 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
537 ; GFX10-DL-NEXT:    s_endpgm
538                                                ptr addrspace(1) %src2,
539                                                ptr addrspace(1) nocapture %dst) {
540 entry:
541   %idx = call i32 @llvm.amdgcn.workitem.id.x()
542   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
543   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
544   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
545   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
547   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
548   %conv = sext i16 %s1.elt1 to i32
549   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
550   %conv2 = sext i16 %s2.elt1 to i32
551   %mul1 = mul nuw i32 %conv2, %conv
553   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
554   %conv3 = zext i16 %s1.elt2 to i32
555   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
556   %conv4 = zext i16 %s2.elt2 to i32
557   %mul2 = mul nuw i32 %conv4, %conv3
559   %s3 = load i32, ptr addrspace(1) %dst, align 4
560   %add = add i32 %mul2, %s3
561   %add6 = add i32 %add, %mul1
562   store i32 %add6, ptr addrspace(1) %dst, align 4
563   ret void
566 define amdgpu_kernel void @udot2_alt_AddOperands(ptr addrspace(1) %src1,
567 ; GFX7-LABEL: udot2_alt_AddOperands:
568 ; GFX7:       ; %bb.0: ; %entry
569 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
570 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
571 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
572 ; GFX7-NEXT:    s_mov_b32 s10, 0
573 ; GFX7-NEXT:    s_mov_b32 s11, s3
574 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
575 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
576 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
577 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
578 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
579 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
580 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
581 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
582 ; GFX7-NEXT:    s_mov_b32 s2, -1
583 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
584 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
585 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
586 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
587 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
588 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
589 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
590 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v1, s4
591 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
592 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
593 ; GFX7-NEXT:    s_endpgm
595 ; GFX8-LABEL: udot2_alt_AddOperands:
596 ; GFX8:       ; %bb.0: ; %entry
597 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
598 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
599 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
600 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
601 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
602 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
603 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
604 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
605 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
606 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
607 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
608 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
609 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
610 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
611 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
612 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
613 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
614 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
615 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
616 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
617 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, s2
618 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v1, v0
619 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
620 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
621 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
622 ; GFX8-NEXT:    s_endpgm
624 ; GFX9-NODL-LABEL: udot2_alt_AddOperands:
625 ; GFX9-NODL:       ; %bb.0: ; %entry
626 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
627 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
628 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
629 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
630 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
631 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
632 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
633 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
634 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(1)
635 ; GFX9-NODL-NEXT:    v_and_b32_e32 v3, 0xffff, v1
636 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
637 ; GFX9-NODL-NEXT:    v_and_b32_e32 v4, 0xffff, v2
638 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
639 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
640 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
641 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v1, v2, v1, s2
642 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v1, v4, v3, v1
643 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
644 ; GFX9-NODL-NEXT:    s_endpgm
646 ; GFX9-DL-LABEL: udot2_alt_AddOperands:
647 ; GFX9-DL:       ; %bb.0: ; %entry
648 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
649 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
650 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
651 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
652 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
653 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
654 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
655 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
656 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
657 ; GFX9-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
658 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
659 ; GFX9-DL-NEXT:    s_endpgm
661 ; GFX10-DL-LABEL: udot2_alt_AddOperands:
662 ; GFX10-DL:       ; %bb.0: ; %entry
663 ; GFX10-DL-NEXT:    s_clause 0x1
664 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
665 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
666 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
667 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
668 ; GFX10-DL-NEXT:    s_clause 0x1
669 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
670 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
671 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
672 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, 0
673 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
674 ; GFX10-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
675 ; GFX10-DL-NEXT:    global_store_dword v0, v1, s[0:1]
676 ; GFX10-DL-NEXT:    s_endpgm
677                                                  ptr addrspace(1) %src2,
678                                                  ptr addrspace(1) nocapture %dst) {
679 entry:
680   %idx = call i32 @llvm.amdgcn.workitem.id.x()
681   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
682   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
683   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
684   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
686   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
687   %conv = zext i16 %s1.elt1 to i32
688   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
689   %conv2 = zext i16 %s2.elt1 to i32
690   %mul1 = mul nuw i32 %conv2, %conv
692   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
693   %conv3 = zext i16 %s1.elt2 to i32
694   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
695   %conv4 = zext i16 %s2.elt2 to i32
696   %mul2 = mul nuw i32 %conv4, %conv3
698   %s3 = load i32, ptr addrspace(1) %dst, align 4
699   %add = add i32 %s3, %mul2
700   %add6 = add i32 %mul1, %add
701   store i32 %add6, ptr addrspace(1) %dst, align 4
702   ret void
705 define amdgpu_kernel void @idot2_MixedExt(ptr addrspace(1) %src1,
706 ; GFX7-LABEL: idot2_MixedExt:
707 ; GFX7:       ; %bb.0: ; %entry
708 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
709 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
710 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
711 ; GFX7-NEXT:    s_mov_b32 s10, 0
712 ; GFX7-NEXT:    s_mov_b32 s11, s3
713 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
714 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
715 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
716 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
717 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
718 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
719 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
720 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
721 ; GFX7-NEXT:    s_mov_b32 s2, -1
722 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
723 ; GFX7-NEXT:    v_bfe_i32 v1, v2, 0, 16
724 ; GFX7-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
725 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
726 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff, v0
727 ; GFX7-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
728 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
729 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, s4
730 ; GFX7-NEXT:    v_mad_i32_i24 v0, v3, v1, v0
731 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
732 ; GFX7-NEXT:    s_endpgm
734 ; GFX8-LABEL: idot2_MixedExt:
735 ; GFX8:       ; %bb.0: ; %entry
736 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
737 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
738 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
739 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
740 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
741 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
742 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
743 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
744 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
745 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
746 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
747 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
748 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
749 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
750 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 16
751 ; GFX8-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
752 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
753 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
754 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
755 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
756 ; GFX8-NEXT:    v_mad_i32_i24 v0, v0, v3, s2
757 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v1, v0
758 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
759 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
760 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
761 ; GFX8-NEXT:    s_endpgm
763 ; GFX9-NODL-LABEL: idot2_MixedExt:
764 ; GFX9-NODL:       ; %bb.0: ; %entry
765 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
766 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
767 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
768 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
769 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
770 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
771 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
772 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
773 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
774 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v3, v2, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
775 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
776 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
777 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
778 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
779 ; GFX9-NODL-NEXT:    s_endpgm
781 ; GFX9-DL-LABEL: idot2_MixedExt:
782 ; GFX9-DL:       ; %bb.0: ; %entry
783 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
784 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
785 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
786 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
787 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
788 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
789 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
790 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
791 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
792 ; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v3, v2, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
793 ; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
794 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
795 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, s2, v3
796 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
797 ; GFX9-DL-NEXT:    s_endpgm
799 ; GFX10-DL-LABEL: idot2_MixedExt:
800 ; GFX10-DL:       ; %bb.0: ; %entry
801 ; GFX10-DL-NEXT:    s_clause 0x1
802 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
803 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
804 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
805 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
806 ; GFX10-DL-NEXT:    s_clause 0x1
807 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
808 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
809 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
810 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
811 ; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v0, v2, sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
812 ; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
813 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
814 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
815 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
816 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
817 ; GFX10-DL-NEXT:    s_endpgm
818                                           ptr addrspace(1) %src2,
819                                           ptr addrspace(1) nocapture %dst) {
820 entry:
821   %idx = call i32 @llvm.amdgcn.workitem.id.x()
822   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
823   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
824   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
825   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
827   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
828   %conv = sext i16 %s1.elt1 to i32
829   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
830   %conv2 = zext i16 %s2.elt1 to i32
831   %mul1 = mul nuw i32 %conv2, %conv
833   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
834   %conv3 = sext i16 %s1.elt2 to i32
835   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
836   %conv4 = sext i16 %s2.elt2 to i32
837   %mul2 = mul nuw i32 %conv4, %conv3
839   %s3 = load i32, ptr addrspace(1) %dst, align 4
840   %add = add i32 %mul2, %s3
841   %add6 = add i32 %add, %mul1
842   store i32 %add6, ptr addrspace(1) %dst, align 4
843   ret void
846 define amdgpu_kernel void @notudot2_SameVec(ptr addrspace(1) %src1,
847 ; GFX7-LABEL: notudot2_SameVec:
848 ; GFX7:       ; %bb.0: ; %entry
849 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
850 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
851 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
852 ; GFX7-NEXT:    s_mov_b32 s10, 0
853 ; GFX7-NEXT:    s_mov_b32 s11, s3
854 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
855 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
856 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
857 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
858 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
859 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
860 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
861 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
862 ; GFX7-NEXT:    s_mov_b32 s2, -1
863 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
864 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff, v2
865 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
866 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
867 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
868 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v0, s4
869 ; GFX7-NEXT:    v_mad_u32_u24 v0, v1, v1, v0
870 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
871 ; GFX7-NEXT:    s_endpgm
873 ; GFX8-LABEL: notudot2_SameVec:
874 ; GFX8:       ; %bb.0: ; %entry
875 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
876 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
877 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
878 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
879 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
880 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
881 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
882 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
883 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
884 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
885 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
886 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
887 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
888 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
889 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
890 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
891 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
892 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
893 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v0, s2
894 ; GFX8-NEXT:    v_mad_u32_u24 v2, v1, v1, v0
895 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
896 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
897 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
898 ; GFX8-NEXT:    s_endpgm
900 ; GFX9-NODL-LABEL: notudot2_SameVec:
901 ; GFX9-NODL:       ; %bb.0: ; %entry
902 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
903 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
904 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
905 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
906 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
907 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
908 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
909 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
910 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(1)
911 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
912 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
913 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v2, v2, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
914 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
915 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v2, s2, v1
916 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
917 ; GFX9-NODL-NEXT:    s_endpgm
919 ; GFX9-DL-LABEL: notudot2_SameVec:
920 ; GFX9-DL:       ; %bb.0: ; %entry
921 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
922 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
923 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
924 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
925 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
926 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
927 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
928 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
929 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
930 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
931 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
932 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v2, v2, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
933 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
934 ; GFX9-DL-NEXT:    v_add3_u32 v1, v2, s2, v1
935 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
936 ; GFX9-DL-NEXT:    s_endpgm
938 ; GFX10-DL-LABEL: notudot2_SameVec:
939 ; GFX10-DL:       ; %bb.0: ; %entry
940 ; GFX10-DL-NEXT:    s_clause 0x1
941 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
942 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
943 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
944 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
945 ; GFX10-DL-NEXT:    s_clause 0x1
946 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
947 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
948 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
949 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
950 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v0, v1, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
951 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
952 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v2 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
953 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
954 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
955 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
956 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
957 ; GFX10-DL-NEXT:    s_endpgm
958                                             ptr addrspace(1) %src2,
959                                             ptr addrspace(1) nocapture %dst) {
960 entry:
961   %idx = call i32 @llvm.amdgcn.workitem.id.x()
962   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
963   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
964   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
965   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
967   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
968   %conv = zext i16 %s1.elt1 to i32
969   %s2.elt1 = extractelement <2 x i16> %vec1, i64 0
970   %conv2 = zext i16 %s2.elt1 to i32
971   %mul1 = mul i32 %conv2, %conv
973   %s1.elt2 = extractelement <2 x i16> %vec2, i64 1
974   %conv3 = zext i16 %s1.elt2 to i32
975   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
976   %conv4 = zext i16 %s2.elt2 to i32
977   %mul2 = mul i32 %conv4, %conv3
979   %s3 = load i32, ptr addrspace(1) %dst, align 4
980   %add = add i32 %mul2, %s3
981   %add6 = add i32 %add, %mul1
982   store i32 %add6, ptr addrspace(1) %dst, align 4
983   ret void
986 define amdgpu_kernel void @udot2_v4i16(ptr addrspace(1) %src1,
987 ; GFX7-LABEL: udot2_v4i16:
988 ; GFX7:       ; %bb.0: ; %entry
989 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
990 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
991 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
992 ; GFX7-NEXT:    s_mov_b32 s10, 0
993 ; GFX7-NEXT:    s_mov_b32 s11, s3
994 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
995 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
996 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
997 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
998 ; GFX7-NEXT:    s_mov_b64 s[4:5], s[6:7]
999 ; GFX7-NEXT:    s_mov_b64 s[6:7], s[10:11]
1000 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
1001 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[4:7], 0 addr64
1002 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1003 ; GFX7-NEXT:    s_mov_b32 s2, -1
1004 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1005 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff, v2
1006 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1007 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff, v0
1008 ; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1009 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1010 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1011 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, s4
1012 ; GFX7-NEXT:    v_mad_u32_u24 v0, v3, v1, v0
1013 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1014 ; GFX7-NEXT:    s_endpgm
1016 ; GFX8-LABEL: udot2_v4i16:
1017 ; GFX8:       ; %bb.0: ; %entry
1018 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1019 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1020 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1021 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1022 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1023 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
1024 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1025 ; GFX8-NEXT:    v_mov_b32_e32 v3, s7
1026 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s6, v2
1027 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1028 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
1029 ; GFX8-NEXT:    flat_load_dword v1, v[2:3]
1030 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1031 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1032 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
1033 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1034 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff, v1
1035 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1036 ; GFX8-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
1037 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1038 ; GFX8-NEXT:    v_mad_u32_u24 v0, v1, v0, s2
1039 ; GFX8-NEXT:    v_mad_u32_u24 v2, v3, v2, v0
1040 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1041 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1042 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1043 ; GFX8-NEXT:    s_endpgm
1045 ; GFX9-NODL-LABEL: udot2_v4i16:
1046 ; GFX9-NODL:       ; %bb.0: ; %entry
1047 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1048 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1049 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1050 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1051 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
1052 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
1053 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1054 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
1055 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1056 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1057 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1058 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1059 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
1060 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
1061 ; GFX9-NODL-NEXT:    s_endpgm
1063 ; GFX9-DL-LABEL: udot2_v4i16:
1064 ; GFX9-DL:       ; %bb.0: ; %entry
1065 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1066 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1067 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1068 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1069 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1070 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1071 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1072 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
1073 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1074 ; GFX9-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
1075 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1076 ; GFX9-DL-NEXT:    s_endpgm
1078 ; GFX10-DL-LABEL: udot2_v4i16:
1079 ; GFX10-DL:       ; %bb.0: ; %entry
1080 ; GFX10-DL-NEXT:    s_clause 0x1
1081 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1082 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1083 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1084 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1085 ; GFX10-DL-NEXT:    s_clause 0x1
1086 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1087 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1088 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1089 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, 0
1090 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1091 ; GFX10-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
1092 ; GFX10-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1093 ; GFX10-DL-NEXT:    s_endpgm
1094                                        ptr addrspace(1) %src2,
1095                                        ptr addrspace(1) nocapture %dst) {
1096 entry:
1097   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1098   %gep1 = getelementptr <4 x i16>, ptr addrspace(1) %src1, i32 %idx
1099   %vec1 = load <4 x i16>, ptr addrspace(1) %gep1
1100   %gep2 = getelementptr <4 x i16>, ptr addrspace(1) %src2, i32 %idx
1101   %vec2 = load <4 x i16>, ptr addrspace(1) %gep2
1103   %s1.elt1 = extractelement <4 x i16> %vec1, i64 0
1104   %conv = zext i16 %s1.elt1 to i32
1105   %s2.elt1 = extractelement <4 x i16> %vec2, i64 0
1106   %conv2 = zext i16 %s2.elt1 to i32
1107   %mul1 = mul i32 %conv2, %conv
1109   %s1.elt2 = extractelement <4 x i16> %vec1, i64 1
1110   %conv3 = zext i16 %s1.elt2 to i32
1111   %s2.elt2 = extractelement <4 x i16> %vec2, i64 1
1112   %conv4 = zext i16 %s2.elt2 to i32
1113   %mul2 = mul i32 %conv4, %conv3
1115   %s3 = load i32, ptr addrspace(1) %dst, align 4
1116   %add = add i32 %mul2, %s3
1117   %add6 = add i32 %add, %mul1
1118   store i32 %add6, ptr addrspace(1) %dst, align 4
1119   ret void
1122 define amdgpu_kernel void @udot2_v4i16_Hi(ptr addrspace(1) %src1,
1123 ; GFX7-LABEL: udot2_v4i16_Hi:
1124 ; GFX7:       ; %bb.0: ; %entry
1125 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1126 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1127 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1128 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1129 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1130 ; GFX7-NEXT:    s_mov_b32 s10, 0
1131 ; GFX7-NEXT:    s_mov_b32 s11, s3
1132 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1133 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
1134 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64 offset:4
1135 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
1136 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64 offset:4
1137 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1138 ; GFX7-NEXT:    s_mov_b32 s2, -1
1139 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1140 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff, v2
1141 ; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1142 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1143 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff, v0
1144 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1145 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1146 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, s4
1147 ; GFX7-NEXT:    v_mad_u32_u24 v0, v3, v1, v0
1148 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1149 ; GFX7-NEXT:    s_endpgm
1151 ; GFX8-LABEL: udot2_v4i16_Hi:
1152 ; GFX8:       ; %bb.0: ; %entry
1153 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1154 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1155 ; GFX8-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1156 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1157 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1158 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s4, v0
1159 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1160 ; GFX8-NEXT:    v_mov_b32_e32 v3, s7
1161 ; GFX8-NEXT:    v_add_u32_e32 v4, vcc, s6, v0
1162 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1163 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 4, v2
1164 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1165 ; GFX8-NEXT:    flat_load_dword v2, v[0:1]
1166 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, 4, v4
1167 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v3, vcc
1168 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
1169 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1170 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1171 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v2
1172 ; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1173 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1174 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff, v0
1175 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1176 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1177 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v2, s2
1178 ; GFX8-NEXT:    v_mad_u32_u24 v2, v3, v1, v0
1179 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1180 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1181 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1182 ; GFX8-NEXT:    s_endpgm
1184 ; GFX9-NODL-LABEL: udot2_v4i16_Hi:
1185 ; GFX9-NODL:       ; %bb.0: ; %entry
1186 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1187 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1188 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1189 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1190 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5] offset:4
1191 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7] offset:4
1192 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1193 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
1194 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1195 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1196 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1197 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1198 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
1199 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
1200 ; GFX9-NODL-NEXT:    s_endpgm
1202 ; GFX9-DL-LABEL: udot2_v4i16_Hi:
1203 ; GFX9-DL:       ; %bb.0: ; %entry
1204 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1205 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1206 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1207 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1208 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5] offset:4
1209 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7] offset:4
1210 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1211 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
1212 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1213 ; GFX9-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
1214 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1215 ; GFX9-DL-NEXT:    s_endpgm
1217 ; GFX10-DL-LABEL: udot2_v4i16_Hi:
1218 ; GFX10-DL:       ; %bb.0: ; %entry
1219 ; GFX10-DL-NEXT:    s_clause 0x1
1220 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1221 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1222 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1223 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1224 ; GFX10-DL-NEXT:    s_clause 0x1
1225 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5] offset:4
1226 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7] offset:4
1227 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1228 ; GFX10-DL-NEXT:    v_mov_b32_e32 v0, 0
1229 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0) lgkmcnt(0)
1230 ; GFX10-DL-NEXT:    v_dot2_u32_u16 v1, v2, v1, s2
1231 ; GFX10-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1232 ; GFX10-DL-NEXT:    s_endpgm
1233                                           ptr addrspace(1) %src2,
1234                                           ptr addrspace(1) nocapture %dst) {
1235 entry:
1236   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1237   %gep1 = getelementptr <4 x i16>, ptr addrspace(1) %src1, i32 %idx
1238   %vec1 = load <4 x i16>, ptr addrspace(1) %gep1
1239   %gep2 = getelementptr <4 x i16>, ptr addrspace(1) %src2, i32 %idx
1240   %vec2 = load <4 x i16>, ptr addrspace(1) %gep2
1242   %s1.elt1 = extractelement <4 x i16> %vec1, i64 2
1243   %conv = zext i16 %s1.elt1 to i32
1244   %s2.elt1 = extractelement <4 x i16> %vec2, i64 2
1245   %conv2 = zext i16 %s2.elt1 to i32
1246   %mul1 = mul i32 %conv2, %conv
1248   %s1.elt2 = extractelement <4 x i16> %vec1, i64 3
1249   %conv3 = zext i16 %s1.elt2 to i32
1250   %s2.elt2 = extractelement <4 x i16> %vec2, i64 3
1251   %conv4 = zext i16 %s2.elt2 to i32
1252   %mul2 = mul i32 %conv4, %conv3
1254   %s3 = load i32, ptr addrspace(1) %dst, align 4
1255   %add = add i32 %mul2, %s3
1256   %add6 = add i32 %add, %mul1
1257   store i32 %add6, ptr addrspace(1) %dst, align 4
1258   ret void
1261 define amdgpu_kernel void @notudot2_v4i16_Even(ptr addrspace(1) %src1,
1262 ; GFX7-LABEL: notudot2_v4i16_Even:
1263 ; GFX7:       ; %bb.0: ; %entry
1264 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1265 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1266 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1267 ; GFX7-NEXT:    s_mov_b32 s10, 0
1268 ; GFX7-NEXT:    s_mov_b32 s11, s3
1269 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1270 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
1271 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1272 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1273 ; GFX7-NEXT:    s_mov_b64 s[4:5], s[6:7]
1274 ; GFX7-NEXT:    s_mov_b64 s[6:7], s[10:11]
1275 ; GFX7-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[8:11], 0 addr64
1276 ; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1277 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1278 ; GFX7-NEXT:    s_mov_b32 s2, -1
1279 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1280 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1281 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1282 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1283 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1284 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1285 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1286 ; GFX7-NEXT:    v_mad_u32_u24 v1, v1, v3, s4
1287 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
1288 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1289 ; GFX7-NEXT:    s_endpgm
1291 ; GFX8-LABEL: notudot2_v4i16_Even:
1292 ; GFX8:       ; %bb.0: ; %entry
1293 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1294 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1295 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1296 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1297 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1298 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
1299 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1300 ; GFX8-NEXT:    v_mov_b32_e32 v3, s7
1301 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s6, v2
1302 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1303 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1304 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[2:3]
1305 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1306 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1307 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1308 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1309 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1310 ; GFX8-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1311 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1312 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1313 ; GFX8-NEXT:    v_mad_u32_u24 v1, v3, v1, s2
1314 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v0, v1
1315 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1316 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1317 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1318 ; GFX8-NEXT:    s_endpgm
1320 ; GFX9-NODL-LABEL: notudot2_v4i16_Even:
1321 ; GFX9-NODL:       ; %bb.0: ; %entry
1322 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1323 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1324 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1325 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1326 ; GFX9-NODL-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
1327 ; GFX9-NODL-NEXT:    global_load_dwordx2 v[2:3], v4, s[6:7]
1328 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1329 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, 0
1330 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1331 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1332 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1333 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1334 ; GFX9-NODL-NEXT:    v_add3_u32 v0, v1, s2, v0
1335 ; GFX9-NODL-NEXT:    global_store_dword v4, v0, s[0:1]
1336 ; GFX9-NODL-NEXT:    s_endpgm
1338 ; GFX9-DL-LABEL: notudot2_v4i16_Even:
1339 ; GFX9-DL:       ; %bb.0: ; %entry
1340 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1341 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1342 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1343 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1344 ; GFX9-DL-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
1345 ; GFX9-DL-NEXT:    global_load_dwordx2 v[2:3], v4, s[6:7]
1346 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1347 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, 0
1348 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1349 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1350 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1351 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1352 ; GFX9-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
1353 ; GFX9-DL-NEXT:    global_store_dword v4, v0, s[0:1]
1354 ; GFX9-DL-NEXT:    s_endpgm
1356 ; GFX10-DL-LABEL: notudot2_v4i16_Even:
1357 ; GFX10-DL:       ; %bb.0: ; %entry
1358 ; GFX10-DL-NEXT:    s_clause 0x1
1359 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1360 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1361 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1362 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1363 ; GFX10-DL-NEXT:    s_clause 0x1
1364 ; GFX10-DL-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
1365 ; GFX10-DL-NEXT:    global_load_dwordx2 v[2:3], v4, s[6:7]
1366 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1367 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1368 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1369 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1370 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
1371 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1372 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
1373 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
1374 ; GFX10-DL-NEXT:    s_endpgm
1375                                                ptr addrspace(1) %src2,
1376                                                ptr addrspace(1) nocapture %dst) {
1377 entry:
1378   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1379   %gep1 = getelementptr <4 x i16>, ptr addrspace(1) %src1, i32 %idx
1380   %vec1 = load <4 x i16>, ptr addrspace(1) %gep1
1381   %gep2 = getelementptr <4 x i16>, ptr addrspace(1) %src2, i32 %idx
1382   %vec2 = load <4 x i16>, ptr addrspace(1) %gep2
1384   %s1.elt1 = extractelement <4 x i16> %vec1, i64 0
1385   %conv = zext i16 %s1.elt1 to i32
1386   %s2.elt1 = extractelement <4 x i16> %vec2, i64 0
1387   %conv2 = zext i16 %s2.elt1 to i32
1388   %mul1 = mul i32 %conv2, %conv
1390   %s1.elt2 = extractelement <4 x i16> %vec1, i64 2
1391   %conv3 = zext i16 %s1.elt2 to i32
1392   %s2.elt2 = extractelement <4 x i16> %vec2, i64 2
1393   %conv4 = zext i16 %s2.elt2 to i32
1394   %mul2 = mul i32 %conv4, %conv3
1396   %s3 = load i32, ptr addrspace(1) %dst, align 4
1397   %add = add i32 %mul2, %s3
1398   %add6 = add i32 %add, %mul1
1399   store i32 %add6, ptr addrspace(1) %dst, align 4
1400   ret void
1403 define amdgpu_kernel void @notudot2_v4i16_Middle(ptr addrspace(1) %src1,
1404 ; GFX7-LABEL: notudot2_v4i16_Middle:
1405 ; GFX7:       ; %bb.0: ; %entry
1406 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1407 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1408 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1409 ; GFX7-NEXT:    s_mov_b32 s10, 0
1410 ; GFX7-NEXT:    s_mov_b32 s11, s3
1411 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1412 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
1413 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 3, v0
1414 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1415 ; GFX7-NEXT:    s_mov_b64 s[4:5], s[6:7]
1416 ; GFX7-NEXT:    s_mov_b64 s[6:7], s[10:11]
1417 ; GFX7-NEXT:    buffer_load_dwordx2 v[2:3], v[0:1], s[8:11], 0 addr64
1418 ; GFX7-NEXT:    buffer_load_dwordx2 v[0:1], v[0:1], s[4:7], 0 addr64
1419 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1420 ; GFX7-NEXT:    s_mov_b32 s2, -1
1421 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1422 ; GFX7-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1423 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1424 ; GFX7-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1425 ; GFX7-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1426 ; GFX7-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1427 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1428 ; GFX7-NEXT:    v_mad_u32_u24 v1, v1, v3, s4
1429 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
1430 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1431 ; GFX7-NEXT:    s_endpgm
1433 ; GFX8-LABEL: notudot2_v4i16_Middle:
1434 ; GFX8:       ; %bb.0: ; %entry
1435 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1436 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1437 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 3, v0
1438 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1439 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1440 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
1441 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1442 ; GFX8-NEXT:    v_mov_b32_e32 v3, s7
1443 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, s6, v2
1444 ; GFX8-NEXT:    v_addc_u32_e32 v3, vcc, 0, v3, vcc
1445 ; GFX8-NEXT:    flat_load_dwordx2 v[0:1], v[0:1]
1446 ; GFX8-NEXT:    flat_load_dwordx2 v[2:3], v[2:3]
1447 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1448 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1449 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v1
1450 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1451 ; GFX8-NEXT:    v_and_b32_e32 v3, 0xffff, v3
1452 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1453 ; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1454 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1455 ; GFX8-NEXT:    v_mad_u32_u24 v1, v3, v1, s2
1456 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v0, v1
1457 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1458 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1459 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1460 ; GFX8-NEXT:    s_endpgm
1462 ; GFX9-NODL-LABEL: notudot2_v4i16_Middle:
1463 ; GFX9-NODL:       ; %bb.0: ; %entry
1464 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1465 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1466 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1467 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1468 ; GFX9-NODL-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
1469 ; GFX9-NODL-NEXT:    global_load_dwordx2 v[2:3], v4, s[6:7]
1470 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1471 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v4, 0
1472 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1473 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1474 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1475 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1476 ; GFX9-NODL-NEXT:    v_add3_u32 v0, v1, s2, v0
1477 ; GFX9-NODL-NEXT:    global_store_dword v4, v0, s[0:1]
1478 ; GFX9-NODL-NEXT:    s_endpgm
1480 ; GFX9-DL-LABEL: notudot2_v4i16_Middle:
1481 ; GFX9-DL:       ; %bb.0: ; %entry
1482 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1483 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1484 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1485 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1486 ; GFX9-DL-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
1487 ; GFX9-DL-NEXT:    global_load_dwordx2 v[2:3], v4, s[6:7]
1488 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1489 ; GFX9-DL-NEXT:    v_mov_b32_e32 v4, 0
1490 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1491 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1492 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1493 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1494 ; GFX9-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
1495 ; GFX9-DL-NEXT:    global_store_dword v4, v0, s[0:1]
1496 ; GFX9-DL-NEXT:    s_endpgm
1498 ; GFX10-DL-LABEL: notudot2_v4i16_Middle:
1499 ; GFX10-DL:       ; %bb.0: ; %entry
1500 ; GFX10-DL-NEXT:    s_clause 0x1
1501 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1502 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1503 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v4, 3, v0
1504 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1505 ; GFX10-DL-NEXT:    s_clause 0x1
1506 ; GFX10-DL-NEXT:    global_load_dwordx2 v[0:1], v4, s[4:5]
1507 ; GFX10-DL-NEXT:    global_load_dwordx2 v[2:3], v4, s[6:7]
1508 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1509 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1510 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v0 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
1511 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v3, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1512 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
1513 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1514 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
1515 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
1516 ; GFX10-DL-NEXT:    s_endpgm
1517                                                  ptr addrspace(1) %src2,
1518                                                  ptr addrspace(1) nocapture %dst) {
1519 entry:
1520   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1521   %gep1 = getelementptr <4 x i16>, ptr addrspace(1) %src1, i32 %idx
1522   %vec1 = load <4 x i16>, ptr addrspace(1) %gep1
1523   %gep2 = getelementptr <4 x i16>, ptr addrspace(1) %src2, i32 %idx
1524   %vec2 = load <4 x i16>, ptr addrspace(1) %gep2
1526   %s1.elt1 = extractelement <4 x i16> %vec1, i64 1
1527   %conv = zext i16 %s1.elt1 to i32
1528   %s2.elt1 = extractelement <4 x i16> %vec2, i64 1
1529   %conv2 = zext i16 %s2.elt1 to i32
1530   %mul1 = mul i32 %conv2, %conv
1532   %s1.elt2 = extractelement <4 x i16> %vec1, i64 2
1533   %conv3 = zext i16 %s1.elt2 to i32
1534   %s2.elt2 = extractelement <4 x i16> %vec2, i64 2
1535   %conv4 = zext i16 %s2.elt2 to i32
1536   %mul2 = mul i32 %conv4, %conv3
1538   %s3 = load i32, ptr addrspace(1) %dst, align 4
1539   %add = add i32 %mul2, %s3
1540   %add6 = add i32 %add, %mul1
1541   store i32 %add6, ptr addrspace(1) %dst, align 4
1542   ret void
1545 define amdgpu_kernel void @notudot2_DiffIndex(ptr addrspace(1) %src1,
1546 ; GFX7-LABEL: notudot2_DiffIndex:
1547 ; GFX7:       ; %bb.0: ; %entry
1548 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1549 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1550 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1551 ; GFX7-NEXT:    s_mov_b32 s10, 0
1552 ; GFX7-NEXT:    s_mov_b32 s11, s3
1553 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1554 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
1555 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1556 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1557 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
1558 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
1559 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
1560 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1561 ; GFX7-NEXT:    s_mov_b32 s2, -1
1562 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1563 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
1564 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1565 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1566 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
1567 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1568 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1569 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v1, s4
1570 ; GFX7-NEXT:    v_mad_u32_u24 v0, v3, v2, v0
1571 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1572 ; GFX7-NEXT:    s_endpgm
1574 ; GFX8-LABEL: notudot2_DiffIndex:
1575 ; GFX8:       ; %bb.0: ; %entry
1576 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1577 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1578 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1579 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1580 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1581 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
1582 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1583 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1584 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
1585 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
1586 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1587 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
1588 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1589 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1590 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
1591 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
1592 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1593 ; GFX8-NEXT:    v_lshrrev_b32_e32 v2, 16, v0
1594 ; GFX8-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1595 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1596 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, s2
1597 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v1, v0
1598 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1599 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1600 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1601 ; GFX8-NEXT:    s_endpgm
1603 ; GFX9-NODL-LABEL: notudot2_DiffIndex:
1604 ; GFX9-NODL:       ; %bb.0: ; %entry
1605 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1606 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1607 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1608 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1609 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
1610 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
1611 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1612 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
1613 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1614 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_0
1615 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_1
1616 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1617 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
1618 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
1619 ; GFX9-NODL-NEXT:    s_endpgm
1621 ; GFX9-DL-LABEL: notudot2_DiffIndex:
1622 ; GFX9-DL:       ; %bb.0: ; %entry
1623 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1624 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1625 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1626 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1627 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1628 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1629 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1630 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
1631 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1632 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_0
1633 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_1
1634 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1635 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, s2, v3
1636 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1637 ; GFX9-DL-NEXT:    s_endpgm
1639 ; GFX10-DL-LABEL: notudot2_DiffIndex:
1640 ; GFX10-DL:       ; %bb.0: ; %entry
1641 ; GFX10-DL-NEXT:    s_clause 0x1
1642 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1643 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1644 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1645 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1646 ; GFX10-DL-NEXT:    s_clause 0x1
1647 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1648 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1649 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1650 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1651 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v0, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_0
1652 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_1
1653 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
1654 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1655 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, s2, v0
1656 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
1657 ; GFX10-DL-NEXT:    s_endpgm
1658                                               ptr addrspace(1) %src2,
1659                                               ptr addrspace(1) nocapture %dst) {
1660 entry:
1661   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1662   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
1663   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
1664   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
1665   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
1667   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
1668   %conv = zext i16 %s1.elt1 to i32
1669   %s2.elt1 = extractelement <2 x i16> %vec2, i64 1
1670   %conv2 = zext i16 %s2.elt1 to i32
1671   %mul1 = mul i32 %conv2, %conv
1673   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
1674   %conv3 = zext i16 %s1.elt2 to i32
1675   %s2.elt2 = extractelement <2 x i16> %vec2, i64 0
1676   %conv4 = zext i16 %s2.elt2 to i32
1677   %mul2 = mul i32 %conv4, %conv3
1679   %s3 = load i32, ptr addrspace(1) %dst, align 4
1680   %add = add i32 %mul2, %s3
1681   %add6 = add i32 %add, %mul1
1682   store i32 %add6, ptr addrspace(1) %dst, align 4
1683   ret void
1686 define amdgpu_kernel void @udot2_MultipleUses_add1(ptr addrspace(1) %src1,
1687 ; GFX7-LABEL: udot2_MultipleUses_add1:
1688 ; GFX7:       ; %bb.0: ; %entry
1689 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1690 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1691 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1692 ; GFX7-NEXT:    s_mov_b32 s10, 0
1693 ; GFX7-NEXT:    s_mov_b32 s11, s3
1694 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1695 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
1696 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1697 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1698 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
1699 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
1700 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
1701 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1702 ; GFX7-NEXT:    s_mov_b32 s2, -1
1703 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1704 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
1705 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
1706 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1707 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
1708 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
1709 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1710 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v1, s4
1711 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
1712 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v0, v1
1713 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1714 ; GFX7-NEXT:    s_endpgm
1716 ; GFX8-LABEL: udot2_MultipleUses_add1:
1717 ; GFX8:       ; %bb.0: ; %entry
1718 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1719 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1720 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1721 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1722 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1723 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
1724 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1725 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1726 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
1727 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
1728 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1729 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
1730 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1731 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1732 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
1733 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
1734 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1735 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
1736 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
1737 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1738 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, s2
1739 ; GFX8-NEXT:    v_mad_u32_u24 v1, v2, v1, v0
1740 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v1, v0
1741 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1742 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1743 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1744 ; GFX8-NEXT:    s_endpgm
1746 ; GFX9-NODL-LABEL: udot2_MultipleUses_add1:
1747 ; GFX9-NODL:       ; %bb.0: ; %entry
1748 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1749 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1750 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1751 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1752 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
1753 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
1754 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1755 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
1756 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1757 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1758 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
1759 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1760 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1761 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v1, v2, v1, s2
1762 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, v3, v1
1763 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
1764 ; GFX9-NODL-NEXT:    s_endpgm
1766 ; GFX9-DL-LABEL: udot2_MultipleUses_add1:
1767 ; GFX9-DL:       ; %bb.0: ; %entry
1768 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1769 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1770 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1771 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1772 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1773 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1774 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1775 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
1776 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1777 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1778 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
1779 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
1780 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1781 ; GFX9-DL-NEXT:    v_mad_u32_u24 v1, v2, v1, s2
1782 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, v3, v1
1783 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1784 ; GFX9-DL-NEXT:    s_endpgm
1786 ; GFX10-DL-LABEL: udot2_MultipleUses_add1:
1787 ; GFX10-DL:       ; %bb.0: ; %entry
1788 ; GFX10-DL-NEXT:    s_clause 0x1
1789 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1790 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1791 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1792 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1793 ; GFX10-DL-NEXT:    s_clause 0x1
1794 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1795 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1796 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1797 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
1798 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
1799 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1800 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
1801 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1802 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
1803 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1804 ; GFX10-DL-NEXT:    v_mad_u32_u24 v0, v3, v0, s2
1805 ; GFX10-DL-NEXT:    v_add3_u32 v0, v0, v1, v0
1806 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
1807 ; GFX10-DL-NEXT:    s_endpgm
1808                                                    ptr addrspace(1) %src2,
1809                                                    ptr addrspace(1) nocapture %dst) {
1810 entry:
1811   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1812   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
1813   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
1814   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
1815   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
1817   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
1818   %conv = zext i16 %s1.elt1 to i32
1819   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
1820   %conv2 = zext i16 %s2.elt1 to i32
1821   %mul1 = mul i32 %conv2, %conv
1823   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
1824   %conv3 = zext i16 %s1.elt2 to i32
1825   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
1826   %conv4 = zext i16 %s2.elt2 to i32
1827   %mul2 = mul i32 %conv4, %conv3
1829   %s3 = load i32, ptr addrspace(1) %dst, align 4
1830   %add1 = add i32 %mul2, %s3
1831   %add2 = add i32 %add1, %mul1
1833   %res = add i32 %add2, %add1
1834   store i32 %res, ptr addrspace(1) %dst, align 4
1835   ret void
1838 define amdgpu_kernel void @idot2_MultipleUses_add1(ptr addrspace(1) %src1,
1839 ; GFX7-LABEL: idot2_MultipleUses_add1:
1840 ; GFX7:       ; %bb.0: ; %entry
1841 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1842 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1843 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1844 ; GFX7-NEXT:    s_mov_b32 s10, 0
1845 ; GFX7-NEXT:    s_mov_b32 s11, s3
1846 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1847 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
1848 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1849 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
1850 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
1851 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
1852 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
1853 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
1854 ; GFX7-NEXT:    s_mov_b32 s2, -1
1855 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
1856 ; GFX7-NEXT:    v_bfe_i32 v1, v2, 0, 16
1857 ; GFX7-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
1858 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
1859 ; GFX7-NEXT:    v_bfe_i32 v3, v0, 0, 16
1860 ; GFX7-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
1861 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1862 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, s4
1863 ; GFX7-NEXT:    v_mad_i32_i24 v1, v3, v1, v0
1864 ; GFX7-NEXT:    v_add_i32_e32 v0, vcc, v1, v0
1865 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
1866 ; GFX7-NEXT:    s_endpgm
1868 ; GFX8-LABEL: idot2_MultipleUses_add1:
1869 ; GFX8:       ; %bb.0: ; %entry
1870 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1871 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1872 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
1873 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1874 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
1875 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
1876 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1877 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
1878 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
1879 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
1880 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
1881 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
1882 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
1883 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
1884 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 16
1885 ; GFX8-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
1886 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
1887 ; GFX8-NEXT:    v_bfe_i32 v2, v0, 0, 16
1888 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
1889 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
1890 ; GFX8-NEXT:    v_mad_i32_i24 v0, v0, v3, s2
1891 ; GFX8-NEXT:    v_mad_i32_i24 v1, v2, v1, v0
1892 ; GFX8-NEXT:    v_add_u32_e32 v2, vcc, v1, v0
1893 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
1894 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
1895 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
1896 ; GFX8-NEXT:    s_endpgm
1898 ; GFX9-NODL-LABEL: idot2_MultipleUses_add1:
1899 ; GFX9-NODL:       ; %bb.0: ; %entry
1900 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1901 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1902 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1903 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1904 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
1905 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
1906 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
1907 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
1908 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
1909 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1910 ; GFX9-NODL-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
1911 ; GFX9-NODL-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
1912 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
1913 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v1, v2, v1, s2
1914 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, v3, v1
1915 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
1916 ; GFX9-NODL-NEXT:    s_endpgm
1918 ; GFX9-DL-LABEL: idot2_MultipleUses_add1:
1919 ; GFX9-DL:       ; %bb.0: ; %entry
1920 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1921 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1922 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1923 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1924 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1925 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1926 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1927 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
1928 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
1929 ; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1930 ; GFX9-DL-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
1931 ; GFX9-DL-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
1932 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
1933 ; GFX9-DL-NEXT:    v_mad_i32_i24 v1, v2, v1, s2
1934 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, v3, v1
1935 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
1936 ; GFX9-DL-NEXT:    s_endpgm
1938 ; GFX10-DL-LABEL: idot2_MultipleUses_add1:
1939 ; GFX10-DL:       ; %bb.0: ; %entry
1940 ; GFX10-DL-NEXT:    s_clause 0x1
1941 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
1942 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
1943 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
1944 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1945 ; GFX10-DL-NEXT:    s_clause 0x1
1946 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
1947 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
1948 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
1949 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
1950 ; GFX10-DL-NEXT:    v_ashrrev_i32_e32 v0, 16, v1
1951 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
1952 ; GFX10-DL-NEXT:    v_ashrrev_i32_e32 v3, 16, v2
1953 ; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
1954 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, 0
1955 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
1956 ; GFX10-DL-NEXT:    v_mad_i32_i24 v0, v3, v0, s2
1957 ; GFX10-DL-NEXT:    v_add3_u32 v0, v0, v1, v0
1958 ; GFX10-DL-NEXT:    global_store_dword v2, v0, s[0:1]
1959 ; GFX10-DL-NEXT:    s_endpgm
1960                                                    ptr addrspace(1) %src2,
1961                                                    ptr addrspace(1) nocapture %dst) {
1962 entry:
1963   %idx = call i32 @llvm.amdgcn.workitem.id.x()
1964   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
1965   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
1966   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
1967   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
1969   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
1970   %conv = sext i16 %s1.elt1 to i32
1971   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
1972   %conv2 = sext i16 %s2.elt1 to i32
1973   %mul1 = mul i32 %conv2, %conv
1975   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
1976   %conv3 = sext i16 %s1.elt2 to i32
1977   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
1978   %conv4 = sext i16 %s2.elt2 to i32
1979   %mul2 = mul i32 %conv4, %conv3
1981   %s3 = load i32, ptr addrspace(1) %dst, align 4
1982   %add1 = add i32 %mul2, %s3
1983   %add2 = add i32 %add1, %mul1
1985   %res = add i32 %add2, %add1
1986   store i32 %res, ptr addrspace(1) %dst, align 4
1987   ret void
1990 define amdgpu_kernel void @udot2_MultipleUses_mul1(ptr addrspace(1) %src1,
1991 ; GFX7-LABEL: udot2_MultipleUses_mul1:
1992 ; GFX7:       ; %bb.0: ; %entry
1993 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
1994 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
1995 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
1996 ; GFX7-NEXT:    s_mov_b32 s10, 0
1997 ; GFX7-NEXT:    s_mov_b32 s11, s3
1998 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
1999 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
2000 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2001 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
2002 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
2003 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
2004 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
2005 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
2006 ; GFX7-NEXT:    s_mov_b32 s2, -1
2007 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
2008 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
2009 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2010 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2011 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
2012 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2013 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2014 ; GFX7-NEXT:    v_mad_u32_u24 v4, v0, v2, s4
2015 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v1, v4
2016 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
2017 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2018 ; GFX7-NEXT:    s_endpgm
2020 ; GFX8-LABEL: udot2_MultipleUses_mul1:
2021 ; GFX8:       ; %bb.0: ; %entry
2022 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2023 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2024 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2025 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2026 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2027 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
2028 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2029 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2030 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2031 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
2032 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2033 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
2034 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
2035 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
2036 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
2037 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2038 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2039 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
2040 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2041 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2042 ; GFX8-NEXT:    v_mad_u32_u24 v4, v2, v1, s2
2043 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, v4
2044 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v1, v0
2045 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2046 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2047 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2048 ; GFX8-NEXT:    s_endpgm
2050 ; GFX9-NODL-LABEL: udot2_MultipleUses_mul1:
2051 ; GFX9-NODL:       ; %bb.0: ; %entry
2052 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2053 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2054 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2055 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2056 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
2057 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
2058 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
2059 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
2060 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(1)
2061 ; GFX9-NODL-NEXT:    v_and_b32_e32 v3, 0xffff, v1
2062 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
2063 ; GFX9-NODL-NEXT:    v_and_b32_e32 v4, 0xffff, v2
2064 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2065 ; GFX9-NODL-NEXT:    v_mul_u32_u24_e32 v2, v4, v3
2066 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2067 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v3, v4, v3, s2
2068 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, v3, v2
2069 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
2070 ; GFX9-NODL-NEXT:    s_endpgm
2072 ; GFX9-DL-LABEL: udot2_MultipleUses_mul1:
2073 ; GFX9-DL:       ; %bb.0: ; %entry
2074 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2075 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2076 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2077 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2078 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2079 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2080 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2081 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
2082 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
2083 ; GFX9-DL-NEXT:    v_and_b32_e32 v3, 0xffff, v1
2084 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2085 ; GFX9-DL-NEXT:    v_and_b32_e32 v4, 0xffff, v2
2086 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2087 ; GFX9-DL-NEXT:    v_mul_u32_u24_e32 v2, v4, v3
2088 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2089 ; GFX9-DL-NEXT:    v_mad_u32_u24 v3, v4, v3, s2
2090 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, v3, v2
2091 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
2092 ; GFX9-DL-NEXT:    s_endpgm
2094 ; GFX10-DL-LABEL: udot2_MultipleUses_mul1:
2095 ; GFX10-DL:       ; %bb.0: ; %entry
2096 ; GFX10-DL-NEXT:    s_clause 0x1
2097 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2098 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2099 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2100 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2101 ; GFX10-DL-NEXT:    s_clause 0x1
2102 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2103 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2104 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2105 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
2106 ; GFX10-DL-NEXT:    v_and_b32_e32 v0, 0xffff, v1
2107 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2108 ; GFX10-DL-NEXT:    v_and_b32_e32 v3, 0xffff, v2
2109 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2110 ; GFX10-DL-NEXT:    v_mul_u32_u24_e32 v2, v3, v0
2111 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2112 ; GFX10-DL-NEXT:    v_mad_u32_u24 v0, v3, v0, s2
2113 ; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
2114 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, v0, v2
2115 ; GFX10-DL-NEXT:    global_store_dword v3, v0, s[0:1]
2116 ; GFX10-DL-NEXT:    s_endpgm
2117                                                    ptr addrspace(1) %src2,
2118                                                    ptr addrspace(1) nocapture %dst) {
2119 entry:
2120   %idx = call i32 @llvm.amdgcn.workitem.id.x()
2121   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
2122   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
2123   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
2124   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
2126   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
2127   %conv = zext i16 %s1.elt1 to i32
2128   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
2129   %conv2 = zext i16 %s2.elt1 to i32
2130   %mul1 = mul i32 %conv2, %conv
2132   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
2133   %conv3 = zext i16 %s1.elt2 to i32
2134   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
2135   %conv4 = zext i16 %s2.elt2 to i32
2136   %mul2 = mul i32 %conv4, %conv3
2138   %s3 = load i32, ptr addrspace(1) %dst, align 4
2139   %add0 = add i32 %mul1, %s3
2141   %add1 = add i32 %mul2, %add0
2142   %add2 = add i32 %add1, %mul1
2144   store i32 %add2, ptr addrspace(1) %dst, align 4
2145   ret void
2148 define amdgpu_kernel void @idot2_MultipleUses_mul1(ptr addrspace(1) %src1,
2149 ; GFX7-LABEL: idot2_MultipleUses_mul1:
2150 ; GFX7:       ; %bb.0: ; %entry
2151 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
2152 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
2153 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
2154 ; GFX7-NEXT:    s_mov_b32 s10, 0
2155 ; GFX7-NEXT:    s_mov_b32 s11, s3
2156 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2157 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
2158 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2159 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
2160 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
2161 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
2162 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
2163 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
2164 ; GFX7-NEXT:    s_mov_b32 s2, -1
2165 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
2166 ; GFX7-NEXT:    v_bfe_i32 v1, v2, 0, 16
2167 ; GFX7-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
2168 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2169 ; GFX7-NEXT:    v_bfe_i32 v3, v0, 0, 16
2170 ; GFX7-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2171 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2172 ; GFX7-NEXT:    v_mad_i32_i24 v4, v3, v1, s4
2173 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, v4
2174 ; GFX7-NEXT:    v_mad_i32_i24 v0, v3, v1, v0
2175 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2176 ; GFX7-NEXT:    s_endpgm
2178 ; GFX8-LABEL: idot2_MultipleUses_mul1:
2179 ; GFX8:       ; %bb.0: ; %entry
2180 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2181 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2182 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2183 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2184 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2185 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
2186 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2187 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2188 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2189 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
2190 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2191 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
2192 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
2193 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
2194 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 16
2195 ; GFX8-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
2196 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2197 ; GFX8-NEXT:    v_bfe_i32 v2, v0, 0, 16
2198 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2199 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2200 ; GFX8-NEXT:    v_mad_i32_i24 v4, v2, v1, s2
2201 ; GFX8-NEXT:    v_mad_i32_i24 v0, v0, v3, v4
2202 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v1, v0
2203 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2204 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2205 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2206 ; GFX8-NEXT:    s_endpgm
2208 ; GFX9-NODL-LABEL: idot2_MultipleUses_mul1:
2209 ; GFX9-NODL:       ; %bb.0: ; %entry
2210 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2211 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2212 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2213 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2214 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
2215 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
2216 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
2217 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
2218 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(1)
2219 ; GFX9-NODL-NEXT:    v_bfe_i32 v3, v1, 0, 16
2220 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
2221 ; GFX9-NODL-NEXT:    v_bfe_i32 v4, v2, 0, 16
2222 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2223 ; GFX9-NODL-NEXT:    v_mul_i32_i24_e32 v2, v4, v3
2224 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2225 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v3, v4, v3, s2
2226 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, v3, v2
2227 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
2228 ; GFX9-NODL-NEXT:    s_endpgm
2230 ; GFX9-DL-LABEL: idot2_MultipleUses_mul1:
2231 ; GFX9-DL:       ; %bb.0: ; %entry
2232 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2233 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2234 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2235 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2236 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2237 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2238 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2239 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
2240 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
2241 ; GFX9-DL-NEXT:    v_bfe_i32 v3, v1, 0, 16
2242 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2243 ; GFX9-DL-NEXT:    v_bfe_i32 v4, v2, 0, 16
2244 ; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2245 ; GFX9-DL-NEXT:    v_mul_i32_i24_e32 v2, v4, v3
2246 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2247 ; GFX9-DL-NEXT:    v_mad_i32_i24 v3, v4, v3, s2
2248 ; GFX9-DL-NEXT:    v_add3_u32 v1, v1, v3, v2
2249 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
2250 ; GFX9-DL-NEXT:    s_endpgm
2252 ; GFX10-DL-LABEL: idot2_MultipleUses_mul1:
2253 ; GFX10-DL:       ; %bb.0: ; %entry
2254 ; GFX10-DL-NEXT:    s_clause 0x1
2255 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2256 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2257 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2258 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2259 ; GFX10-DL-NEXT:    s_clause 0x1
2260 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2261 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2262 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2263 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
2264 ; GFX10-DL-NEXT:    v_bfe_i32 v0, v1, 0, 16
2265 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2266 ; GFX10-DL-NEXT:    v_bfe_i32 v3, v2, 0, 16
2267 ; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_1 src1_sel:WORD_1
2268 ; GFX10-DL-NEXT:    v_mul_i32_i24_e32 v2, v3, v0
2269 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2270 ; GFX10-DL-NEXT:    v_mad_i32_i24 v0, v3, v0, s2
2271 ; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
2272 ; GFX10-DL-NEXT:    v_add3_u32 v0, v1, v0, v2
2273 ; GFX10-DL-NEXT:    global_store_dword v3, v0, s[0:1]
2274 ; GFX10-DL-NEXT:    s_endpgm
2275                                                    ptr addrspace(1) %src2,
2276                                                    ptr addrspace(1) nocapture %dst) {
2277 entry:
2278   %idx = call i32 @llvm.amdgcn.workitem.id.x()
2279   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
2280   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
2281   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
2282   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
2284   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
2285   %conv = sext i16 %s1.elt1 to i32
2286   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
2287   %conv2 = sext i16 %s2.elt1 to i32
2288   %mul1 = mul i32 %conv2, %conv
2290   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
2291   %conv3 = sext i16 %s1.elt2 to i32
2292   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
2293   %conv4 = sext i16 %s2.elt2 to i32
2294   %mul2 = mul i32 %conv4, %conv3
2296   %s3 = load i32, ptr addrspace(1) %dst, align 4
2297   %add0 = add i32 %mul1, %s3
2299   %add1 = add i32 %mul2, %add0
2300   %add2 = add i32 %add1, %mul1
2302   store i32 %add2, ptr addrspace(1) %dst, align 4
2303   ret void
2306 define amdgpu_kernel void @udot2_MultipleUses_mul2(ptr addrspace(1) %src1,
2307 ; GFX7-LABEL: udot2_MultipleUses_mul2:
2308 ; GFX7:       ; %bb.0: ; %entry
2309 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
2310 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
2311 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
2312 ; GFX7-NEXT:    s_mov_b32 s10, 0
2313 ; GFX7-NEXT:    s_mov_b32 s11, s3
2314 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2315 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
2316 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2317 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
2318 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
2319 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
2320 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
2321 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
2322 ; GFX7-NEXT:    s_mov_b32 s2, -1
2323 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
2324 ; GFX7-NEXT:    v_lshrrev_b32_e32 v1, 16, v2
2325 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2326 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2327 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v0
2328 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2329 ; GFX7-NEXT:    v_mad_u32_u24 v4, v3, v1, s4
2330 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2331 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v1, v4
2332 ; GFX7-NEXT:    v_mad_u32_u24 v0, v0, v2, v1
2333 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2334 ; GFX7-NEXT:    s_endpgm
2336 ; GFX8-LABEL: udot2_MultipleUses_mul2:
2337 ; GFX8:       ; %bb.0: ; %entry
2338 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2339 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2340 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2341 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2342 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2343 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
2344 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2345 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2346 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2347 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
2348 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2349 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
2350 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
2351 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
2352 ; GFX8-NEXT:    v_and_b32_e32 v1, 0xffff, v3
2353 ; GFX8-NEXT:    v_lshrrev_b32_e32 v3, 16, v3
2354 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2355 ; GFX8-NEXT:    v_and_b32_e32 v2, 0xffff, v0
2356 ; GFX8-NEXT:    v_lshrrev_b32_e32 v0, 16, v0
2357 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2358 ; GFX8-NEXT:    v_mad_u32_u24 v4, v0, v3, s2
2359 ; GFX8-NEXT:    v_mad_u32_u24 v0, v0, v3, v4
2360 ; GFX8-NEXT:    v_mad_u32_u24 v2, v2, v1, v0
2361 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2362 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2363 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2364 ; GFX8-NEXT:    s_endpgm
2366 ; GFX9-NODL-LABEL: udot2_MultipleUses_mul2:
2367 ; GFX9-NODL:       ; %bb.0: ; %entry
2368 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2369 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2370 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2371 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2372 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
2373 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
2374 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
2375 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
2376 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
2377 ; GFX9-NODL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
2378 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
2379 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
2380 ; GFX9-NODL-NEXT:    v_mul_u32_u24_e32 v4, v2, v1
2381 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2382 ; GFX9-NODL-NEXT:    v_mad_u32_u24 v1, v2, v1, s2
2383 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v4, v1, v3
2384 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
2385 ; GFX9-NODL-NEXT:    s_endpgm
2387 ; GFX9-DL-LABEL: udot2_MultipleUses_mul2:
2388 ; GFX9-DL:       ; %bb.0: ; %entry
2389 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2390 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2391 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2392 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2393 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2394 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2395 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2396 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
2397 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2398 ; GFX9-DL-NEXT:    v_mul_u32_u24_sdwa v3, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
2399 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v1, 16, v1
2400 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v2, 16, v2
2401 ; GFX9-DL-NEXT:    v_mul_u32_u24_e32 v4, v2, v1
2402 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2403 ; GFX9-DL-NEXT:    v_mad_u32_u24 v1, v2, v1, s2
2404 ; GFX9-DL-NEXT:    v_add3_u32 v1, v4, v1, v3
2405 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
2406 ; GFX9-DL-NEXT:    s_endpgm
2408 ; GFX10-DL-LABEL: udot2_MultipleUses_mul2:
2409 ; GFX10-DL:       ; %bb.0: ; %entry
2410 ; GFX10-DL-NEXT:    s_clause 0x1
2411 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2412 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2413 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2414 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2415 ; GFX10-DL-NEXT:    s_clause 0x1
2416 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2417 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2418 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2419 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
2420 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v0, 16, v1
2421 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2422 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2423 ; GFX10-DL-NEXT:    v_mul_u32_u24_sdwa v1, v2, v1 dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
2424 ; GFX10-DL-NEXT:    v_mul_u32_u24_e32 v2, v3, v0
2425 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2426 ; GFX10-DL-NEXT:    v_mad_u32_u24 v0, v3, v0, s2
2427 ; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
2428 ; GFX10-DL-NEXT:    v_add3_u32 v0, v2, v0, v1
2429 ; GFX10-DL-NEXT:    global_store_dword v3, v0, s[0:1]
2430 ; GFX10-DL-NEXT:    s_endpgm
2431                                                    ptr addrspace(1) %src2,
2432                                                    ptr addrspace(1) nocapture %dst) {
2433 entry:
2434   %idx = call i32 @llvm.amdgcn.workitem.id.x()
2435   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
2436   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
2437   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
2438   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
2440   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
2441   %conv = zext i16 %s1.elt1 to i32
2442   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
2443   %conv2 = zext i16 %s2.elt1 to i32
2444   %mul1 = mul i32 %conv2, %conv
2446   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
2447   %conv3 = zext i16 %s1.elt2 to i32
2448   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
2449   %conv4 = zext i16 %s2.elt2 to i32
2450   %mul2 = mul i32 %conv4, %conv3
2452   %s3 = load i32, ptr addrspace(1) %dst, align 4
2453   %add0 = add i32 %mul2, %s3
2455   %add1 = add i32 %mul2, %add0
2456   %add2 = add i32 %add1, %mul1
2458   store i32 %add2, ptr addrspace(1) %dst, align 4
2459   ret void
2462 define amdgpu_kernel void @idot2_MultipleUses_mul2(ptr addrspace(1) %src1,
2463 ; GFX7-LABEL: idot2_MultipleUses_mul2:
2464 ; GFX7:       ; %bb.0: ; %entry
2465 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
2466 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
2467 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
2468 ; GFX7-NEXT:    s_mov_b32 s10, 0
2469 ; GFX7-NEXT:    s_mov_b32 s11, s3
2470 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2471 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
2472 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2473 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
2474 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
2475 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
2476 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
2477 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
2478 ; GFX7-NEXT:    s_mov_b32 s2, -1
2479 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
2480 ; GFX7-NEXT:    v_bfe_i32 v1, v2, 0, 16
2481 ; GFX7-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
2482 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2483 ; GFX7-NEXT:    v_bfe_i32 v3, v0, 0, 16
2484 ; GFX7-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2485 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2486 ; GFX7-NEXT:    v_mad_i32_i24 v4, v0, v2, s4
2487 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, v4
2488 ; GFX7-NEXT:    v_mad_i32_i24 v0, v3, v1, v0
2489 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2490 ; GFX7-NEXT:    s_endpgm
2492 ; GFX8-LABEL: idot2_MultipleUses_mul2:
2493 ; GFX8:       ; %bb.0: ; %entry
2494 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2495 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2496 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2497 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2498 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2499 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
2500 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2501 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2502 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2503 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
2504 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2505 ; GFX8-NEXT:    flat_load_dword v0, v[0:1]
2506 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
2507 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
2508 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 16
2509 ; GFX8-NEXT:    v_ashrrev_i32_e32 v3, 16, v3
2510 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2511 ; GFX8-NEXT:    v_bfe_i32 v2, v0, 0, 16
2512 ; GFX8-NEXT:    v_ashrrev_i32_e32 v0, 16, v0
2513 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2514 ; GFX8-NEXT:    v_mad_i32_i24 v4, v0, v3, s2
2515 ; GFX8-NEXT:    v_mad_i32_i24 v0, v0, v3, v4
2516 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v1, v0
2517 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2518 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2519 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2520 ; GFX8-NEXT:    s_endpgm
2522 ; GFX9-NODL-LABEL: idot2_MultipleUses_mul2:
2523 ; GFX9-NODL:       ; %bb.0: ; %entry
2524 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2525 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2526 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2527 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2528 ; GFX9-NODL-NEXT:    global_load_dword v1, v0, s[4:5]
2529 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[6:7]
2530 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
2531 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
2532 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
2533 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
2534 ; GFX9-NODL-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
2535 ; GFX9-NODL-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
2536 ; GFX9-NODL-NEXT:    v_mul_i32_i24_e32 v4, v2, v1
2537 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2538 ; GFX9-NODL-NEXT:    v_mad_i32_i24 v1, v2, v1, s2
2539 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v4, v1, v3
2540 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
2541 ; GFX9-NODL-NEXT:    s_endpgm
2543 ; GFX9-DL-LABEL: idot2_MultipleUses_mul2:
2544 ; GFX9-DL:       ; %bb.0: ; %entry
2545 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2546 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2547 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2548 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2549 ; GFX9-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2550 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2551 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2552 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
2553 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2554 ; GFX9-DL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
2555 ; GFX9-DL-NEXT:    v_ashrrev_i32_e32 v1, 16, v1
2556 ; GFX9-DL-NEXT:    v_ashrrev_i32_e32 v2, 16, v2
2557 ; GFX9-DL-NEXT:    v_mul_i32_i24_e32 v4, v2, v1
2558 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2559 ; GFX9-DL-NEXT:    v_mad_i32_i24 v1, v2, v1, s2
2560 ; GFX9-DL-NEXT:    v_add3_u32 v1, v4, v1, v3
2561 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
2562 ; GFX9-DL-NEXT:    s_endpgm
2564 ; GFX10-DL-LABEL: idot2_MultipleUses_mul2:
2565 ; GFX10-DL:       ; %bb.0: ; %entry
2566 ; GFX10-DL-NEXT:    s_clause 0x1
2567 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2568 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2569 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2570 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2571 ; GFX10-DL-NEXT:    s_clause 0x1
2572 ; GFX10-DL-NEXT:    global_load_dword v1, v0, s[4:5]
2573 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[6:7]
2574 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2575 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
2576 ; GFX10-DL-NEXT:    v_ashrrev_i32_e32 v0, 16, v1
2577 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2578 ; GFX10-DL-NEXT:    v_ashrrev_i32_e32 v3, 16, v2
2579 ; GFX10-DL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:WORD_0 src1_sel:WORD_0
2580 ; GFX10-DL-NEXT:    v_mul_i32_i24_e32 v2, v3, v0
2581 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2582 ; GFX10-DL-NEXT:    v_mad_i32_i24 v0, v3, v0, s2
2583 ; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
2584 ; GFX10-DL-NEXT:    v_add3_u32 v0, v2, v0, v1
2585 ; GFX10-DL-NEXT:    global_store_dword v3, v0, s[0:1]
2586 ; GFX10-DL-NEXT:    s_endpgm
2587                                                    ptr addrspace(1) %src2,
2588                                                    ptr addrspace(1) nocapture %dst) {
2589 entry:
2590   %idx = call i32 @llvm.amdgcn.workitem.id.x()
2591   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
2592   %vec1 = load <2 x i16>, ptr addrspace(1) %gep1
2593   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
2594   %vec2 = load <2 x i16>, ptr addrspace(1) %gep2
2596   %s1.elt1 = extractelement <2 x i16> %vec1, i64 0
2597   %conv = sext i16 %s1.elt1 to i32
2598   %s2.elt1 = extractelement <2 x i16> %vec2, i64 0
2599   %conv2 = sext i16 %s2.elt1 to i32
2600   %mul1 = mul i32 %conv2, %conv
2602   %s1.elt2 = extractelement <2 x i16> %vec1, i64 1
2603   %conv3 = sext i16 %s1.elt2 to i32
2604   %s2.elt2 = extractelement <2 x i16> %vec2, i64 1
2605   %conv4 = sext i16 %s2.elt2 to i32
2606   %mul2 = mul i32 %conv4, %conv3
2608   %s3 = load i32, ptr addrspace(1) %dst, align 4
2609   %add0 = add i32 %mul2, %s3
2611   %add1 = add i32 %mul2, %add0
2612   %add2 = add i32 %add1, %mul1
2614   store i32 %add2, ptr addrspace(1) %dst, align 4
2615   ret void
2618 define amdgpu_kernel void @udot2_acc16(ptr addrspace(1) %src1,
2619 ; GFX7-LABEL: udot2_acc16:
2620 ; GFX7:       ; %bb.0: ; %entry
2621 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
2622 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
2623 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
2624 ; GFX7-NEXT:    s_mov_b32 s10, 0
2625 ; GFX7-NEXT:    s_mov_b32 s11, s3
2626 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2627 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
2628 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2629 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
2630 ; GFX7-NEXT:    buffer_load_dword v2, v[0:1], s[8:11], 0 addr64
2631 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
2632 ; GFX7-NEXT:    buffer_load_dword v0, v[0:1], s[8:11], 0 addr64
2633 ; GFX7-NEXT:    s_mov_b32 s2, -1
2634 ; GFX7-NEXT:    buffer_load_ushort v1, off, s[0:3], 0
2635 ; GFX7-NEXT:    s_waitcnt vmcnt(2)
2636 ; GFX7-NEXT:    v_lshrrev_b32_e32 v3, 16, v2
2637 ; GFX7-NEXT:    v_and_b32_e32 v2, 0xffff, v2
2638 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
2639 ; GFX7-NEXT:    v_lshrrev_b32_e32 v4, 16, v0
2640 ; GFX7-NEXT:    v_and_b32_e32 v0, 0xffff, v0
2641 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2642 ; GFX7-NEXT:    v_mad_u32_u24 v1, v3, v4, v1
2643 ; GFX7-NEXT:    v_mad_u32_u24 v0, v2, v0, v1
2644 ; GFX7-NEXT:    buffer_store_short v0, off, s[0:3], 0
2645 ; GFX7-NEXT:    s_endpgm
2647 ; GFX8-LABEL: udot2_acc16:
2648 ; GFX8:       ; %bb.0: ; %entry
2649 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2650 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2651 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 2, v0
2652 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2653 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2654 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
2655 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2656 ; GFX8-NEXT:    flat_load_dword v3, v[0:1]
2657 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2658 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
2659 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2660 ; GFX8-NEXT:    flat_load_dword v2, v[0:1]
2661 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2662 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2663 ; GFX8-NEXT:    flat_load_ushort v4, v[0:1]
2664 ; GFX8-NEXT:    s_waitcnt vmcnt(2)
2665 ; GFX8-NEXT:    v_lshrrev_b32_e32 v5, 16, v3
2666 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
2667 ; GFX8-NEXT:    v_lshrrev_b32_e32 v6, 16, v2
2668 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2669 ; GFX8-NEXT:    v_mad_u16 v4, v5, v6, v4
2670 ; GFX8-NEXT:    v_mad_u16 v2, v3, v2, v4
2671 ; GFX8-NEXT:    flat_store_short v[0:1], v2
2672 ; GFX8-NEXT:    s_endpgm
2674 ; GFX9-NODL-LABEL: udot2_acc16:
2675 ; GFX9-NODL:       ; %bb.0: ; %entry
2676 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2677 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2678 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2679 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v1, 0
2680 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2681 ; GFX9-NODL-NEXT:    global_load_dword v2, v0, s[4:5]
2682 ; GFX9-NODL-NEXT:    global_load_dword v3, v0, s[6:7]
2683 ; GFX9-NODL-NEXT:    global_load_ushort v4, v1, s[0:1]
2684 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(2)
2685 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
2686 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(1)
2687 ; GFX9-NODL-NEXT:    v_lshrrev_b32_e32 v5, 16, v3
2688 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
2689 ; GFX9-NODL-NEXT:    v_mad_legacy_u16 v0, v0, v5, v4
2690 ; GFX9-NODL-NEXT:    v_mad_legacy_u16 v0, v2, v3, v0
2691 ; GFX9-NODL-NEXT:    global_store_short v1, v0, s[0:1]
2692 ; GFX9-NODL-NEXT:    s_endpgm
2694 ; GFX9-DL-LABEL: udot2_acc16:
2695 ; GFX9-DL:       ; %bb.0: ; %entry
2696 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2697 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2698 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2699 ; GFX9-DL-NEXT:    v_mov_b32_e32 v1, 0
2700 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2701 ; GFX9-DL-NEXT:    global_load_dword v2, v0, s[4:5]
2702 ; GFX9-DL-NEXT:    global_load_dword v3, v0, s[6:7]
2703 ; GFX9-DL-NEXT:    global_load_ushort v4, v1, s[0:1]
2704 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(2)
2705 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
2706 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
2707 ; GFX9-DL-NEXT:    v_lshrrev_b32_e32 v5, 16, v3
2708 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2709 ; GFX9-DL-NEXT:    v_mad_legacy_u16 v0, v0, v5, v4
2710 ; GFX9-DL-NEXT:    v_mad_legacy_u16 v0, v2, v3, v0
2711 ; GFX9-DL-NEXT:    global_store_short v1, v0, s[0:1]
2712 ; GFX9-DL-NEXT:    s_endpgm
2714 ; GFX10-DL-LABEL: udot2_acc16:
2715 ; GFX10-DL:       ; %bb.0: ; %entry
2716 ; GFX10-DL-NEXT:    s_clause 0x1
2717 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2718 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2719 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 2, v0
2720 ; GFX10-DL-NEXT:    v_mov_b32_e32 v1, 0
2721 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2722 ; GFX10-DL-NEXT:    s_clause 0x1
2723 ; GFX10-DL-NEXT:    global_load_dword v2, v0, s[4:5]
2724 ; GFX10-DL-NEXT:    global_load_dword v3, v0, s[6:7]
2725 ; GFX10-DL-NEXT:    global_load_ushort v4, v1, s[0:1]
2726 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(2)
2727 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v0, 16, v2
2728 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
2729 ; GFX10-DL-NEXT:    v_lshrrev_b32_e32 v5, 16, v3
2730 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2731 ; GFX10-DL-NEXT:    v_mad_u16 v0, v0, v5, v4
2732 ; GFX10-DL-NEXT:    v_mad_u16 v0, v2, v3, v0
2733 ; GFX10-DL-NEXT:    global_store_short v1, v0, s[0:1]
2734 ; GFX10-DL-NEXT:    s_endpgm
2735                                        ptr addrspace(1) %src2,
2736                                        ptr addrspace(1) nocapture %dst) {
2737 entry:
2738   %idx = call i32 @llvm.amdgcn.workitem.id.x()
2739   %gep1 = getelementptr <2 x i16>, ptr addrspace(1) %src1, i32 %idx
2740   %v1 = load <2 x i16>, ptr addrspace(1) %gep1
2741   %gep2 = getelementptr <2 x i16>, ptr addrspace(1) %src2, i32 %idx
2742   %v2 = load <2 x i16>, ptr addrspace(1) %gep2
2744   %v1e1 = extractelement <2 x i16> %v1, i64 0
2745   %v2e1 = extractelement <2 x i16> %v2, i64 0
2746   %mul1 = mul i16 %v1e1, %v2e1
2748   %v1e2 = extractelement <2 x i16> %v1, i64 1
2749   %v2e2 = extractelement <2 x i16> %v2, i64 1
2750   %mul2 = mul i16 %v1e2, %v2e2
2752   %s2 = load i16, ptr addrspace(1) %dst, align 2
2753   %add1 = add i16 %mul2, %s2
2754   %add2 = add i16 %add1, %mul1
2755   store i16 %add2, ptr addrspace(1) %dst, align 2
2756   ret void
2759 define amdgpu_kernel void @notsdot2_sext8(ptr addrspace(1) %src1,
2760 ; GFX7-LABEL: notsdot2_sext8:
2761 ; GFX7:       ; %bb.0: ; %entry
2762 ; GFX7-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x9
2763 ; GFX7-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0xd
2764 ; GFX7-NEXT:    s_mov_b32 s3, 0xf000
2765 ; GFX7-NEXT:    s_mov_b32 s10, 0
2766 ; GFX7-NEXT:    s_mov_b32 s11, s3
2767 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2768 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[4:5]
2769 ; GFX7-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
2770 ; GFX7-NEXT:    v_mov_b32_e32 v1, 0
2771 ; GFX7-NEXT:    buffer_load_ushort v2, v[0:1], s[8:11], 0 addr64
2772 ; GFX7-NEXT:    s_mov_b64 s[8:9], s[6:7]
2773 ; GFX7-NEXT:    buffer_load_ushort v0, v[0:1], s[8:11], 0 addr64
2774 ; GFX7-NEXT:    s_load_dword s4, s[0:1], 0x0
2775 ; GFX7-NEXT:    s_mov_b32 s2, -1
2776 ; GFX7-NEXT:    s_waitcnt vmcnt(1)
2777 ; GFX7-NEXT:    v_bfe_i32 v1, v2, 0, 8
2778 ; GFX7-NEXT:    v_bfe_i32 v2, v2, 8, 8
2779 ; GFX7-NEXT:    s_waitcnt vmcnt(0)
2780 ; GFX7-NEXT:    v_bfe_i32 v3, v0, 0, 8
2781 ; GFX7-NEXT:    v_bfe_i32 v0, v0, 8, 8
2782 ; GFX7-NEXT:    s_waitcnt lgkmcnt(0)
2783 ; GFX7-NEXT:    v_mad_i32_i24 v0, v0, v2, s4
2784 ; GFX7-NEXT:    v_mad_i32_i24 v0, v3, v1, v0
2785 ; GFX7-NEXT:    buffer_store_dword v0, off, s[0:3], 0
2786 ; GFX7-NEXT:    s_endpgm
2788 ; GFX8-LABEL: notsdot2_sext8:
2789 ; GFX8:       ; %bb.0: ; %entry
2790 ; GFX8-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2791 ; GFX8-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2792 ; GFX8-NEXT:    v_lshlrev_b32_e32 v2, 1, v0
2793 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2794 ; GFX8-NEXT:    v_mov_b32_e32 v1, s5
2795 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s4, v2
2796 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2797 ; GFX8-NEXT:    flat_load_ushort v3, v[0:1]
2798 ; GFX8-NEXT:    v_mov_b32_e32 v1, s7
2799 ; GFX8-NEXT:    v_add_u32_e32 v0, vcc, s6, v2
2800 ; GFX8-NEXT:    v_addc_u32_e32 v1, vcc, 0, v1, vcc
2801 ; GFX8-NEXT:    flat_load_ushort v0, v[0:1]
2802 ; GFX8-NEXT:    s_load_dword s2, s[0:1], 0x0
2803 ; GFX8-NEXT:    s_waitcnt vmcnt(1)
2804 ; GFX8-NEXT:    v_bfe_i32 v1, v3, 0, 8
2805 ; GFX8-NEXT:    v_lshrrev_b16_e32 v3, 8, v3
2806 ; GFX8-NEXT:    v_bfe_i32 v3, v3, 0, 8
2807 ; GFX8-NEXT:    s_waitcnt vmcnt(0)
2808 ; GFX8-NEXT:    v_bfe_i32 v2, v0, 0, 8
2809 ; GFX8-NEXT:    v_lshrrev_b16_e32 v0, 8, v0
2810 ; GFX8-NEXT:    v_bfe_i32 v0, v0, 0, 8
2811 ; GFX8-NEXT:    s_waitcnt lgkmcnt(0)
2812 ; GFX8-NEXT:    v_mad_i32_i24 v0, v0, v3, s2
2813 ; GFX8-NEXT:    v_mad_i32_i24 v2, v2, v1, v0
2814 ; GFX8-NEXT:    v_mov_b32_e32 v0, s0
2815 ; GFX8-NEXT:    v_mov_b32_e32 v1, s1
2816 ; GFX8-NEXT:    flat_store_dword v[0:1], v2
2817 ; GFX8-NEXT:    s_endpgm
2819 ; GFX9-NODL-LABEL: notsdot2_sext8:
2820 ; GFX9-NODL:       ; %bb.0: ; %entry
2821 ; GFX9-NODL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2822 ; GFX9-NODL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2823 ; GFX9-NODL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
2824 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2825 ; GFX9-NODL-NEXT:    global_load_ushort v1, v0, s[4:5]
2826 ; GFX9-NODL-NEXT:    global_load_ushort v2, v0, s[6:7]
2827 ; GFX9-NODL-NEXT:    s_load_dword s2, s[0:1], 0x0
2828 ; GFX9-NODL-NEXT:    v_mov_b32_e32 v0, 0
2829 ; GFX9-NODL-NEXT:    s_waitcnt vmcnt(0)
2830 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v3, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2831 ; GFX9-NODL-NEXT:    v_lshrrev_b16_e32 v1, 8, v1
2832 ; GFX9-NODL-NEXT:    v_lshrrev_b16_e32 v2, 8, v2
2833 ; GFX9-NODL-NEXT:    v_mul_i32_i24_sdwa v1, sext(v2), sext(v1) dst_sel:DWORD dst_unused:UNUSED_PAD src0_sel:BYTE_0 src1_sel:BYTE_0
2834 ; GFX9-NODL-NEXT:    s_waitcnt lgkmcnt(0)
2835 ; GFX9-NODL-NEXT:    v_add3_u32 v1, v1, s2, v3
2836 ; GFX9-NODL-NEXT:    global_store_dword v0, v1, s[0:1]
2837 ; GFX9-NODL-NEXT:    s_endpgm
2839 ; GFX9-DL-LABEL: notsdot2_sext8:
2840 ; GFX9-DL:       ; %bb.0: ; %entry
2841 ; GFX9-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2842 ; GFX9-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2843 ; GFX9-DL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
2844 ; GFX9-DL-NEXT:    s_mov_b32 s3, 0xc0c0001
2845 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2846 ; GFX9-DL-NEXT:    global_load_ushort v1, v0, s[4:5]
2847 ; GFX9-DL-NEXT:    global_load_ushort v2, v0, s[6:7]
2848 ; GFX9-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2849 ; GFX9-DL-NEXT:    v_mov_b32_e32 v0, 0
2850 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(1)
2851 ; GFX9-DL-NEXT:    v_perm_b32 v1, v1, v1, s3
2852 ; GFX9-DL-NEXT:    s_waitcnt vmcnt(0)
2853 ; GFX9-DL-NEXT:    v_perm_b32 v2, v2, v2, s3
2854 ; GFX9-DL-NEXT:    s_waitcnt lgkmcnt(0)
2855 ; GFX9-DL-NEXT:    v_dot4_i32_i8 v1, v2, v1, s2
2856 ; GFX9-DL-NEXT:    global_store_dword v0, v1, s[0:1]
2857 ; GFX9-DL-NEXT:    s_endpgm
2859 ; GFX10-DL-LABEL: notsdot2_sext8:
2860 ; GFX10-DL:       ; %bb.0: ; %entry
2861 ; GFX10-DL-NEXT:    s_clause 0x1
2862 ; GFX10-DL-NEXT:    s_load_dwordx4 s[4:7], s[2:3], 0x24
2863 ; GFX10-DL-NEXT:    s_load_dwordx2 s[0:1], s[2:3], 0x34
2864 ; GFX10-DL-NEXT:    v_lshlrev_b32_e32 v0, 1, v0
2865 ; GFX10-DL-NEXT:    v_mov_b32_e32 v3, 0
2866 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2867 ; GFX10-DL-NEXT:    s_clause 0x1
2868 ; GFX10-DL-NEXT:    global_load_ushort v1, v0, s[4:5]
2869 ; GFX10-DL-NEXT:    global_load_ushort v2, v0, s[6:7]
2870 ; GFX10-DL-NEXT:    s_load_dword s2, s[0:1], 0x0
2871 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(1)
2872 ; GFX10-DL-NEXT:    v_perm_b32 v0, v1, v1, 0xc0c0001
2873 ; GFX10-DL-NEXT:    s_waitcnt vmcnt(0)
2874 ; GFX10-DL-NEXT:    v_perm_b32 v1, v2, v2, 0xc0c0001
2875 ; GFX10-DL-NEXT:    s_waitcnt lgkmcnt(0)
2876 ; GFX10-DL-NEXT:    v_mov_b32_e32 v2, s2
2877 ; GFX10-DL-NEXT:    v_dot4c_i32_i8 v2, v1, v0
2878 ; GFX10-DL-NEXT:    global_store_dword v3, v2, s[0:1]
2879 ; GFX10-DL-NEXT:    s_endpgm
2880                                           ptr addrspace(1) %src2,
2881                                           ptr addrspace(1) nocapture %dst) {
2882 entry:
2883   %idx = call i32 @llvm.amdgcn.workitem.id.x()
2884   %gep1 = getelementptr <2 x i8>, ptr addrspace(1) %src1, i32 %idx
2885   %vec1 = load <2 x i8>, ptr addrspace(1) %gep1
2886   %gep2 = getelementptr <2 x i8>, ptr addrspace(1) %src2, i32 %idx
2887   %vec2 = load <2 x i8>, ptr addrspace(1) %gep2
2889   %s1.elt1 = extractelement <2 x i8> %vec1, i64 0
2890   %conv = sext i8 %s1.elt1 to i32
2891   %s2.elt1 = extractelement <2 x i8> %vec2, i64 0
2892   %conv2 = sext i8 %s2.elt1 to i32
2893   %mul1 = mul nuw i32 %conv2, %conv
2895   %s1.elt2 = extractelement <2 x i8> %vec1, i64 1
2896   %conv3 = sext i8 %s1.elt2 to i32
2897   %s2.elt2 = extractelement <2 x i8> %vec2, i64 1
2898   %conv4 = sext i8 %s2.elt2 to i32
2899   %mul2 = mul nuw i32 %conv4, %conv3
2901   %s3 = load i32, ptr addrspace(1) %dst, align 4
2902   %add = add i32 %mul2, %s3
2903   %add6 = add i32 %add, %mul1
2904   store i32 %add6, ptr addrspace(1) %dst, align 4
2905   ret void
2908 declare i32 @llvm.amdgcn.workitem.id.x()