653 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=1 | FileCheck %s --check-prefixes=NO_FOLDING,RV323; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=2 | FileCheck %s --check-prefixes=NO_FOLDING,RV324; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=3 | FileCheck %s --check-prefixes=FOLDING,RV325; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=1 | FileCheck %s --check-prefixes=NO_FOLDING,RV646; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=2 | FileCheck %s --check-prefixes=NO_FOLDING,RV647; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=3 | FileCheck %s --check-prefixes=FOLDING,RV648; Check that the default value enables the web folding and9; that it is bigger than 3.10; RUN: llc -mtriple=riscv32 -mattr=+v -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=FOLDING,RV3211; RUN: llc -mtriple=riscv64 -mattr=+v -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=FOLDING,RV6412 13; Check that the scalable vector add/sub/mul operations are all promoted into their14; 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, because16; %c has 3 uses.17; see https://github.com/llvm/llvm-project/pull/7234018 19define <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, ma23; 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, v827; NO_FOLDING-NEXT: vsext.vf2 v8, v928; NO_FOLDING-NEXT: vsext.vf2 v9, v1029; NO_FOLDING-NEXT: vmul.vv v8, v11, v830; NO_FOLDING-NEXT: vadd.vv v10, v11, v931; NO_FOLDING-NEXT: vsub.vv v9, v11, v932; NO_FOLDING-NEXT: vor.vv v8, v8, v1033; NO_FOLDING-NEXT: vor.vv v8, v8, v934; NO_FOLDING-NEXT: ret35;36; FOLDING-LABEL: vwop_vscale_sext_i8i16_multiple_users:37; FOLDING: # %bb.0:38; FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, ma39; 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, v943; FOLDING-NEXT: vwadd.vv v9, v8, v1044; FOLDING-NEXT: vwsub.vv v12, v8, v1045; FOLDING-NEXT: vsetvli zero, zero, e16, mf2, ta, ma46; FOLDING-NEXT: vor.vv v8, v11, v947; FOLDING-NEXT: vor.vv v8, v8, v1248; FOLDING-NEXT: ret49 %a = load <vscale x 2 x i8>, ptr %x50 %b = load <vscale x 2 x i8>, ptr %y51 %b2 = load <vscale x 2 x i8>, ptr %z52 %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, %d56 %f = add <vscale x 2 x i16> %c, %d257 %g = sub <vscale x 2 x i16> %c, %d258 %h = or <vscale x 2 x i16> %e, %f59 %i = or <vscale x 2 x i16> %h, %g60 ret <vscale x 2 x i16> %i61}62 63define <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, ma67; 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, v871; NO_FOLDING-NEXT: vsext.vf2 v8, v972; NO_FOLDING-NEXT: vsext.vf2 v9, v1073; NO_FOLDING-NEXT: vmul.vv v8, v11, v874; NO_FOLDING-NEXT: vadd.vv v10, v11, v975; NO_FOLDING-NEXT: vsub.vv v9, v11, v976; NO_FOLDING-NEXT: vor.vv v8, v8, v1077; NO_FOLDING-NEXT: vor.vv v8, v8, v978; NO_FOLDING-NEXT: ret79;80; FOLDING-LABEL: vwop_vscale_sext_i16i32_multiple_users:81; FOLDING: # %bb.0:82; FOLDING-NEXT: vsetvli a3, zero, e16, mf2, ta, ma83; 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, v987; FOLDING-NEXT: vwadd.vv v9, v8, v1088; FOLDING-NEXT: vwsub.vv v12, v8, v1089; FOLDING-NEXT: vsetvli zero, zero, e32, m1, ta, ma90; FOLDING-NEXT: vor.vv v8, v11, v991; FOLDING-NEXT: vor.vv v8, v8, v1292; FOLDING-NEXT: ret93 %a = load <vscale x 2 x i16>, ptr %x94 %b = load <vscale x 2 x i16>, ptr %y95 %b2 = load <vscale x 2 x i16>, ptr %z96 %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, %d100 %f = add <vscale x 2 x i32> %c, %d2101 %g = sub <vscale x 2 x i32> %c, %d2102 %h = or <vscale x 2 x i32> %e, %f103 %i = or <vscale x 2 x i32> %h, %g104 ret <vscale x 2 x i32> %i105}106 107define <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 v10, (a0)111; NO_FOLDING-NEXT: vl1re32.v v12, (a1)112; NO_FOLDING-NEXT: vl1re32.v v14, (a2)113; NO_FOLDING-NEXT: vsetvli a0, zero, e64, m2, ta, ma114; NO_FOLDING-NEXT: vsext.vf2 v8, v10115; NO_FOLDING-NEXT: vsext.vf2 v10, v12116; NO_FOLDING-NEXT: vsext.vf2 v12, v14117; NO_FOLDING-NEXT: vmul.vv v10, v8, v10118; NO_FOLDING-NEXT: vadd.vv v14, v8, v12119; NO_FOLDING-NEXT: vsub.vv v8, v8, v12120; NO_FOLDING-NEXT: vor.vv v10, v10, v14121; NO_FOLDING-NEXT: vor.vv v8, v10, v8122; NO_FOLDING-NEXT: ret123;124; FOLDING-LABEL: vwop_vscale_sext_i32i64_multiple_users:125; FOLDING: # %bb.0:126; FOLDING-NEXT: vl1re32.v v14, (a0)127; FOLDING-NEXT: vl1re32.v v10, (a1)128; FOLDING-NEXT: vl1re32.v v15, (a2)129; FOLDING-NEXT: vsetvli a0, zero, e32, m1, ta, ma130; FOLDING-NEXT: vwmul.vv v8, v14, v10131; FOLDING-NEXT: vwadd.vv v10, v14, v15132; FOLDING-NEXT: vwsub.vv v12, v14, v15133; FOLDING-NEXT: vsetvli zero, zero, e64, m2, ta, ma134; FOLDING-NEXT: vor.vv v8, v8, v10135; FOLDING-NEXT: vor.vv v8, v8, v12136; FOLDING-NEXT: ret137 %a = load <vscale x 2 x i32>, ptr %x138 %b = load <vscale x 2 x i32>, ptr %y139 %b2 = load <vscale x 2 x i32>, ptr %z140 %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, %d144 %f = add <vscale x 2 x i64> %c, %d2145 %g = sub <vscale x 2 x i64> %c, %d2146 %h = or <vscale x 2 x i64> %e, %f147 %i = or <vscale x 2 x i64> %h, %g148 ret <vscale x 2 x i64> %i149}150 151define <vscale x 2 x i32> @vwop_vscale_sext_i1i32_multiple_users(ptr %x, ptr %y, ptr %z) {152; NO_FOLDING-LABEL: vwop_vscale_sext_i1i32_multiple_users:153; NO_FOLDING: # %bb.0:154; NO_FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, mu155; NO_FOLDING-NEXT: vlm.v v8, (a0)156; NO_FOLDING-NEXT: vmv.v.i v10, 0157; NO_FOLDING-NEXT: vmv.v.v v0, v8158; NO_FOLDING-NEXT: vmerge.vim v11, v10, -1, v0159; NO_FOLDING-NEXT: vlm.v v0, (a1)160; NO_FOLDING-NEXT: vlm.v v9, (a2)161; NO_FOLDING-NEXT: vmerge.vim v12, v10, -1, v0162; NO_FOLDING-NEXT: vmv.v.v v0, v9163; NO_FOLDING-NEXT: vmerge.vim v9, v10, -1, v0164; NO_FOLDING-NEXT: vmul.vv v10, v11, v12165; NO_FOLDING-NEXT: vsub.vv v11, v11, v9166; NO_FOLDING-NEXT: vmv.v.v v0, v8167; NO_FOLDING-NEXT: vadd.vi v9, v9, -1, v0.t168; NO_FOLDING-NEXT: vor.vv v8, v10, v9169; NO_FOLDING-NEXT: vor.vv v8, v8, v11170; NO_FOLDING-NEXT: ret171;172; FOLDING-LABEL: vwop_vscale_sext_i1i32_multiple_users:173; FOLDING: # %bb.0:174; FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, mu175; FOLDING-NEXT: vlm.v v8, (a0)176; FOLDING-NEXT: vmv.v.i v10, 0177; FOLDING-NEXT: vmv.v.v v0, v8178; FOLDING-NEXT: vmerge.vim v11, v10, -1, v0179; FOLDING-NEXT: vlm.v v0, (a1)180; FOLDING-NEXT: vlm.v v9, (a2)181; FOLDING-NEXT: vmerge.vim v12, v10, -1, v0182; FOLDING-NEXT: vmv.v.v v0, v9183; FOLDING-NEXT: vmerge.vim v9, v10, -1, v0184; FOLDING-NEXT: vmul.vv v10, v11, v12185; FOLDING-NEXT: vsub.vv v11, v11, v9186; FOLDING-NEXT: vmv.v.v v0, v8187; FOLDING-NEXT: vadd.vi v9, v9, -1, v0.t188; FOLDING-NEXT: vor.vv v8, v10, v9189; FOLDING-NEXT: vor.vv v8, v8, v11190; FOLDING-NEXT: ret191 %a = load <vscale x 2 x i1>, ptr %x192 %b = load <vscale x 2 x i1>, ptr %y193 %b2 = load <vscale x 2 x i1>, ptr %z194 %c = sext <vscale x 2 x i1> %a to <vscale x 2 x i32>195 %d = sext <vscale x 2 x i1> %b to <vscale x 2 x i32>196 %d2 = sext <vscale x 2 x i1> %b2 to <vscale x 2 x i32>197 %e = mul <vscale x 2 x i32> %c, %d198 %f = add <vscale x 2 x i32> %c, %d2199 %g = sub <vscale x 2 x i32> %c, %d2200 %h = or <vscale x 2 x i32> %e, %f201 %i = or <vscale x 2 x i32> %h, %g202 ret <vscale x 2 x i32> %i203}204 205define <vscale x 2 x i8> @vwop_vscale_sext_i1i8_multiple_users(ptr %x, ptr %y, ptr %z) {206; NO_FOLDING-LABEL: vwop_vscale_sext_i1i8_multiple_users:207; NO_FOLDING: # %bb.0:208; NO_FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, mu209; NO_FOLDING-NEXT: vlm.v v8, (a0)210; NO_FOLDING-NEXT: vmv.v.i v10, 0211; NO_FOLDING-NEXT: vmv1r.v v0, v8212; NO_FOLDING-NEXT: vmerge.vim v11, v10, -1, v0213; NO_FOLDING-NEXT: vlm.v v0, (a1)214; NO_FOLDING-NEXT: vlm.v v9, (a2)215; NO_FOLDING-NEXT: vmerge.vim v12, v10, -1, v0216; NO_FOLDING-NEXT: vmv1r.v v0, v9217; NO_FOLDING-NEXT: vmerge.vim v9, v10, -1, v0218; NO_FOLDING-NEXT: vmul.vv v10, v11, v12219; NO_FOLDING-NEXT: vsub.vv v11, v11, v9220; NO_FOLDING-NEXT: vmv1r.v v0, v8221; NO_FOLDING-NEXT: vadd.vi v9, v9, -1, v0.t222; NO_FOLDING-NEXT: vor.vv v8, v10, v9223; NO_FOLDING-NEXT: vor.vv v8, v8, v11224; NO_FOLDING-NEXT: ret225;226; FOLDING-LABEL: vwop_vscale_sext_i1i8_multiple_users:227; FOLDING: # %bb.0:228; FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, mu229; FOLDING-NEXT: vlm.v v8, (a0)230; FOLDING-NEXT: vmv.v.i v10, 0231; FOLDING-NEXT: vmv1r.v v0, v8232; FOLDING-NEXT: vmerge.vim v11, v10, -1, v0233; FOLDING-NEXT: vlm.v v0, (a1)234; FOLDING-NEXT: vlm.v v9, (a2)235; FOLDING-NEXT: vmerge.vim v12, v10, -1, v0236; FOLDING-NEXT: vmv1r.v v0, v9237; FOLDING-NEXT: vmerge.vim v9, v10, -1, v0238; FOLDING-NEXT: vmul.vv v10, v11, v12239; FOLDING-NEXT: vsub.vv v11, v11, v9240; FOLDING-NEXT: vmv1r.v v0, v8241; FOLDING-NEXT: vadd.vi v9, v9, -1, v0.t242; FOLDING-NEXT: vor.vv v8, v10, v9243; FOLDING-NEXT: vor.vv v8, v8, v11244; FOLDING-NEXT: ret245 %a = load <vscale x 2 x i1>, ptr %x246 %b = load <vscale x 2 x i1>, ptr %y247 %b2 = load <vscale x 2 x i1>, ptr %z248 %c = sext <vscale x 2 x i1> %a to <vscale x 2 x i8>249 %d = sext <vscale x 2 x i1> %b to <vscale x 2 x i8>250 %d2 = sext <vscale x 2 x i1> %b2 to <vscale x 2 x i8>251 %e = mul <vscale x 2 x i8> %c, %d252 %f = add <vscale x 2 x i8> %c, %d2253 %g = sub <vscale x 2 x i8> %c, %d2254 %h = or <vscale x 2 x i8> %e, %f255 %i = or <vscale x 2 x i8> %h, %g256 ret <vscale x 2 x i8> %i257}258 259define <vscale x 2 x i32> @vwop_vscale_sext_i8i32_multiple_users(ptr %x, ptr %y, ptr %z) {260; NO_FOLDING-LABEL: vwop_vscale_sext_i8i32_multiple_users:261; NO_FOLDING: # %bb.0:262; NO_FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, ma263; NO_FOLDING-NEXT: vle8.v v8, (a0)264; NO_FOLDING-NEXT: vle8.v v9, (a1)265; NO_FOLDING-NEXT: vle8.v v10, (a2)266; NO_FOLDING-NEXT: vsext.vf4 v11, v8267; NO_FOLDING-NEXT: vsext.vf4 v8, v9268; NO_FOLDING-NEXT: vsext.vf4 v9, v10269; NO_FOLDING-NEXT: vmul.vv v8, v11, v8270; NO_FOLDING-NEXT: vadd.vv v10, v11, v9271; NO_FOLDING-NEXT: vsub.vv v9, v11, v9272; NO_FOLDING-NEXT: vor.vv v8, v8, v10273; NO_FOLDING-NEXT: vor.vv v8, v8, v9274; NO_FOLDING-NEXT: ret275;276; FOLDING-LABEL: vwop_vscale_sext_i8i32_multiple_users:277; FOLDING: # %bb.0:278; FOLDING-NEXT: vsetvli a3, zero, e16, mf2, ta, ma279; FOLDING-NEXT: vle8.v v8, (a0)280; FOLDING-NEXT: vle8.v v9, (a1)281; FOLDING-NEXT: vle8.v v10, (a2)282; FOLDING-NEXT: vsext.vf2 v11, v8283; FOLDING-NEXT: vsext.vf2 v8, v9284; FOLDING-NEXT: vsext.vf2 v9, v10285; FOLDING-NEXT: vwmul.vv v10, v11, v8286; FOLDING-NEXT: vwadd.vv v8, v11, v9287; FOLDING-NEXT: vwsub.vv v12, v11, v9288; FOLDING-NEXT: vsetvli zero, zero, e32, m1, ta, ma289; FOLDING-NEXT: vor.vv v8, v10, v8290; FOLDING-NEXT: vor.vv v8, v8, v12291; FOLDING-NEXT: ret292 %a = load <vscale x 2 x i8>, ptr %x293 %b = load <vscale x 2 x i8>, ptr %y294 %b2 = load <vscale x 2 x i8>, ptr %z295 %c = sext <vscale x 2 x i8> %a to <vscale x 2 x i32>296 %d = sext <vscale x 2 x i8> %b to <vscale x 2 x i32>297 %d2 = sext <vscale x 2 x i8> %b2 to <vscale x 2 x i32>298 %e = mul <vscale x 2 x i32> %c, %d299 %f = add <vscale x 2 x i32> %c, %d2300 %g = sub <vscale x 2 x i32> %c, %d2301 %h = or <vscale x 2 x i32> %e, %f302 %i = or <vscale x 2 x i32> %h, %g303 ret <vscale x 2 x i32> %i304}305 306define <vscale x 2 x i16> @vwop_vscale_zext_i8i16_multiple_users(ptr %x, ptr %y, ptr %z) {307; NO_FOLDING-LABEL: vwop_vscale_zext_i8i16_multiple_users:308; NO_FOLDING: # %bb.0:309; NO_FOLDING-NEXT: vsetvli a3, zero, e16, mf2, ta, ma310; NO_FOLDING-NEXT: vle8.v v8, (a0)311; NO_FOLDING-NEXT: vle8.v v9, (a1)312; NO_FOLDING-NEXT: vle8.v v10, (a2)313; NO_FOLDING-NEXT: vzext.vf2 v11, v8314; NO_FOLDING-NEXT: vzext.vf2 v8, v9315; NO_FOLDING-NEXT: vzext.vf2 v9, v10316; NO_FOLDING-NEXT: vmul.vv v8, v11, v8317; NO_FOLDING-NEXT: vadd.vv v10, v11, v9318; NO_FOLDING-NEXT: vsub.vv v9, v11, v9319; NO_FOLDING-NEXT: vor.vv v8, v8, v10320; NO_FOLDING-NEXT: vor.vv v8, v8, v9321; NO_FOLDING-NEXT: ret322;323; FOLDING-LABEL: vwop_vscale_zext_i8i16_multiple_users:324; FOLDING: # %bb.0:325; FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, ma326; FOLDING-NEXT: vle8.v v8, (a0)327; FOLDING-NEXT: vle8.v v9, (a1)328; FOLDING-NEXT: vle8.v v10, (a2)329; FOLDING-NEXT: vwmulu.vv v11, v8, v9330; FOLDING-NEXT: vwaddu.vv v9, v8, v10331; FOLDING-NEXT: vwsubu.vv v12, v8, v10332; FOLDING-NEXT: vsetvli zero, zero, e16, mf2, ta, ma333; FOLDING-NEXT: vor.vv v8, v11, v9334; FOLDING-NEXT: vor.vv v8, v8, v12335; FOLDING-NEXT: ret336 %a = load <vscale x 2 x i8>, ptr %x337 %b = load <vscale x 2 x i8>, ptr %y338 %b2 = load <vscale x 2 x i8>, ptr %z339 %c = zext <vscale x 2 x i8> %a to <vscale x 2 x i16>340 %d = zext <vscale x 2 x i8> %b to <vscale x 2 x i16>341 %d2 = zext <vscale x 2 x i8> %b2 to <vscale x 2 x i16>342 %e = mul <vscale x 2 x i16> %c, %d343 %f = add <vscale x 2 x i16> %c, %d2344 %g = sub <vscale x 2 x i16> %c, %d2345 %h = or <vscale x 2 x i16> %e, %f346 %i = or <vscale x 2 x i16> %h, %g347 ret <vscale x 2 x i16> %i348}349 350define <vscale x 2 x i32> @vwop_vscale_zext_i16i32_multiple_users(ptr %x, ptr %y, ptr %z) {351; NO_FOLDING-LABEL: vwop_vscale_zext_i16i32_multiple_users:352; NO_FOLDING: # %bb.0:353; NO_FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, ma354; NO_FOLDING-NEXT: vle16.v v8, (a0)355; NO_FOLDING-NEXT: vle16.v v9, (a1)356; NO_FOLDING-NEXT: vle16.v v10, (a2)357; NO_FOLDING-NEXT: vzext.vf2 v11, v8358; NO_FOLDING-NEXT: vzext.vf2 v8, v9359; NO_FOLDING-NEXT: vzext.vf2 v9, v10360; NO_FOLDING-NEXT: vmul.vv v8, v11, v8361; NO_FOLDING-NEXT: vadd.vv v10, v11, v9362; NO_FOLDING-NEXT: vsub.vv v9, v11, v9363; NO_FOLDING-NEXT: vor.vv v8, v8, v10364; NO_FOLDING-NEXT: vor.vv v8, v8, v9365; NO_FOLDING-NEXT: ret366;367; FOLDING-LABEL: vwop_vscale_zext_i16i32_multiple_users:368; FOLDING: # %bb.0:369; FOLDING-NEXT: vsetvli a3, zero, e16, mf2, ta, ma370; FOLDING-NEXT: vle16.v v8, (a0)371; FOLDING-NEXT: vle16.v v9, (a1)372; FOLDING-NEXT: vle16.v v10, (a2)373; FOLDING-NEXT: vwmulu.vv v11, v8, v9374; FOLDING-NEXT: vwaddu.vv v9, v8, v10375; FOLDING-NEXT: vwsubu.vv v12, v8, v10376; FOLDING-NEXT: vsetvli zero, zero, e32, m1, ta, ma377; FOLDING-NEXT: vor.vv v8, v11, v9378; FOLDING-NEXT: vor.vv v8, v8, v12379; FOLDING-NEXT: ret380 %a = load <vscale x 2 x i16>, ptr %x381 %b = load <vscale x 2 x i16>, ptr %y382 %b2 = load <vscale x 2 x i16>, ptr %z383 %c = zext <vscale x 2 x i16> %a to <vscale x 2 x i32>384 %d = zext <vscale x 2 x i16> %b to <vscale x 2 x i32>385 %d2 = zext <vscale x 2 x i16> %b2 to <vscale x 2 x i32>386 %e = mul <vscale x 2 x i32> %c, %d387 %f = add <vscale x 2 x i32> %c, %d2388 %g = sub <vscale x 2 x i32> %c, %d2389 %h = or <vscale x 2 x i32> %e, %f390 %i = or <vscale x 2 x i32> %h, %g391 ret <vscale x 2 x i32> %i392}393 394define <vscale x 2 x i64> @vwop_vscale_zext_i32i64_multiple_users(ptr %x, ptr %y, ptr %z) {395; NO_FOLDING-LABEL: vwop_vscale_zext_i32i64_multiple_users:396; NO_FOLDING: # %bb.0:397; NO_FOLDING-NEXT: vl1re32.v v10, (a0)398; NO_FOLDING-NEXT: vl1re32.v v12, (a1)399; NO_FOLDING-NEXT: vl1re32.v v14, (a2)400; NO_FOLDING-NEXT: vsetvli a0, zero, e64, m2, ta, ma401; NO_FOLDING-NEXT: vzext.vf2 v8, v10402; NO_FOLDING-NEXT: vzext.vf2 v10, v12403; NO_FOLDING-NEXT: vzext.vf2 v12, v14404; NO_FOLDING-NEXT: vmul.vv v10, v8, v10405; NO_FOLDING-NEXT: vadd.vv v14, v8, v12406; NO_FOLDING-NEXT: vsub.vv v8, v8, v12407; NO_FOLDING-NEXT: vor.vv v10, v10, v14408; NO_FOLDING-NEXT: vor.vv v8, v10, v8409; NO_FOLDING-NEXT: ret410;411; FOLDING-LABEL: vwop_vscale_zext_i32i64_multiple_users:412; FOLDING: # %bb.0:413; FOLDING-NEXT: vl1re32.v v14, (a0)414; FOLDING-NEXT: vl1re32.v v10, (a1)415; FOLDING-NEXT: vl1re32.v v15, (a2)416; FOLDING-NEXT: vsetvli a0, zero, e32, m1, ta, ma417; FOLDING-NEXT: vwmulu.vv v8, v14, v10418; FOLDING-NEXT: vwaddu.vv v10, v14, v15419; FOLDING-NEXT: vwsubu.vv v12, v14, v15420; FOLDING-NEXT: vsetvli zero, zero, e64, m2, ta, ma421; FOLDING-NEXT: vor.vv v8, v8, v10422; FOLDING-NEXT: vor.vv v8, v8, v12423; FOLDING-NEXT: ret424 %a = load <vscale x 2 x i32>, ptr %x425 %b = load <vscale x 2 x i32>, ptr %y426 %b2 = load <vscale x 2 x i32>, ptr %z427 %c = zext <vscale x 2 x i32> %a to <vscale x 2 x i64>428 %d = zext <vscale x 2 x i32> %b to <vscale x 2 x i64>429 %d2 = zext <vscale x 2 x i32> %b2 to <vscale x 2 x i64>430 %e = mul <vscale x 2 x i64> %c, %d431 %f = add <vscale x 2 x i64> %c, %d2432 %g = sub <vscale x 2 x i64> %c, %d2433 %h = or <vscale x 2 x i64> %e, %f434 %i = or <vscale x 2 x i64> %h, %g435 ret <vscale x 2 x i64> %i436}437 438define <vscale x 2 x i32> @vwop_vscale_zext_i1i32_multiple_users(ptr %x, ptr %y, ptr %z) {439; NO_FOLDING-LABEL: vwop_vscale_zext_i1i32_multiple_users:440; NO_FOLDING: # %bb.0:441; NO_FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, mu442; NO_FOLDING-NEXT: vlm.v v0, (a0)443; NO_FOLDING-NEXT: vmv.v.i v8, 0444; NO_FOLDING-NEXT: vmerge.vim v9, v8, 1, v0445; NO_FOLDING-NEXT: vlm.v v0, (a2)446; NO_FOLDING-NEXT: vmerge.vim v8, v8, 1, v0447; NO_FOLDING-NEXT: vlm.v v0, (a1)448; NO_FOLDING-NEXT: vadd.vv v10, v9, v8449; NO_FOLDING-NEXT: vsub.vv v8, v9, v8450; NO_FOLDING-NEXT: vor.vv v10, v10, v9, v0.t451; NO_FOLDING-NEXT: vor.vv v8, v10, v8452; NO_FOLDING-NEXT: ret453;454; FOLDING-LABEL: vwop_vscale_zext_i1i32_multiple_users:455; FOLDING: # %bb.0:456; FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, mu457; FOLDING-NEXT: vlm.v v0, (a0)458; FOLDING-NEXT: vmv.v.i v8, 0459; FOLDING-NEXT: vmerge.vim v9, v8, 1, v0460; FOLDING-NEXT: vlm.v v0, (a2)461; FOLDING-NEXT: vmerge.vim v8, v8, 1, v0462; FOLDING-NEXT: vlm.v v0, (a1)463; FOLDING-NEXT: vadd.vv v10, v9, v8464; FOLDING-NEXT: vsub.vv v8, v9, v8465; FOLDING-NEXT: vor.vv v10, v10, v9, v0.t466; FOLDING-NEXT: vor.vv v8, v10, v8467; FOLDING-NEXT: ret468 %a = load <vscale x 2 x i1>, ptr %x469 %b = load <vscale x 2 x i1>, ptr %y470 %b2 = load <vscale x 2 x i1>, ptr %z471 %c = zext <vscale x 2 x i1> %a to <vscale x 2 x i32>472 %d = zext <vscale x 2 x i1> %b to <vscale x 2 x i32>473 %d2 = zext <vscale x 2 x i1> %b2 to <vscale x 2 x i32>474 %e = mul <vscale x 2 x i32> %c, %d475 %f = add <vscale x 2 x i32> %c, %d2476 %g = sub <vscale x 2 x i32> %c, %d2477 %h = or <vscale x 2 x i32> %e, %f478 %i = or <vscale x 2 x i32> %h, %g479 ret <vscale x 2 x i32> %i480}481 482define <vscale x 2 x i8> @vwop_vscale_zext_i1i8_multiple_users(ptr %x, ptr %y, ptr %z) {483; NO_FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:484; NO_FOLDING: # %bb.0:485; NO_FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, mu486; NO_FOLDING-NEXT: vlm.v v0, (a0)487; NO_FOLDING-NEXT: vmv.v.i v8, 0488; NO_FOLDING-NEXT: vmerge.vim v9, v8, 1, v0489; NO_FOLDING-NEXT: vlm.v v0, (a2)490; NO_FOLDING-NEXT: vmerge.vim v8, v8, 1, v0491; NO_FOLDING-NEXT: vlm.v v0, (a1)492; NO_FOLDING-NEXT: vadd.vv v10, v9, v8493; NO_FOLDING-NEXT: vsub.vv v8, v9, v8494; NO_FOLDING-NEXT: vor.vv v10, v10, v9, v0.t495; NO_FOLDING-NEXT: vor.vv v8, v10, v8496; NO_FOLDING-NEXT: ret497;498; FOLDING-LABEL: vwop_vscale_zext_i1i8_multiple_users:499; FOLDING: # %bb.0:500; FOLDING-NEXT: vsetvli a3, zero, e8, mf4, ta, mu501; FOLDING-NEXT: vlm.v v0, (a0)502; FOLDING-NEXT: vmv.v.i v8, 0503; FOLDING-NEXT: vmerge.vim v9, v8, 1, v0504; FOLDING-NEXT: vlm.v v0, (a2)505; FOLDING-NEXT: vmerge.vim v8, v8, 1, v0506; FOLDING-NEXT: vlm.v v0, (a1)507; FOLDING-NEXT: vadd.vv v10, v9, v8508; FOLDING-NEXT: vsub.vv v8, v9, v8509; FOLDING-NEXT: vor.vv v10, v10, v9, v0.t510; FOLDING-NEXT: vor.vv v8, v10, v8511; FOLDING-NEXT: ret512 %a = load <vscale x 2 x i1>, ptr %x513 %b = load <vscale x 2 x i1>, ptr %y514 %b2 = load <vscale x 2 x i1>, ptr %z515 %c = zext <vscale x 2 x i1> %a to <vscale x 2 x i8>516 %d = zext <vscale x 2 x i1> %b to <vscale x 2 x i8>517 %d2 = zext <vscale x 2 x i1> %b2 to <vscale x 2 x i8>518 %e = mul <vscale x 2 x i8> %c, %d519 %f = add <vscale x 2 x i8> %c, %d2520 %g = sub <vscale x 2 x i8> %c, %d2521 %h = or <vscale x 2 x i8> %e, %f522 %i = or <vscale x 2 x i8> %h, %g523 ret <vscale x 2 x i8> %i524}525 526define <vscale x 2 x i32> @vwop_vscale_zext_i8i32_multiple_users(ptr %x, ptr %y, ptr %z) {527; NO_FOLDING-LABEL: vwop_vscale_zext_i8i32_multiple_users:528; NO_FOLDING: # %bb.0:529; NO_FOLDING-NEXT: vsetvli a3, zero, e32, m1, ta, ma530; NO_FOLDING-NEXT: vle8.v v8, (a0)531; NO_FOLDING-NEXT: vle8.v v9, (a1)532; NO_FOLDING-NEXT: vle8.v v10, (a2)533; NO_FOLDING-NEXT: vzext.vf4 v11, v8534; NO_FOLDING-NEXT: vzext.vf4 v8, v9535; NO_FOLDING-NEXT: vzext.vf4 v9, v10536; NO_FOLDING-NEXT: vmul.vv v8, v11, v8537; NO_FOLDING-NEXT: vadd.vv v10, v11, v9538; NO_FOLDING-NEXT: vsub.vv v9, v11, v9539; NO_FOLDING-NEXT: vor.vv v8, v8, v10540; NO_FOLDING-NEXT: vor.vv v8, v8, v9541; NO_FOLDING-NEXT: ret542;543; FOLDING-LABEL: vwop_vscale_zext_i8i32_multiple_users:544; FOLDING: # %bb.0:545; FOLDING-NEXT: vsetvli a3, zero, e16, mf2, ta, ma546; FOLDING-NEXT: vle8.v v8, (a0)547; FOLDING-NEXT: vle8.v v9, (a1)548; FOLDING-NEXT: vle8.v v10, (a2)549; FOLDING-NEXT: vzext.vf2 v11, v8550; FOLDING-NEXT: vzext.vf2 v8, v9551; FOLDING-NEXT: vzext.vf2 v9, v10552; FOLDING-NEXT: vwmulu.vv v10, v11, v8553; FOLDING-NEXT: vwaddu.vv v8, v11, v9554; FOLDING-NEXT: vwsubu.vv v12, v11, v9555; FOLDING-NEXT: vsetvli zero, zero, e32, m1, ta, ma556; FOLDING-NEXT: vor.vv v8, v10, v8557; FOLDING-NEXT: vor.vv v8, v8, v12558; FOLDING-NEXT: ret559 %a = load <vscale x 2 x i8>, ptr %x560 %b = load <vscale x 2 x i8>, ptr %y561 %b2 = load <vscale x 2 x i8>, ptr %z562 %c = zext <vscale x 2 x i8> %a to <vscale x 2 x i32>563 %d = zext <vscale x 2 x i8> %b to <vscale x 2 x i32>564 %d2 = zext <vscale x 2 x i8> %b2 to <vscale x 2 x i32>565 %e = mul <vscale x 2 x i32> %c, %d566 %f = add <vscale x 2 x i32> %c, %d2567 %g = sub <vscale x 2 x i32> %c, %d2568 %h = or <vscale x 2 x i32> %e, %f569 %i = or <vscale x 2 x i32> %h, %g570 ret <vscale x 2 x i32> %i571}572 573define <vscale x 4 x i32> @mismatched_extend_sub_add(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {574; FOLDING-LABEL: mismatched_extend_sub_add:575; FOLDING: # %bb.0:576; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma577; FOLDING-NEXT: vzext.vf2 v10, v8578; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma579; FOLDING-NEXT: vwsub.wv v12, v10, v9580; FOLDING-NEXT: vwadd.wv v10, v10, v9581; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma582; FOLDING-NEXT: vmul.vv v8, v12, v10583; FOLDING-NEXT: ret584 %a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>585 %b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>586 %c = sub <vscale x 4 x i32> %a, %b587 %d = add <vscale x 4 x i32> %a, %b588 %e = mul <vscale x 4 x i32> %c, %d589 ret <vscale x 4 x i32> %e590}591 592; FIXME: this should remove the vsext593define <vscale x 4 x i32> @mismatched_extend_sub_add_commuted(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {594; FOLDING-LABEL: mismatched_extend_sub_add_commuted:595; FOLDING: # %bb.0:596; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma597; FOLDING-NEXT: vzext.vf2 v10, v8598; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma599; FOLDING-NEXT: vwsub.wv v12, v10, v9600; FOLDING-NEXT: vwadd.wv v10, v10, v9601; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma602; FOLDING-NEXT: vmul.vv v8, v12, v10603; FOLDING-NEXT: ret604 %a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>605 %b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>606 %c = sub <vscale x 4 x i32> %a, %b607 %d = add <vscale x 4 x i32> %b, %a608 %e = mul <vscale x 4 x i32> %c, %d609 ret <vscale x 4 x i32> %e610}611 612define <vscale x 4 x i32> @mismatched_extend_add_sub(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {613; FOLDING-LABEL: mismatched_extend_add_sub:614; FOLDING: # %bb.0:615; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma616; FOLDING-NEXT: vzext.vf2 v10, v8617; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma618; FOLDING-NEXT: vwadd.wv v12, v10, v9619; FOLDING-NEXT: vwsub.wv v10, v10, v9620; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma621; FOLDING-NEXT: vmul.vv v8, v12, v10622; FOLDING-NEXT: ret623 %a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>624 %b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>625 %c = add <vscale x 4 x i32> %a, %b626 %d = sub <vscale x 4 x i32> %a, %b627 %e = mul <vscale x 4 x i32> %c, %d628 ret <vscale x 4 x i32> %e629}630 631define <vscale x 4 x i32> @mismatched_extend_add_sub_commuted(<vscale x 4 x i16> %x, <vscale x 4 x i16> %y) {632; FOLDING-LABEL: mismatched_extend_add_sub_commuted:633; FOLDING: # %bb.0:634; FOLDING-NEXT: vsetvli a0, zero, e32, m2, ta, ma635; FOLDING-NEXT: vzext.vf2 v10, v8636; FOLDING-NEXT: vsetvli zero, zero, e16, m1, ta, ma637; FOLDING-NEXT: vwadd.wv v12, v10, v9638; FOLDING-NEXT: vwsub.wv v10, v10, v9639; FOLDING-NEXT: vsetvli zero, zero, e32, m2, ta, ma640; FOLDING-NEXT: vmul.vv v8, v12, v10641; FOLDING-NEXT: ret642 %a = zext <vscale x 4 x i16> %x to <vscale x 4 x i32>643 %b = sext <vscale x 4 x i16> %y to <vscale x 4 x i32>644 %c = add <vscale x 4 x i32> %a, %b645 %d = sub <vscale x 4 x i32> %a, %b646 %e = mul <vscale x 4 x i32> %c, %d647 ret <vscale x 4 x i32> %e648}649 650;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:651; RV32: {{.*}}652; RV64: {{.*}}653