239 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+f,+d -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=1 | FileCheck %s --check-prefixes=NO_FOLDING,NO_FOLDING13; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+f,+d -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=2 | FileCheck %s --check-prefixes=NO_FOLDING,NO_FOLDING24; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+f,+d -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=3 | FileCheck %s --check-prefixes=FOLDING,ZVFH5; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfhmin,+f,+d -verify-machineinstrs %s -o - --riscv-lower-ext-max-web-size=3 | FileCheck %s --check-prefixes=FOLDING,ZVFHMIN6; Check that the default value enables the web folding and7; that it is bigger than 3.8; RUN: llc -mtriple=riscv64 -mattr=+v,+zvfh,+f,+d -verify-machineinstrs %s -o - | FileCheck %s --check-prefixes=FOLDING,ZVFH9 10define void @vfwmul_v2f116_multiple_users(ptr %x, ptr %y, ptr %z, <2 x half> %a, <2 x half> %b, <2 x half> %b2) {11; NO_FOLDING1-LABEL: vfwmul_v2f116_multiple_users:12; NO_FOLDING1: # %bb.0:13; NO_FOLDING1-NEXT: vsetivli zero, 2, e16, mf4, ta, ma14; NO_FOLDING1-NEXT: vfwcvt.f.f.v v11, v815; NO_FOLDING1-NEXT: vfwcvt.f.f.v v8, v916; NO_FOLDING1-NEXT: vfwcvt.f.f.v v9, v1017; NO_FOLDING1-NEXT: vsetvli zero, zero, e32, mf2, ta, ma18; NO_FOLDING1-NEXT: vfmul.vv v10, v11, v819; NO_FOLDING1-NEXT: vfadd.vv v11, v11, v920; NO_FOLDING1-NEXT: vfsub.vv v8, v8, v921; NO_FOLDING1-NEXT: vse32.v v10, (a0)22; NO_FOLDING1-NEXT: vse32.v v11, (a1)23; NO_FOLDING1-NEXT: vse32.v v8, (a2)24; NO_FOLDING1-NEXT: ret25;26; NO_FOLDING2-LABEL: vfwmul_v2f116_multiple_users:27; NO_FOLDING2: # %bb.0:28; NO_FOLDING2-NEXT: vsetivli zero, 2, e16, mf4, ta, ma29; NO_FOLDING2-NEXT: vfwcvt.f.f.v v11, v830; NO_FOLDING2-NEXT: vfwcvt.f.f.v v8, v931; NO_FOLDING2-NEXT: vsetvli zero, zero, e32, mf2, ta, ma32; NO_FOLDING2-NEXT: vfmul.vv v9, v11, v833; NO_FOLDING2-NEXT: vsetvli zero, zero, e16, mf4, ta, ma34; NO_FOLDING2-NEXT: vfwadd.wv v11, v11, v1035; NO_FOLDING2-NEXT: vfwsub.wv v8, v8, v1036; NO_FOLDING2-NEXT: vse32.v v9, (a0)37; NO_FOLDING2-NEXT: vse32.v v11, (a1)38; NO_FOLDING2-NEXT: vse32.v v8, (a2)39; NO_FOLDING2-NEXT: ret40;41; ZVFH-LABEL: vfwmul_v2f116_multiple_users:42; ZVFH: # %bb.0:43; ZVFH-NEXT: vsetivli zero, 2, e16, mf4, ta, ma44; ZVFH-NEXT: vfwmul.vv v11, v8, v945; ZVFH-NEXT: vfwadd.vv v12, v8, v1046; ZVFH-NEXT: vfwsub.vv v8, v9, v1047; ZVFH-NEXT: vse32.v v11, (a0)48; ZVFH-NEXT: vse32.v v12, (a1)49; ZVFH-NEXT: vse32.v v8, (a2)50; ZVFH-NEXT: ret51;52; ZVFHMIN-LABEL: vfwmul_v2f116_multiple_users:53; ZVFHMIN: # %bb.0:54; ZVFHMIN-NEXT: vsetivli zero, 2, e16, mf4, ta, ma55; ZVFHMIN-NEXT: vfwcvt.f.f.v v11, v856; ZVFHMIN-NEXT: vfwcvt.f.f.v v8, v957; ZVFHMIN-NEXT: vfwcvt.f.f.v v9, v1058; ZVFHMIN-NEXT: vsetvli zero, zero, e32, mf2, ta, ma59; ZVFHMIN-NEXT: vfmul.vv v10, v11, v860; ZVFHMIN-NEXT: vfadd.vv v11, v11, v961; ZVFHMIN-NEXT: vfsub.vv v8, v8, v962; ZVFHMIN-NEXT: vse32.v v10, (a0)63; ZVFHMIN-NEXT: vse32.v v11, (a1)64; ZVFHMIN-NEXT: vse32.v v8, (a2)65; ZVFHMIN-NEXT: ret66 %c = fpext <2 x half> %a to <2 x float>67 %d = fpext <2 x half> %b to <2 x float>68 %d2 = fpext <2 x half> %b2 to <2 x float>69 %e = fmul <2 x float> %c, %d70 %f = fadd <2 x float> %c, %d271 %g = fsub <2 x float> %d, %d272 store <2 x float> %e, ptr %x73 store <2 x float> %f, ptr %y74 store <2 x float> %g, ptr %z75 ret void76}77 78define void @vfwmul_v2f32_multiple_users(ptr %x, ptr %y, ptr %z, <2 x float> %a, <2 x float> %b, <2 x float> %b2) {79; NO_FOLDING1-LABEL: vfwmul_v2f32_multiple_users:80; NO_FOLDING1: # %bb.0:81; NO_FOLDING1-NEXT: vsetivli zero, 2, e32, mf2, ta, ma82; NO_FOLDING1-NEXT: vfwcvt.f.f.v v11, v883; NO_FOLDING1-NEXT: vfwcvt.f.f.v v8, v984; NO_FOLDING1-NEXT: vfwcvt.f.f.v v9, v1085; NO_FOLDING1-NEXT: vsetvli zero, zero, e64, m1, ta, ma86; NO_FOLDING1-NEXT: vfmul.vv v10, v11, v887; NO_FOLDING1-NEXT: vfadd.vv v11, v11, v988; NO_FOLDING1-NEXT: vfsub.vv v8, v8, v989; NO_FOLDING1-NEXT: vse64.v v10, (a0)90; NO_FOLDING1-NEXT: vse64.v v11, (a1)91; NO_FOLDING1-NEXT: vse64.v v8, (a2)92; NO_FOLDING1-NEXT: ret93;94; NO_FOLDING2-LABEL: vfwmul_v2f32_multiple_users:95; NO_FOLDING2: # %bb.0:96; NO_FOLDING2-NEXT: vsetivli zero, 2, e32, mf2, ta, ma97; NO_FOLDING2-NEXT: vfwcvt.f.f.v v11, v898; NO_FOLDING2-NEXT: vfwcvt.f.f.v v8, v999; NO_FOLDING2-NEXT: vsetvli zero, zero, e64, m1, ta, ma100; NO_FOLDING2-NEXT: vfmul.vv v9, v11, v8101; NO_FOLDING2-NEXT: vsetvli zero, zero, e32, mf2, ta, ma102; NO_FOLDING2-NEXT: vfwadd.wv v11, v11, v10103; NO_FOLDING2-NEXT: vfwsub.wv v8, v8, v10104; NO_FOLDING2-NEXT: vse64.v v9, (a0)105; NO_FOLDING2-NEXT: vse64.v v11, (a1)106; NO_FOLDING2-NEXT: vse64.v v8, (a2)107; NO_FOLDING2-NEXT: ret108;109; FOLDING-LABEL: vfwmul_v2f32_multiple_users:110; FOLDING: # %bb.0:111; FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma112; FOLDING-NEXT: vfwmul.vv v11, v8, v9113; FOLDING-NEXT: vfwadd.vv v12, v8, v10114; FOLDING-NEXT: vfwsub.vv v8, v9, v10115; FOLDING-NEXT: vse64.v v11, (a0)116; FOLDING-NEXT: vse64.v v12, (a1)117; FOLDING-NEXT: vse64.v v8, (a2)118; FOLDING-NEXT: ret119 %c = fpext <2 x float> %a to <2 x double>120 %d = fpext <2 x float> %b to <2 x double>121 %d2 = fpext <2 x float> %b2 to <2 x double>122 %e = fmul <2 x double> %c, %d123 %f = fadd <2 x double> %c, %d2124 %g = fsub <2 x double> %d, %d2125 store <2 x double> %e, ptr %x126 store <2 x double> %f, ptr %y127 store <2 x double> %g, ptr %z128 ret void129}130 131define void @vfwmacc_v2f32_multiple_users(ptr %x, ptr %y, ptr %z, <2 x float> %a, <2 x float> %b, <2 x float> %b2, <2 x double> %w) {132; NO_FOLDING-LABEL: vfwmacc_v2f32_multiple_users:133; NO_FOLDING: # %bb.0:134; NO_FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma135; NO_FOLDING-NEXT: vfwcvt.f.f.v v12, v8136; NO_FOLDING-NEXT: vfwcvt.f.f.v v8, v9137; NO_FOLDING-NEXT: vfwcvt.f.f.v v9, v10138; NO_FOLDING-NEXT: vsetvli zero, zero, e64, m1, ta, ma139; NO_FOLDING-NEXT: vfmul.vv v10, v12, v8140; NO_FOLDING-NEXT: vfmadd.vv v12, v9, v11141; NO_FOLDING-NEXT: vfsub.vv v8, v8, v9142; NO_FOLDING-NEXT: vse64.v v10, (a0)143; NO_FOLDING-NEXT: vse64.v v12, (a1)144; NO_FOLDING-NEXT: vse64.v v8, (a2)145; NO_FOLDING-NEXT: ret146;147; FOLDING-LABEL: vfwmacc_v2f32_multiple_users:148; FOLDING: # %bb.0:149; FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma150; FOLDING-NEXT: vfwmul.vv v12, v8, v9151; FOLDING-NEXT: vfwsub.vv v13, v9, v10152; FOLDING-NEXT: vfwmacc.vv v11, v8, v10153; FOLDING-NEXT: vse64.v v12, (a0)154; FOLDING-NEXT: vse64.v v11, (a1)155; FOLDING-NEXT: vse64.v v13, (a2)156; FOLDING-NEXT: ret157 %c = fpext <2 x float> %a to <2 x double>158 %d = fpext <2 x float> %b to <2 x double>159 %d2 = fpext <2 x float> %b2 to <2 x double>160 %e = fmul <2 x double> %c, %d161 %f = call <2 x double> @llvm.fma(<2 x double> %c, <2 x double> %d2, <2 x double> %w)162 %g = fsub <2 x double> %d, %d2163 store <2 x double> %e, ptr %x164 store <2 x double> %f, ptr %y165 store <2 x double> %g, ptr %z166 ret void167}168 169; Negative test. We can't fold because the FMA addend is a user.170define void @vfwmacc_v2f32_multiple_users_addend_user(ptr %x, ptr %y, ptr %z, <2 x float> %a, <2 x float> %b, <2 x float> %b2) {171; NO_FOLDING-LABEL: vfwmacc_v2f32_multiple_users_addend_user:172; NO_FOLDING: # %bb.0:173; NO_FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma174; NO_FOLDING-NEXT: vfwcvt.f.f.v v11, v8175; NO_FOLDING-NEXT: vfwcvt.f.f.v v8, v9176; NO_FOLDING-NEXT: vfwcvt.f.f.v v9, v10177; NO_FOLDING-NEXT: vsetvli zero, zero, e64, m1, ta, ma178; NO_FOLDING-NEXT: vfmul.vv v10, v11, v8179; NO_FOLDING-NEXT: vfmadd.vv v11, v9, v8180; NO_FOLDING-NEXT: vfsub.vv v8, v8, v9181; NO_FOLDING-NEXT: vse64.v v10, (a0)182; NO_FOLDING-NEXT: vse64.v v11, (a1)183; NO_FOLDING-NEXT: vse64.v v8, (a2)184; NO_FOLDING-NEXT: ret185;186; FOLDING-LABEL: vfwmacc_v2f32_multiple_users_addend_user:187; FOLDING: # %bb.0:188; FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma189; FOLDING-NEXT: vfwcvt.f.f.v v11, v8190; FOLDING-NEXT: vfwcvt.f.f.v v8, v9191; FOLDING-NEXT: vfwcvt.f.f.v v9, v10192; FOLDING-NEXT: vsetvli zero, zero, e64, m1, ta, ma193; FOLDING-NEXT: vfmul.vv v10, v11, v8194; FOLDING-NEXT: vfmadd.vv v11, v9, v8195; FOLDING-NEXT: vfsub.vv v8, v8, v9196; FOLDING-NEXT: vse64.v v10, (a0)197; FOLDING-NEXT: vse64.v v11, (a1)198; FOLDING-NEXT: vse64.v v8, (a2)199; FOLDING-NEXT: ret200 %c = fpext <2 x float> %a to <2 x double>201 %d = fpext <2 x float> %b to <2 x double>202 %d2 = fpext <2 x float> %b2 to <2 x double>203 %e = fmul <2 x double> %c, %d204 %f = call <2 x double> @llvm.fma(<2 x double> %c, <2 x double> %d2, <2 x double> %d)205 %g = fsub <2 x double> %d, %d2206 store <2 x double> %e, ptr %x207 store <2 x double> %f, ptr %y208 store <2 x double> %g, ptr %z209 ret void210}211 212; Negative test. We can't fold because the FMA addend is a user.213define void @vfwmacc_v2f32_addend_user(ptr %x, <2 x float> %a, <2 x float> %b) {214; NO_FOLDING-LABEL: vfwmacc_v2f32_addend_user:215; NO_FOLDING: # %bb.0:216; NO_FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma217; NO_FOLDING-NEXT: vfwcvt.f.f.v v10, v8218; NO_FOLDING-NEXT: vfwcvt.f.f.v v8, v9219; NO_FOLDING-NEXT: vsetvli zero, zero, e64, m1, ta, ma220; NO_FOLDING-NEXT: vfmadd.vv v8, v10, v8221; NO_FOLDING-NEXT: vse64.v v8, (a0)222; NO_FOLDING-NEXT: ret223;224; FOLDING-LABEL: vfwmacc_v2f32_addend_user:225; FOLDING: # %bb.0:226; FOLDING-NEXT: vsetivli zero, 2, e32, mf2, ta, ma227; FOLDING-NEXT: vfwcvt.f.f.v v10, v8228; FOLDING-NEXT: vfwcvt.f.f.v v8, v9229; FOLDING-NEXT: vsetvli zero, zero, e64, m1, ta, ma230; FOLDING-NEXT: vfmadd.vv v8, v10, v8231; FOLDING-NEXT: vse64.v v8, (a0)232; FOLDING-NEXT: ret233 %c = fpext <2 x float> %a to <2 x double>234 %d = fpext <2 x float> %b to <2 x double>235 %f = call <2 x double> @llvm.fma(<2 x double> %c, <2 x double> %d, <2 x double> %d)236 store <2 x double> %f, ptr %x237 ret void238}239