brintos

brintos / llvm-project-archived public Read only

0
0
Text · 26.0 KiB · 0341862 Raw
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