Re-land [openmp] Fix warnings when building on Windows with latest MSVC or Clang...
[llvm-project.git] / llvm / test / CodeGen / RISCV / rvv / vscale-vw-web-simplification.ll
blob972fa66917a5689f978fbf04a218ebce953c21e7
1 ; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py
2 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=1 | FileCheck %s --check-prefixes=NO_FOLDING,RV32
3 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=2 | FileCheck %s --check-prefixes=NO_FOLDING,RV32
4 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=3 | FileCheck %s --check-prefixes=FOLDING,RV32
5 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=1 | FileCheck %s --check-prefixes=NO_FOLDING,RV64
6 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=2 | FileCheck %s --check-prefixes=NO_FOLDING,RV64
7 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=3 | FileCheck %s --check-prefixes=FOLDING,RV64
8 ; Check that the default value enables the web folding and
9 ; that it is bigger than 3.
10 ; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=FOLDING,RV32
11 ; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=FOLDING,RV64
13 ; Check that the scalable vector add/sub/mul operations are all promoted into their
14 ; vw counterpart when the folding of the web size is increased to 3.
15 ; We need the web size to be at least 3 for the folding to happen, because
16 ; %c has 3 uses.
17 ; see https://github.com/llvm/llvm-project/pull/72340
19 define <vscale x 2 x i16> @vwop_vscale_sext_i8i16_multiple_users(ptr %x, ptr %y, ptr %z) {
20 ; NO_FOLDING-LABEL: vwop_vscale_sext_i8i16_multiple_users:
21 ; NO_FOLDING:       # %bb.0:
22 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e16, mf2, ta, ma
23 ; NO_FOLDING-NEXT:    vle8.v v8, (a0)
24 ; NO_FOLDING-NEXT:    vle8.v v9, (a1)
25 ; NO_FOLDING-NEXT:    vle8.v v10, (a2)
26 ; NO_FOLDING-NEXT:    vsext.vf2 v11, v8
27 ; NO_FOLDING-NEXT:    vsext.vf2 v8, v9
28 ; NO_FOLDING-NEXT:    vsext.vf2 v9, v10
29 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
30 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
31 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
32 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
33 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
34 ; NO_FOLDING-NEXT:    ret
36 ; FOLDING-LABEL: vwop_vscale_sext_i8i16_multiple_users:
37 ; FOLDING:       # %bb.0:
38 ; FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
39 ; FOLDING-NEXT:    vle8.v v8, (a0)
40 ; FOLDING-NEXT:    vle8.v v9, (a1)
41 ; FOLDING-NEXT:    vle8.v v10, (a2)
42 ; FOLDING-NEXT:    vwmul.vv v11, v8, v9
43 ; FOLDING-NEXT:    vwadd.vv v9, v8, v10
44 ; FOLDING-NEXT:    vwsub.vv v12, v8, v10
45 ; FOLDING-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
46 ; FOLDING-NEXT:    vor.vv v8, v11, v9
47 ; FOLDING-NEXT:    vor.vv v8, v8, v12
48 ; FOLDING-NEXT:    ret
49   %a = load <vscale x 2 x i8>, ptr %x
50   %b = load <vscale x 2 x i8>, ptr %y
51   %b2 = load <vscale x 2 x i8>, ptr %z
52   %c = sext <vscale x 2 x i8> %a to <vscale x 2 x i16>
53   %d = sext <vscale x 2 x i8> %b to <vscale x 2 x i16>
54   %d2 = sext <vscale x 2 x i8> %b2 to <vscale x 2 x i16>
55   %e = mul <vscale x 2 x i16> %c, %d
56   %f = add <vscale x 2 x i16> %c, %d2
57   %g = sub <vscale x 2 x i16> %c, %d2
58   %h = or <vscale x 2 x i16> %e, %f
59   %i = or <vscale x 2 x i16> %h, %g
60   ret <vscale x 2 x i16> %i
63 define <vscale x 2 x i32> @vwop_vscale_sext_i16i32_multiple_users(ptr %x, ptr %y, ptr %z) {
64 ; NO_FOLDING-LABEL: vwop_vscale_sext_i16i32_multiple_users:
65 ; NO_FOLDING:       # %bb.0:
66 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
67 ; NO_FOLDING-NEXT:    vle16.v v8, (a0)
68 ; NO_FOLDING-NEXT:    vle16.v v9, (a1)
69 ; NO_FOLDING-NEXT:    vle16.v v10, (a2)
70 ; NO_FOLDING-NEXT:    vsext.vf2 v11, v8
71 ; NO_FOLDING-NEXT:    vsext.vf2 v8, v9
72 ; NO_FOLDING-NEXT:    vsext.vf2 v9, v10
73 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
74 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
75 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
76 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
77 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
78 ; NO_FOLDING-NEXT:    ret
80 ; FOLDING-LABEL: vwop_vscale_sext_i16i32_multiple_users:
81 ; FOLDING:       # %bb.0:
82 ; FOLDING-NEXT:    vsetvli a3, zero, e16, mf2, ta, ma
83 ; FOLDING-NEXT:    vle16.v v8, (a0)
84 ; FOLDING-NEXT:    vle16.v v9, (a1)
85 ; FOLDING-NEXT:    vle16.v v10, (a2)
86 ; FOLDING-NEXT:    vwmul.vv v11, v8, v9
87 ; FOLDING-NEXT:    vwadd.vv v9, v8, v10
88 ; FOLDING-NEXT:    vwsub.vv v12, v8, v10
89 ; FOLDING-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
90 ; FOLDING-NEXT:    vor.vv v8, v11, v9
91 ; FOLDING-NEXT:    vor.vv v8, v8, v12
92 ; FOLDING-NEXT:    ret
93   %a = load <vscale x 2 x i16>, ptr %x
94   %b = load <vscale x 2 x i16>, ptr %y
95   %b2 = load <vscale x 2 x i16>, ptr %z
96   %c = sext <vscale x 2 x i16> %a to <vscale x 2 x i32>
97   %d = sext <vscale x 2 x i16> %b to <vscale x 2 x i32>
98   %d2 = sext <vscale x 2 x i16> %b2 to <vscale x 2 x i32>
99   %e = mul <vscale x 2 x i32> %c, %d
100   %f = add <vscale x 2 x i32> %c, %d2
101   %g = sub <vscale x 2 x i32> %c, %d2
102   %h = or <vscale x 2 x i32> %e, %f
103   %i = or <vscale x 2 x i32> %h, %g
104   ret <vscale x 2 x i32> %i
107 define <vscale x 2 x i64> @vwop_vscale_sext_i32i64_multiple_users(ptr %x, ptr %y, ptr %z) {
108 ; NO_FOLDING-LABEL: vwop_vscale_sext_i32i64_multiple_users:
109 ; NO_FOLDING:       # %bb.0:
110 ; NO_FOLDING-NEXT:    vl1re32.v v8, (a0)
111 ; NO_FOLDING-NEXT:    vl1re32.v v9, (a1)
112 ; NO_FOLDING-NEXT:    vl1re32.v v10, (a2)
113 ; NO_FOLDING-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
114 ; NO_FOLDING-NEXT:    vsext.vf2 v12, v8
115 ; NO_FOLDING-NEXT:    vsext.vf2 v14, v9
116 ; NO_FOLDING-NEXT:    vsext.vf2 v8, v10
117 ; NO_FOLDING-NEXT:    vmul.vv v10, v12, v14
118 ; NO_FOLDING-NEXT:    vadd.vv v14, v12, v8
119 ; NO_FOLDING-NEXT:    vsub.vv v8, v12, v8
120 ; NO_FOLDING-NEXT:    vor.vv v10, v10, v14
121 ; NO_FOLDING-NEXT:    vor.vv v8, v10, v8
122 ; NO_FOLDING-NEXT:    ret
124 ; FOLDING-LABEL: vwop_vscale_sext_i32i64_multiple_users:
125 ; FOLDING:       # %bb.0:
126 ; FOLDING-NEXT:    vl1re32.v v8, (a0)
127 ; FOLDING-NEXT:    vl1re32.v v9, (a1)
128 ; FOLDING-NEXT:    vl1re32.v v10, (a2)
129 ; FOLDING-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
130 ; FOLDING-NEXT:    vwmul.vv v12, v8, v9
131 ; FOLDING-NEXT:    vwadd.vv v14, v8, v10
132 ; FOLDING-NEXT:    vwsub.vv v16, v8, v10
133 ; FOLDING-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
134 ; FOLDING-NEXT:    vor.vv v8, v12, v14
135 ; FOLDING-NEXT:    vor.vv v8, v8, v16
136 ; FOLDING-NEXT:    ret
137   %a = load <vscale x 2 x i32>, ptr %x
138   %b = load <vscale x 2 x i32>, ptr %y
139   %b2 = load <vscale x 2 x i32>, ptr %z
140   %c = sext <vscale x 2 x i32> %a to <vscale x 2 x i64>
141   %d = sext <vscale x 2 x i32> %b to <vscale x 2 x i64>
142   %d2 = sext <vscale x 2 x i32> %b2 to <vscale x 2 x i64>
143   %e = mul <vscale x 2 x i64> %c, %d
144   %f = add <vscale x 2 x i64> %c, %d2
145   %g = sub <vscale x 2 x i64> %c, %d2
146   %h = or <vscale x 2 x i64> %e, %f
147   %i = or <vscale x 2 x i64> %h, %g
148   ret <vscale x 2 x i64> %i
151 define <vscale x 2 x i32> @vwop_vscale_sext_i1i32_multiple_users(ptr %x, ptr %y, ptr %z) {
152 ; RV32-LABEL: vwop_vscale_sext_i1i32_multiple_users:
153 ; RV32:       # %bb.0:
154 ; RV32-NEXT:    vsetvli a3, zero, e32, m1, ta, mu
155 ; RV32-NEXT:    vlm.v v8, (a0)
156 ; RV32-NEXT:    vlm.v v9, (a1)
157 ; RV32-NEXT:    vlm.v v10, (a2)
158 ; RV32-NEXT:    vmv.v.i v11, 0
159 ; RV32-NEXT:    vmv.v.v v0, v8
160 ; RV32-NEXT:    vmerge.vim v12, v11, -1, v0
161 ; RV32-NEXT:    vmv.v.v v0, v9
162 ; RV32-NEXT:    vmerge.vim v9, v11, -1, v0
163 ; RV32-NEXT:    vmv.v.v v0, v10
164 ; RV32-NEXT:    vmerge.vim v10, v11, -1, v0
165 ; RV32-NEXT:    vmul.vv v9, v12, v9
166 ; RV32-NEXT:    li a0, 1
167 ; RV32-NEXT:    vsub.vv v11, v12, v10
168 ; RV32-NEXT:    vmv.v.v v0, v8
169 ; RV32-NEXT:    vsub.vx v10, v10, a0, v0.t
170 ; RV32-NEXT:    vor.vv v8, v9, v10
171 ; RV32-NEXT:    vor.vv v8, v8, v11
172 ; RV32-NEXT:    ret
174 ; RV64-LABEL: vwop_vscale_sext_i1i32_multiple_users:
175 ; RV64:       # %bb.0:
176 ; RV64-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
177 ; RV64-NEXT:    vlm.v v8, (a0)
178 ; RV64-NEXT:    vlm.v v9, (a1)
179 ; RV64-NEXT:    vlm.v v10, (a2)
180 ; RV64-NEXT:    vmv.v.i v11, 0
181 ; RV64-NEXT:    vmv.v.v v0, v8
182 ; RV64-NEXT:    vmerge.vim v12, v11, -1, v0
183 ; RV64-NEXT:    vmv.v.v v0, v9
184 ; RV64-NEXT:    vmerge.vim v9, v11, -1, v0
185 ; RV64-NEXT:    vmv.v.v v0, v10
186 ; RV64-NEXT:    vmerge.vim v10, v11, -1, v0
187 ; RV64-NEXT:    vmul.vv v9, v12, v9
188 ; RV64-NEXT:    vmv.v.v v0, v8
189 ; RV64-NEXT:    vmerge.vim v8, v11, 1, v0
190 ; RV64-NEXT:    vsub.vv v8, v10, v8
191 ; RV64-NEXT:    vsub.vv v10, v12, v10
192 ; RV64-NEXT:    vor.vv v8, v9, v8
193 ; RV64-NEXT:    vor.vv v8, v8, v10
194 ; RV64-NEXT:    ret
195   %a = load <vscale x 2 x i1>, ptr %x
196   %b = load <vscale x 2 x i1>, ptr %y
197   %b2 = load <vscale x 2 x i1>, ptr %z
198   %c = sext <vscale x 2 x i1> %a to <vscale x 2 x i32>
199   %d = sext <vscale x 2 x i1> %b to <vscale x 2 x i32>
200   %d2 = sext <vscale x 2 x i1> %b2 to <vscale x 2 x i32>
201   %e = mul <vscale x 2 x i32> %c, %d
202   %f = add <vscale x 2 x i32> %c, %d2
203   %g = sub <vscale x 2 x i32> %c, %d2
204   %h = or <vscale x 2 x i32> %e, %f
205   %i = or <vscale x 2 x i32> %h, %g
206   ret <vscale x 2 x i32> %i
209 define <vscale x 2 x i8> @vwop_vscale_sext_i1i8_multiple_users(ptr %x, ptr %y, ptr %z) {
210 ; NO_FOLDING-LABEL: vwop_vscale_sext_i1i8_multiple_users:
211 ; NO_FOLDING:       # %bb.0:
212 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
213 ; NO_FOLDING-NEXT:    vlm.v v8, (a0)
214 ; NO_FOLDING-NEXT:    vlm.v v9, (a1)
215 ; NO_FOLDING-NEXT:    vlm.v v10, (a2)
216 ; NO_FOLDING-NEXT:    vmv.v.i v11, 0
217 ; NO_FOLDING-NEXT:    vmv1r.v v0, v8
218 ; NO_FOLDING-NEXT:    vmerge.vim v12, v11, -1, v0
219 ; NO_FOLDING-NEXT:    vmv1r.v v0, v9
220 ; NO_FOLDING-NEXT:    vmerge.vim v9, v11, -1, v0
221 ; NO_FOLDING-NEXT:    vmv1r.v v0, v10
222 ; NO_FOLDING-NEXT:    vmerge.vim v10, v11, -1, v0
223 ; NO_FOLDING-NEXT:    vmul.vv v9, v12, v9
224 ; NO_FOLDING-NEXT:    vmv1r.v v0, v8
225 ; NO_FOLDING-NEXT:    vmerge.vim v8, v11, 1, v0
226 ; NO_FOLDING-NEXT:    vsub.vv v8, v10, v8
227 ; NO_FOLDING-NEXT:    vsub.vv v10, v12, v10
228 ; NO_FOLDING-NEXT:    vor.vv v8, v9, v8
229 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
230 ; NO_FOLDING-NEXT:    ret
232 ; FOLDING-LABEL: vwop_vscale_sext_i1i8_multiple_users:
233 ; FOLDING:       # %bb.0:
234 ; FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
235 ; FOLDING-NEXT:    vlm.v v8, (a0)
236 ; FOLDING-NEXT:    vlm.v v9, (a1)
237 ; FOLDING-NEXT:    vlm.v v10, (a2)
238 ; FOLDING-NEXT:    vmv.v.i v11, 0
239 ; FOLDING-NEXT:    vmv1r.v v0, v8
240 ; FOLDING-NEXT:    vmerge.vim v12, v11, -1, v0
241 ; FOLDING-NEXT:    vmv1r.v v0, v9
242 ; FOLDING-NEXT:    vmerge.vim v9, v11, -1, v0
243 ; FOLDING-NEXT:    vmv1r.v v0, v10
244 ; FOLDING-NEXT:    vmerge.vim v10, v11, -1, v0
245 ; FOLDING-NEXT:    vmul.vv v9, v12, v9
246 ; FOLDING-NEXT:    vmv1r.v v0, v8
247 ; FOLDING-NEXT:    vmerge.vim v8, v11, 1, v0
248 ; FOLDING-NEXT:    vsub.vv v8, v10, v8
249 ; FOLDING-NEXT:    vsub.vv v10, v12, v10
250 ; FOLDING-NEXT:    vor.vv v8, v9, v8
251 ; FOLDING-NEXT:    vor.vv v8, v8, v10
252 ; FOLDING-NEXT:    ret
253   %a = load <vscale x 2 x i1>, ptr %x
254   %b = load <vscale x 2 x i1>, ptr %y
255   %b2 = load <vscale x 2 x i1>, ptr %z
256   %c = sext <vscale x 2 x i1> %a to <vscale x 2 x i8>
257   %d = sext <vscale x 2 x i1> %b to <vscale x 2 x i8>
258   %d2 = sext <vscale x 2 x i1> %b2 to <vscale x 2 x i8>
259   %e = mul <vscale x 2 x i8> %c, %d
260   %f = add <vscale x 2 x i8> %c, %d2
261   %g = sub <vscale x 2 x i8> %c, %d2
262   %h = or <vscale x 2 x i8> %e, %f
263   %i = or <vscale x 2 x i8> %h, %g
264   ret <vscale x 2 x i8> %i
267 define <vscale x 2 x i32> @vwop_vscale_sext_i8i32_multiple_users(ptr %x, ptr %y, ptr %z) {
268 ; NO_FOLDING-LABEL: vwop_vscale_sext_i8i32_multiple_users:
269 ; NO_FOLDING:       # %bb.0:
270 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
271 ; NO_FOLDING-NEXT:    vle8.v v8, (a0)
272 ; NO_FOLDING-NEXT:    vle8.v v9, (a1)
273 ; NO_FOLDING-NEXT:    vle8.v v10, (a2)
274 ; NO_FOLDING-NEXT:    vsext.vf4 v11, v8
275 ; NO_FOLDING-NEXT:    vsext.vf4 v8, v9
276 ; NO_FOLDING-NEXT:    vsext.vf4 v9, v10
277 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
278 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
279 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
280 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
281 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
282 ; NO_FOLDING-NEXT:    ret
284 ; FOLDING-LABEL: vwop_vscale_sext_i8i32_multiple_users:
285 ; FOLDING:       # %bb.0:
286 ; FOLDING-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
287 ; FOLDING-NEXT:    vle8.v v8, (a0)
288 ; FOLDING-NEXT:    vle8.v v9, (a1)
289 ; FOLDING-NEXT:    vle8.v v10, (a2)
290 ; FOLDING-NEXT:    vsext.vf4 v11, v8
291 ; FOLDING-NEXT:    vsext.vf4 v8, v9
292 ; FOLDING-NEXT:    vsext.vf4 v9, v10
293 ; FOLDING-NEXT:    vmul.vv v8, v11, v8
294 ; FOLDING-NEXT:    vadd.vv v10, v11, v9
295 ; FOLDING-NEXT:    vsub.vv v9, v11, v9
296 ; FOLDING-NEXT:    vor.vv v8, v8, v10
297 ; FOLDING-NEXT:    vor.vv v8, v8, v9
298 ; FOLDING-NEXT:    ret
299   %a = load <vscale x 2 x i8>, ptr %x
300   %b = load <vscale x 2 x i8>, ptr %y
301   %b2 = load <vscale x 2 x i8>, ptr %z
302   %c = sext <vscale x 2 x i8> %a to <vscale x 2 x i32>
303   %d = sext <vscale x 2 x i8> %b to <vscale x 2 x i32>
304   %d2 = sext <vscale x 2 x i8> %b2 to <vscale x 2 x i32>
305   %e = mul <vscale x 2 x i32> %c, %d
306   %f = add <vscale x 2 x i32> %c, %d2
307   %g = sub <vscale x 2 x i32> %c, %d2
308   %h = or <vscale x 2 x i32> %e, %f
309   %i = or <vscale x 2 x i32> %h, %g
310   ret <vscale x 2 x i32> %i
313 define <vscale x 2 x i16> @vwop_vscale_zext_i8i16_multiple_users(ptr %x, ptr %y, ptr %z) {
314 ; NO_FOLDING-LABEL: vwop_vscale_zext_i8i16_multiple_users:
315 ; NO_FOLDING:       # %bb.0:
316 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e16, mf2, ta, ma
317 ; NO_FOLDING-NEXT:    vle8.v v8, (a0)
318 ; NO_FOLDING-NEXT:    vle8.v v9, (a1)
319 ; NO_FOLDING-NEXT:    vle8.v v10, (a2)
320 ; NO_FOLDING-NEXT:    vzext.vf2 v11, v8
321 ; NO_FOLDING-NEXT:    vzext.vf2 v8, v9
322 ; NO_FOLDING-NEXT:    vzext.vf2 v9, v10
323 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
324 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
325 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
326 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
327 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
328 ; NO_FOLDING-NEXT:    ret
330 ; FOLDING-LABEL: vwop_vscale_zext_i8i16_multiple_users:
331 ; FOLDING:       # %bb.0:
332 ; FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
333 ; FOLDING-NEXT:    vle8.v v8, (a0)
334 ; FOLDING-NEXT:    vle8.v v9, (a1)
335 ; FOLDING-NEXT:    vle8.v v10, (a2)
336 ; FOLDING-NEXT:    vwmulu.vv v11, v8, v9
337 ; FOLDING-NEXT:    vwaddu.vv v9, v8, v10
338 ; FOLDING-NEXT:    vwsubu.vv v12, v8, v10
339 ; FOLDING-NEXT:    vsetvli zero, zero, e16, mf2, ta, ma
340 ; FOLDING-NEXT:    vor.vv v8, v11, v9
341 ; FOLDING-NEXT:    vor.vv v8, v8, v12
342 ; FOLDING-NEXT:    ret
343   %a = load <vscale x 2 x i8>, ptr %x
344   %b = load <vscale x 2 x i8>, ptr %y
345   %b2 = load <vscale x 2 x i8>, ptr %z
346   %c = zext <vscale x 2 x i8> %a to <vscale x 2 x i16>
347   %d = zext <vscale x 2 x i8> %b to <vscale x 2 x i16>
348   %d2 = zext <vscale x 2 x i8> %b2 to <vscale x 2 x i16>
349   %e = mul <vscale x 2 x i16> %c, %d
350   %f = add <vscale x 2 x i16> %c, %d2
351   %g = sub <vscale x 2 x i16> %c, %d2
352   %h = or <vscale x 2 x i16> %e, %f
353   %i = or <vscale x 2 x i16> %h, %g
354   ret <vscale x 2 x i16> %i
357 define <vscale x 2 x i32> @vwop_vscale_zext_i16i32_multiple_users(ptr %x, ptr %y, ptr %z) {
358 ; NO_FOLDING-LABEL: vwop_vscale_zext_i16i32_multiple_users:
359 ; NO_FOLDING:       # %bb.0:
360 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
361 ; NO_FOLDING-NEXT:    vle16.v v8, (a0)
362 ; NO_FOLDING-NEXT:    vle16.v v9, (a1)
363 ; NO_FOLDING-NEXT:    vle16.v v10, (a2)
364 ; NO_FOLDING-NEXT:    vzext.vf2 v11, v8
365 ; NO_FOLDING-NEXT:    vzext.vf2 v8, v9
366 ; NO_FOLDING-NEXT:    vzext.vf2 v9, v10
367 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
368 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
369 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
370 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
371 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
372 ; NO_FOLDING-NEXT:    ret
374 ; FOLDING-LABEL: vwop_vscale_zext_i16i32_multiple_users:
375 ; FOLDING:       # %bb.0:
376 ; FOLDING-NEXT:    vsetvli a3, zero, e16, mf2, ta, ma
377 ; FOLDING-NEXT:    vle16.v v8, (a0)
378 ; FOLDING-NEXT:    vle16.v v9, (a1)
379 ; FOLDING-NEXT:    vle16.v v10, (a2)
380 ; FOLDING-NEXT:    vwmulu.vv v11, v8, v9
381 ; FOLDING-NEXT:    vwaddu.vv v9, v8, v10
382 ; FOLDING-NEXT:    vwsubu.vv v12, v8, v10
383 ; FOLDING-NEXT:    vsetvli zero, zero, e32, m1, ta, ma
384 ; FOLDING-NEXT:    vor.vv v8, v11, v9
385 ; FOLDING-NEXT:    vor.vv v8, v8, v12
386 ; FOLDING-NEXT:    ret
387   %a = load <vscale x 2 x i16>, ptr %x
388   %b = load <vscale x 2 x i16>, ptr %y
389   %b2 = load <vscale x 2 x i16>, ptr %z
390   %c = zext <vscale x 2 x i16> %a to <vscale x 2 x i32>
391   %d = zext <vscale x 2 x i16> %b to <vscale x 2 x i32>
392   %d2 = zext <vscale x 2 x i16> %b2 to <vscale x 2 x i32>
393   %e = mul <vscale x 2 x i32> %c, %d
394   %f = add <vscale x 2 x i32> %c, %d2
395   %g = sub <vscale x 2 x i32> %c, %d2
396   %h = or <vscale x 2 x i32> %e, %f
397   %i = or <vscale x 2 x i32> %h, %g
398   ret <vscale x 2 x i32> %i
401 define <vscale x 2 x i64> @vwop_vscale_zext_i32i64_multiple_users(ptr %x, ptr %y, ptr %z) {
402 ; NO_FOLDING-LABEL: vwop_vscale_zext_i32i64_multiple_users:
403 ; NO_FOLDING:       # %bb.0:
404 ; NO_FOLDING-NEXT:    vl1re32.v v8, (a0)
405 ; NO_FOLDING-NEXT:    vl1re32.v v9, (a1)
406 ; NO_FOLDING-NEXT:    vl1re32.v v10, (a2)
407 ; NO_FOLDING-NEXT:    vsetvli a0, zero, e64, m2, ta, ma
408 ; NO_FOLDING-NEXT:    vzext.vf2 v12, v8
409 ; NO_FOLDING-NEXT:    vzext.vf2 v14, v9
410 ; NO_FOLDING-NEXT:    vzext.vf2 v8, v10
411 ; NO_FOLDING-NEXT:    vmul.vv v10, v12, v14
412 ; NO_FOLDING-NEXT:    vadd.vv v14, v12, v8
413 ; NO_FOLDING-NEXT:    vsub.vv v8, v12, v8
414 ; NO_FOLDING-NEXT:    vor.vv v10, v10, v14
415 ; NO_FOLDING-NEXT:    vor.vv v8, v10, v8
416 ; NO_FOLDING-NEXT:    ret
418 ; FOLDING-LABEL: vwop_vscale_zext_i32i64_multiple_users:
419 ; FOLDING:       # %bb.0:
420 ; FOLDING-NEXT:    vl1re32.v v8, (a0)
421 ; FOLDING-NEXT:    vl1re32.v v9, (a1)
422 ; FOLDING-NEXT:    vl1re32.v v10, (a2)
423 ; FOLDING-NEXT:    vsetvli a0, zero, e32, m1, ta, ma
424 ; FOLDING-NEXT:    vwmulu.vv v12, v8, v9
425 ; FOLDING-NEXT:    vwaddu.vv v14, v8, v10
426 ; FOLDING-NEXT:    vwsubu.vv v16, v8, v10
427 ; FOLDING-NEXT:    vsetvli zero, zero, e64, m2, ta, ma
428 ; FOLDING-NEXT:    vor.vv v8, v12, v14
429 ; FOLDING-NEXT:    vor.vv v8, v8, v16
430 ; FOLDING-NEXT:    ret
431   %a = load <vscale x 2 x i32>, ptr %x
432   %b = load <vscale x 2 x i32>, ptr %y
433   %b2 = load <vscale x 2 x i32>, ptr %z
434   %c = zext <vscale x 2 x i32> %a to <vscale x 2 x i64>
435   %d = zext <vscale x 2 x i32> %b to <vscale x 2 x i64>
436   %d2 = zext <vscale x 2 x i32> %b2 to <vscale x 2 x i64>
437   %e = mul <vscale x 2 x i64> %c, %d
438   %f = add <vscale x 2 x i64> %c, %d2
439   %g = sub <vscale x 2 x i64> %c, %d2
440   %h = or <vscale x 2 x i64> %e, %f
441   %i = or <vscale x 2 x i64> %h, %g
442   ret <vscale x 2 x i64> %i
445 define <vscale x 2 x i32> @vwop_vscale_zext_i1i32_multiple_users(ptr %x, ptr %y, ptr %z) {
446 ; RV32-LABEL: vwop_vscale_zext_i1i32_multiple_users:
447 ; RV32:       # %bb.0:
448 ; RV32-NEXT:    vsetvli a3, zero, e32, m1, ta, mu
449 ; RV32-NEXT:    vlm.v v0, (a0)
450 ; RV32-NEXT:    vlm.v v8, (a2)
451 ; RV32-NEXT:    vlm.v v9, (a1)
452 ; RV32-NEXT:    vmv.v.i v10, 0
453 ; RV32-NEXT:    vmerge.vim v11, v10, 1, v0
454 ; RV32-NEXT:    vmv.v.v v0, v8
455 ; RV32-NEXT:    vmerge.vim v8, v10, 1, v0
456 ; RV32-NEXT:    vadd.vv v10, v11, v8
457 ; RV32-NEXT:    vsub.vv v8, v11, v8
458 ; RV32-NEXT:    vmv.v.v v0, v9
459 ; RV32-NEXT:    vor.vv v10, v10, v11, v0.t
460 ; RV32-NEXT:    vor.vv v8, v10, v8
461 ; RV32-NEXT:    ret
463 ; RV64-LABEL: vwop_vscale_zext_i1i32_multiple_users:
464 ; RV64:       # %bb.0:
465 ; RV64-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
466 ; RV64-NEXT:    vlm.v v0, (a0)
467 ; RV64-NEXT:    vlm.v v8, (a1)
468 ; RV64-NEXT:    vlm.v v9, (a2)
469 ; RV64-NEXT:    vmv.v.i v10, 0
470 ; RV64-NEXT:    vmerge.vim v11, v10, 1, v0
471 ; RV64-NEXT:    vmv.v.v v0, v8
472 ; RV64-NEXT:    vmerge.vim v8, v10, 1, v0
473 ; RV64-NEXT:    vmv.v.v v0, v9
474 ; RV64-NEXT:    vmerge.vim v9, v10, 1, v0
475 ; RV64-NEXT:    vmul.vv v8, v11, v8
476 ; RV64-NEXT:    vadd.vv v10, v11, v9
477 ; RV64-NEXT:    vsub.vv v9, v11, v9
478 ; RV64-NEXT:    vor.vv v8, v8, v10
479 ; RV64-NEXT:    vor.vv v8, v8, v9
480 ; RV64-NEXT:    ret
481   %a = load <vscale x 2 x i1>, ptr %x
482   %b = load <vscale x 2 x i1>, ptr %y
483   %b2 = load <vscale x 2 x i1>, ptr %z
484   %c = zext <vscale x 2 x i1> %a to <vscale x 2 x i32>
485   %d = zext <vscale x 2 x i1> %b to <vscale x 2 x i32>
486   %d2 = zext <vscale x 2 x i1> %b2 to <vscale x 2 x i32>
487   %e = mul <vscale x 2 x i32> %c, %d
488   %f = add <vscale x 2 x i32> %c, %d2
489   %g = sub <vscale x 2 x i32> %c, %d2
490   %h = or <vscale x 2 x i32> %e, %f
491   %i = or <vscale x 2 x i32> %h, %g
492   ret <vscale x 2 x i32> %i
495 define <vscale x 2 x i8> @vwop_vscale_zext_i1i8_multiple_users(ptr %x, ptr %y, ptr %z) {
496 ; NO_FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:
497 ; NO_FOLDING:       # %bb.0:
498 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
499 ; NO_FOLDING-NEXT:    vlm.v v0, (a0)
500 ; NO_FOLDING-NEXT:    vlm.v v8, (a1)
501 ; NO_FOLDING-NEXT:    vlm.v v9, (a2)
502 ; NO_FOLDING-NEXT:    vmv.v.i v10, 0
503 ; NO_FOLDING-NEXT:    vmerge.vim v11, v10, 1, v0
504 ; NO_FOLDING-NEXT:    vmv1r.v v0, v8
505 ; NO_FOLDING-NEXT:    vmerge.vim v8, v10, 1, v0
506 ; NO_FOLDING-NEXT:    vmv1r.v v0, v9
507 ; NO_FOLDING-NEXT:    vmerge.vim v9, v10, 1, v0
508 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
509 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
510 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
511 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
512 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
513 ; NO_FOLDING-NEXT:    ret
515 ; FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:
516 ; FOLDING:       # %bb.0:
517 ; FOLDING-NEXT:    vsetvli a3, zero, e8, mf4, ta, ma
518 ; FOLDING-NEXT:    vlm.v v0, (a0)
519 ; FOLDING-NEXT:    vlm.v v8, (a1)
520 ; FOLDING-NEXT:    vlm.v v9, (a2)
521 ; FOLDING-NEXT:    vmv.v.i v10, 0
522 ; FOLDING-NEXT:    vmerge.vim v11, v10, 1, v0
523 ; FOLDING-NEXT:    vmv1r.v v0, v8
524 ; FOLDING-NEXT:    vmerge.vim v8, v10, 1, v0
525 ; FOLDING-NEXT:    vmv1r.v v0, v9
526 ; FOLDING-NEXT:    vmerge.vim v9, v10, 1, v0
527 ; FOLDING-NEXT:    vmul.vv v8, v11, v8
528 ; FOLDING-NEXT:    vadd.vv v10, v11, v9
529 ; FOLDING-NEXT:    vsub.vv v9, v11, v9
530 ; FOLDING-NEXT:    vor.vv v8, v8, v10
531 ; FOLDING-NEXT:    vor.vv v8, v8, v9
532 ; FOLDING-NEXT:    ret
533   %a = load <vscale x 2 x i1>, ptr %x
534   %b = load <vscale x 2 x i1>, ptr %y
535   %b2 = load <vscale x 2 x i1>, ptr %z
536   %c = zext <vscale x 2 x i1> %a to <vscale x 2 x i8>
537   %d = zext <vscale x 2 x i1> %b to <vscale x 2 x i8>
538   %d2 = zext <vscale x 2 x i1> %b2 to <vscale x 2 x i8>
539   %e = mul <vscale x 2 x i8> %c, %d
540   %f = add <vscale x 2 x i8> %c, %d2
541   %g = sub <vscale x 2 x i8> %c, %d2
542   %h = or <vscale x 2 x i8> %e, %f
543   %i = or <vscale x 2 x i8> %h, %g
544   ret <vscale x 2 x i8> %i
547 define <vscale x 2 x i32> @vwop_vscale_zext_i8i32_multiple_users(ptr %x, ptr %y, ptr %z) {
548 ; NO_FOLDING-LABEL: vwop_vscale_zext_i8i32_multiple_users:
549 ; NO_FOLDING:       # %bb.0:
550 ; NO_FOLDING-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
551 ; NO_FOLDING-NEXT:    vle8.v v8, (a0)
552 ; NO_FOLDING-NEXT:    vle8.v v9, (a1)
553 ; NO_FOLDING-NEXT:    vle8.v v10, (a2)
554 ; NO_FOLDING-NEXT:    vzext.vf4 v11, v8
555 ; NO_FOLDING-NEXT:    vzext.vf4 v8, v9
556 ; NO_FOLDING-NEXT:    vzext.vf4 v9, v10
557 ; NO_FOLDING-NEXT:    vmul.vv v8, v11, v8
558 ; NO_FOLDING-NEXT:    vadd.vv v10, v11, v9
559 ; NO_FOLDING-NEXT:    vsub.vv v9, v11, v9
560 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v10
561 ; NO_FOLDING-NEXT:    vor.vv v8, v8, v9
562 ; NO_FOLDING-NEXT:    ret
564 ; FOLDING-LABEL: vwop_vscale_zext_i8i32_multiple_users:
565 ; FOLDING:       # %bb.0:
566 ; FOLDING-NEXT:    vsetvli a3, zero, e32, m1, ta, ma
567 ; FOLDING-NEXT:    vle8.v v8, (a0)
568 ; FOLDING-NEXT:    vle8.v v9, (a1)
569 ; FOLDING-NEXT:    vle8.v v10, (a2)
570 ; FOLDING-NEXT:    vzext.vf4 v11, v8
571 ; FOLDING-NEXT:    vzext.vf4 v8, v9
572 ; FOLDING-NEXT:    vzext.vf4 v9, v10
573 ; FOLDING-NEXT:    vmul.vv v8, v11, v8
574 ; FOLDING-NEXT:    vadd.vv v10, v11, v9
575 ; FOLDING-NEXT:    vsub.vv v9, v11, v9
576 ; FOLDING-NEXT:    vor.vv v8, v8, v10
577 ; FOLDING-NEXT:    vor.vv v8, v8, v9
578 ; FOLDING-NEXT:    ret
579   %a = load <vscale x 2 x i8>, ptr %x
580   %b = load <vscale x 2 x i8>, ptr %y
581   %b2 = load <vscale x 2 x i8>, ptr %z
582   %c = zext <vscale x 2 x i8> %a to <vscale x 2 x i32>
583   %d = zext <vscale x 2 x i8> %b to <vscale x 2 x i32>
584   %d2 = zext <vscale x 2 x i8> %b2 to <vscale x 2 x i32>
585   %e = mul <vscale x 2 x i32> %c, %d
586   %f = add <vscale x 2 x i32> %c, %d2
587   %g = sub <vscale x 2 x i32> %c, %d2
588   %h = or <vscale x 2 x i32> %e, %f
589   %i = or <vscale x 2 x i32> %h, %g
590   ret <vscale x 2 x i32> %i