649 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v,+f -target-abi=lp64f \3; RUN: -mattr=+no-sink-splat-operands -riscv-v-vector-bits-min=128 \4; RUN: | FileCheck -check-prefix=NO-SINK %s5; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v,+f -target-abi=lp64f \6; RUN: -mattr=-no-sink-splat-operands -riscv-v-vector-bits-min=128 \7; RUN: | FileCheck -check-prefix=SINK %s8; RUN: llc < %s -mtriple=riscv64 -mattr=+m,+v,+f -target-abi=lp64f \9; RUN: -riscv-v-vector-bits-min=128 \10; RUN: | FileCheck -check-prefix=DEFAULT %s11 12; Test that we don't sink splat operands when compiling with no-sink-splat-operands.13; Each scalar register access requires a S2V transfer buffer entry. Using too many14; limits performance.15; FIXME: This is potentially bad for register pressure. Need a better heuristic.16 17define void @sink_splat_add(ptr nocapture %a, i32 signext %x) {18; NO-SINK-LABEL: sink_splat_add:19; NO-SINK: # %bb.0: # %entry20; NO-SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma21; NO-SINK-NEXT: vmv.v.x v8, a122; NO-SINK-NEXT: lui a1, 123; NO-SINK-NEXT: add a1, a0, a124; NO-SINK-NEXT: .LBB0_1: # %vector.body25; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=126; NO-SINK-NEXT: vle32.v v9, (a0)27; NO-SINK-NEXT: vadd.vv v9, v9, v828; NO-SINK-NEXT: vse32.v v9, (a0)29; NO-SINK-NEXT: addi a0, a0, 1630; NO-SINK-NEXT: bne a0, a1, .LBB0_131; NO-SINK-NEXT: # %bb.2: # %for.cond.cleanup32; NO-SINK-NEXT: ret33;34; SINK-LABEL: sink_splat_add:35; SINK: # %bb.0: # %entry36; SINK-NEXT: lui a2, 137; SINK-NEXT: add a2, a0, a238; SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma39; SINK-NEXT: .LBB0_1: # %vector.body40; SINK-NEXT: # =>This Inner Loop Header: Depth=141; SINK-NEXT: vle32.v v8, (a0)42; SINK-NEXT: vadd.vx v8, v8, a143; SINK-NEXT: vse32.v v8, (a0)44; SINK-NEXT: addi a0, a0, 1645; SINK-NEXT: bne a0, a2, .LBB0_146; SINK-NEXT: # %bb.2: # %for.cond.cleanup47; SINK-NEXT: ret48;49; DEFAULT-LABEL: sink_splat_add:50; DEFAULT: # %bb.0: # %entry51; DEFAULT-NEXT: lui a2, 152; DEFAULT-NEXT: add a2, a0, a253; DEFAULT-NEXT: vsetivli zero, 4, e32, m1, ta, ma54; DEFAULT-NEXT: .LBB0_1: # %vector.body55; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=156; DEFAULT-NEXT: vle32.v v8, (a0)57; DEFAULT-NEXT: vadd.vx v8, v8, a158; DEFAULT-NEXT: vse32.v v8, (a0)59; DEFAULT-NEXT: addi a0, a0, 1660; DEFAULT-NEXT: bne a0, a2, .LBB0_161; DEFAULT-NEXT: # %bb.2: # %for.cond.cleanup62; DEFAULT-NEXT: ret63entry:64 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 065 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer66 br label %vector.body67 68vector.body: ; preds = %vector.body, %entry69 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]70 %0 = getelementptr inbounds i32, ptr %a, i64 %index71 %1 = bitcast ptr %0 to ptr72 %wide.load = load <4 x i32>, ptr %1, align 473 %2 = add <4 x i32> %wide.load, %broadcast.splat74 %3 = bitcast ptr %0 to ptr75 store <4 x i32> %2, ptr %3, align 476 %index.next = add nuw i64 %index, 477 %4 = icmp eq i64 %index.next, 102478 br i1 %4, label %for.cond.cleanup, label %vector.body79 80for.cond.cleanup: ; preds = %vector.body81 ret void82}83 84define void @sink_splat_add_scalable(ptr nocapture %a, i32 signext %x) {85; NO-SINK-LABEL: sink_splat_add_scalable:86; NO-SINK: # %bb.0: # %entry87; NO-SINK-NEXT: csrr a5, vlenb88; NO-SINK-NEXT: srli a3, a5, 189; NO-SINK-NEXT: li a2, 102490; NO-SINK-NEXT: bgeu a2, a3, .LBB1_291; NO-SINK-NEXT: # %bb.1:92; NO-SINK-NEXT: li a2, 093; NO-SINK-NEXT: j .LBB1_594; NO-SINK-NEXT: .LBB1_2: # %vector.ph95; NO-SINK-NEXT: addi a2, a3, -196; NO-SINK-NEXT: andi a4, a2, 102497; NO-SINK-NEXT: xori a2, a4, 102498; NO-SINK-NEXT: vsetvli a6, zero, e32, m2, ta, ma99; NO-SINK-NEXT: vmv.v.x v8, a1100; NO-SINK-NEXT: slli a5, a5, 1101; NO-SINK-NEXT: mv a6, a0102; NO-SINK-NEXT: mv a7, a2103; NO-SINK-NEXT: .LBB1_3: # %vector.body104; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1105; NO-SINK-NEXT: vl2re32.v v10, (a6)106; NO-SINK-NEXT: sub a7, a7, a3107; NO-SINK-NEXT: vadd.vv v10, v10, v8108; NO-SINK-NEXT: vs2r.v v10, (a6)109; NO-SINK-NEXT: add a6, a6, a5110; NO-SINK-NEXT: bnez a7, .LBB1_3111; NO-SINK-NEXT: # %bb.4: # %middle.block112; NO-SINK-NEXT: beqz a4, .LBB1_7113; NO-SINK-NEXT: .LBB1_5: # %for.body.preheader114; NO-SINK-NEXT: slli a2, a2, 2115; NO-SINK-NEXT: lui a3, 1116; NO-SINK-NEXT: add a2, a0, a2117; NO-SINK-NEXT: add a0, a0, a3118; NO-SINK-NEXT: .LBB1_6: # %for.body119; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1120; NO-SINK-NEXT: lw a3, 0(a2)121; NO-SINK-NEXT: add a3, a3, a1122; NO-SINK-NEXT: sw a3, 0(a2)123; NO-SINK-NEXT: addi a2, a2, 4124; NO-SINK-NEXT: bne a2, a0, .LBB1_6125; NO-SINK-NEXT: .LBB1_7: # %for.cond.cleanup126; NO-SINK-NEXT: ret127;128; SINK-LABEL: sink_splat_add_scalable:129; SINK: # %bb.0: # %entry130; SINK-NEXT: csrr a5, vlenb131; SINK-NEXT: srli a3, a5, 1132; SINK-NEXT: li a2, 1024133; SINK-NEXT: bgeu a2, a3, .LBB1_2134; SINK-NEXT: # %bb.1:135; SINK-NEXT: li a2, 0136; SINK-NEXT: j .LBB1_5137; SINK-NEXT: .LBB1_2: # %vector.ph138; SINK-NEXT: addi a2, a3, -1139; SINK-NEXT: andi a4, a2, 1024140; SINK-NEXT: xori a2, a4, 1024141; SINK-NEXT: slli a5, a5, 1142; SINK-NEXT: mv a6, a0143; SINK-NEXT: mv a7, a2144; SINK-NEXT: vsetvli t0, zero, e32, m2, ta, ma145; SINK-NEXT: .LBB1_3: # %vector.body146; SINK-NEXT: # =>This Inner Loop Header: Depth=1147; SINK-NEXT: vl2re32.v v8, (a6)148; SINK-NEXT: sub a7, a7, a3149; SINK-NEXT: vadd.vx v8, v8, a1150; SINK-NEXT: vs2r.v v8, (a6)151; SINK-NEXT: add a6, a6, a5152; SINK-NEXT: bnez a7, .LBB1_3153; SINK-NEXT: # %bb.4: # %middle.block154; SINK-NEXT: beqz a4, .LBB1_7155; SINK-NEXT: .LBB1_5: # %for.body.preheader156; SINK-NEXT: slli a2, a2, 2157; SINK-NEXT: lui a3, 1158; SINK-NEXT: add a2, a0, a2159; SINK-NEXT: add a0, a0, a3160; SINK-NEXT: .LBB1_6: # %for.body161; SINK-NEXT: # =>This Inner Loop Header: Depth=1162; SINK-NEXT: lw a3, 0(a2)163; SINK-NEXT: add a3, a3, a1164; SINK-NEXT: sw a3, 0(a2)165; SINK-NEXT: addi a2, a2, 4166; SINK-NEXT: bne a2, a0, .LBB1_6167; SINK-NEXT: .LBB1_7: # %for.cond.cleanup168; SINK-NEXT: ret169;170; DEFAULT-LABEL: sink_splat_add_scalable:171; DEFAULT: # %bb.0: # %entry172; DEFAULT-NEXT: csrr a5, vlenb173; DEFAULT-NEXT: srli a3, a5, 1174; DEFAULT-NEXT: li a2, 1024175; DEFAULT-NEXT: bgeu a2, a3, .LBB1_2176; DEFAULT-NEXT: # %bb.1:177; DEFAULT-NEXT: li a2, 0178; DEFAULT-NEXT: j .LBB1_5179; DEFAULT-NEXT: .LBB1_2: # %vector.ph180; DEFAULT-NEXT: addi a2, a3, -1181; DEFAULT-NEXT: andi a4, a2, 1024182; DEFAULT-NEXT: xori a2, a4, 1024183; DEFAULT-NEXT: slli a5, a5, 1184; DEFAULT-NEXT: mv a6, a0185; DEFAULT-NEXT: mv a7, a2186; DEFAULT-NEXT: vsetvli t0, zero, e32, m2, ta, ma187; DEFAULT-NEXT: .LBB1_3: # %vector.body188; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1189; DEFAULT-NEXT: vl2re32.v v8, (a6)190; DEFAULT-NEXT: sub a7, a7, a3191; DEFAULT-NEXT: vadd.vx v8, v8, a1192; DEFAULT-NEXT: vs2r.v v8, (a6)193; DEFAULT-NEXT: add a6, a6, a5194; DEFAULT-NEXT: bnez a7, .LBB1_3195; DEFAULT-NEXT: # %bb.4: # %middle.block196; DEFAULT-NEXT: beqz a4, .LBB1_7197; DEFAULT-NEXT: .LBB1_5: # %for.body.preheader198; DEFAULT-NEXT: slli a2, a2, 2199; DEFAULT-NEXT: lui a3, 1200; DEFAULT-NEXT: add a2, a0, a2201; DEFAULT-NEXT: add a0, a0, a3202; DEFAULT-NEXT: .LBB1_6: # %for.body203; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1204; DEFAULT-NEXT: lw a3, 0(a2)205; DEFAULT-NEXT: add a3, a3, a1206; DEFAULT-NEXT: sw a3, 0(a2)207; DEFAULT-NEXT: addi a2, a2, 4208; DEFAULT-NEXT: bne a2, a0, .LBB1_6209; DEFAULT-NEXT: .LBB1_7: # %for.cond.cleanup210; DEFAULT-NEXT: ret211entry:212 %0 = call i64 @llvm.vscale.i64()213 %1 = shl i64 %0, 2214 %min.iters.check = icmp ugt i64 %1, 1024215 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph216 217vector.ph: ; preds = %entry218 %2 = call i64 @llvm.vscale.i64()219 %3 = shl i64 %2, 2220 %n.mod.vf = urem i64 1024, %3221 %n.vec = sub nsw i64 1024, %n.mod.vf222 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0223 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer224 %4 = call i64 @llvm.vscale.i64()225 %5 = shl i64 %4, 2226 br label %vector.body227 228vector.body: ; preds = %vector.body, %vector.ph229 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]230 %6 = getelementptr inbounds i32, ptr %a, i64 %index231 %7 = bitcast ptr %6 to ptr232 %wide.load = load <vscale x 4 x i32>, ptr %7, align 4233 %8 = add <vscale x 4 x i32> %wide.load, %broadcast.splat234 %9 = bitcast ptr %6 to ptr235 store <vscale x 4 x i32> %8, ptr %9, align 4236 %index.next = add nuw i64 %index, %5237 %10 = icmp eq i64 %index.next, %n.vec238 br i1 %10, label %middle.block, label %vector.body239 240middle.block: ; preds = %vector.body241 %cmp.n = icmp eq i64 %n.mod.vf, 0242 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader243 244for.body.preheader: ; preds = %entry, %middle.block245 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]246 br label %for.body247 248for.cond.cleanup: ; preds = %for.body, %middle.block249 ret void250 251for.body: ; preds = %for.body.preheader, %for.body252 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]253 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv254 %11 = load i32, ptr %arrayidx, align 4255 %add = add i32 %11, %x256 store i32 %add, ptr %arrayidx, align 4257 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1258 %cmp.not = icmp eq i64 %indvars.iv.next, 1024259 br i1 %cmp.not, label %for.cond.cleanup, label %for.body260}261 262define void @sink_splat_vp_add(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {263; NO-SINK-LABEL: sink_splat_vp_add:264; NO-SINK: # %bb.0: # %entry265; NO-SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma266; NO-SINK-NEXT: vmv.v.x v8, a1267; NO-SINK-NEXT: lui a1, 1268; NO-SINK-NEXT: add a1, a0, a1269; NO-SINK-NEXT: .LBB2_1: # %vector.body270; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1271; NO-SINK-NEXT: vle32.v v9, (a0)272; NO-SINK-NEXT: vsetvli zero, a2, e32, m1, ta, ma273; NO-SINK-NEXT: vadd.vv v9, v9, v8, v0.t274; NO-SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma275; NO-SINK-NEXT: vse32.v v9, (a0)276; NO-SINK-NEXT: addi a0, a0, 16277; NO-SINK-NEXT: bne a0, a1, .LBB2_1278; NO-SINK-NEXT: # %bb.2: # %for.cond.cleanup279; NO-SINK-NEXT: ret280;281; SINK-LABEL: sink_splat_vp_add:282; SINK: # %bb.0: # %entry283; SINK-NEXT: lui a3, 1284; SINK-NEXT: add a3, a0, a3285; SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma286; SINK-NEXT: .LBB2_1: # %vector.body287; SINK-NEXT: # =>This Inner Loop Header: Depth=1288; SINK-NEXT: vle32.v v8, (a0)289; SINK-NEXT: vsetvli zero, a2, e32, m1, ta, ma290; SINK-NEXT: vadd.vx v8, v8, a1, v0.t291; SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma292; SINK-NEXT: vse32.v v8, (a0)293; SINK-NEXT: addi a0, a0, 16294; SINK-NEXT: bne a0, a3, .LBB2_1295; SINK-NEXT: # %bb.2: # %for.cond.cleanup296; SINK-NEXT: ret297;298; DEFAULT-LABEL: sink_splat_vp_add:299; DEFAULT: # %bb.0: # %entry300; DEFAULT-NEXT: lui a3, 1301; DEFAULT-NEXT: add a3, a0, a3302; DEFAULT-NEXT: vsetivli zero, 4, e32, m1, ta, ma303; DEFAULT-NEXT: .LBB2_1: # %vector.body304; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1305; DEFAULT-NEXT: vle32.v v8, (a0)306; DEFAULT-NEXT: vsetvli zero, a2, e32, m1, ta, ma307; DEFAULT-NEXT: vadd.vx v8, v8, a1, v0.t308; DEFAULT-NEXT: vsetivli zero, 4, e32, m1, ta, ma309; DEFAULT-NEXT: vse32.v v8, (a0)310; DEFAULT-NEXT: addi a0, a0, 16311; DEFAULT-NEXT: bne a0, a3, .LBB2_1312; DEFAULT-NEXT: # %bb.2: # %for.cond.cleanup313; DEFAULT-NEXT: ret314entry:315 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0316 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer317 br label %vector.body318 319vector.body: ; preds = %vector.body, %entry320 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]321 %0 = getelementptr inbounds i32, ptr %a, i64 %index322 %1 = bitcast ptr %0 to ptr323 %wide.load = load <4 x i32>, ptr %1, align 4324 %2 = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)325 %3 = bitcast ptr %0 to ptr326 store <4 x i32> %2, ptr %3, align 4327 %index.next = add nuw i64 %index, 4328 %4 = icmp eq i64 %index.next, 1024329 br i1 %4, label %for.cond.cleanup, label %vector.body330 331for.cond.cleanup: ; preds = %vector.body332 ret void333}334 335define void @sink_splat_fadd(ptr nocapture %a, float %x) {336; NO-SINK-LABEL: sink_splat_fadd:337; NO-SINK: # %bb.0: # %entry338; NO-SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma339; NO-SINK-NEXT: vfmv.v.f v8, fa0340; NO-SINK-NEXT: lui a1, 1341; NO-SINK-NEXT: add a1, a0, a1342; NO-SINK-NEXT: .LBB3_1: # %vector.body343; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1344; NO-SINK-NEXT: vle32.v v9, (a0)345; NO-SINK-NEXT: vfadd.vv v9, v9, v8346; NO-SINK-NEXT: vse32.v v9, (a0)347; NO-SINK-NEXT: addi a0, a0, 16348; NO-SINK-NEXT: bne a0, a1, .LBB3_1349; NO-SINK-NEXT: # %bb.2: # %for.cond.cleanup350; NO-SINK-NEXT: ret351;352; SINK-LABEL: sink_splat_fadd:353; SINK: # %bb.0: # %entry354; SINK-NEXT: lui a1, 1355; SINK-NEXT: add a1, a0, a1356; SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma357; SINK-NEXT: .LBB3_1: # %vector.body358; SINK-NEXT: # =>This Inner Loop Header: Depth=1359; SINK-NEXT: vle32.v v8, (a0)360; SINK-NEXT: vfadd.vf v8, v8, fa0361; SINK-NEXT: vse32.v v8, (a0)362; SINK-NEXT: addi a0, a0, 16363; SINK-NEXT: bne a0, a1, .LBB3_1364; SINK-NEXT: # %bb.2: # %for.cond.cleanup365; SINK-NEXT: ret366;367; DEFAULT-LABEL: sink_splat_fadd:368; DEFAULT: # %bb.0: # %entry369; DEFAULT-NEXT: lui a1, 1370; DEFAULT-NEXT: add a1, a0, a1371; DEFAULT-NEXT: vsetivli zero, 4, e32, m1, ta, ma372; DEFAULT-NEXT: .LBB3_1: # %vector.body373; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1374; DEFAULT-NEXT: vle32.v v8, (a0)375; DEFAULT-NEXT: vfadd.vf v8, v8, fa0376; DEFAULT-NEXT: vse32.v v8, (a0)377; DEFAULT-NEXT: addi a0, a0, 16378; DEFAULT-NEXT: bne a0, a1, .LBB3_1379; DEFAULT-NEXT: # %bb.2: # %for.cond.cleanup380; DEFAULT-NEXT: ret381entry:382 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 0383 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer384 br label %vector.body385 386vector.body: ; preds = %vector.body, %entry387 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]388 %0 = getelementptr inbounds float, ptr %a, i64 %index389 %1 = bitcast ptr %0 to ptr390 %wide.load = load <4 x float>, ptr %1, align 4391 %2 = fadd <4 x float> %wide.load, %broadcast.splat392 %3 = bitcast ptr %0 to ptr393 store <4 x float> %2, ptr %3, align 4394 %index.next = add nuw i64 %index, 4395 %4 = icmp eq i64 %index.next, 1024396 br i1 %4, label %for.cond.cleanup, label %vector.body397 398for.cond.cleanup: ; preds = %vector.body399 ret void400}401 402define void @sink_splat_fadd_scalable(ptr nocapture %a, float %x) {403; NO-SINK-LABEL: sink_splat_fadd_scalable:404; NO-SINK: # %bb.0: # %entry405; NO-SINK-NEXT: csrr a1, vlenb406; NO-SINK-NEXT: srli a3, a1, 2407; NO-SINK-NEXT: li a2, 1024408; NO-SINK-NEXT: bgeu a2, a3, .LBB4_2409; NO-SINK-NEXT: # %bb.1:410; NO-SINK-NEXT: li a2, 0411; NO-SINK-NEXT: j .LBB4_5412; NO-SINK-NEXT: .LBB4_2: # %vector.ph413; NO-SINK-NEXT: addi a2, a3, -1414; NO-SINK-NEXT: andi a4, a2, 1024415; NO-SINK-NEXT: xori a2, a4, 1024416; NO-SINK-NEXT: vsetvli a5, zero, e32, m1, ta, ma417; NO-SINK-NEXT: vfmv.v.f v8, fa0418; NO-SINK-NEXT: mv a5, a0419; NO-SINK-NEXT: mv a6, a2420; NO-SINK-NEXT: .LBB4_3: # %vector.body421; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1422; NO-SINK-NEXT: vl1re32.v v9, (a5)423; NO-SINK-NEXT: sub a6, a6, a3424; NO-SINK-NEXT: vfadd.vv v9, v9, v8425; NO-SINK-NEXT: vs1r.v v9, (a5)426; NO-SINK-NEXT: add a5, a5, a1427; NO-SINK-NEXT: bnez a6, .LBB4_3428; NO-SINK-NEXT: # %bb.4: # %middle.block429; NO-SINK-NEXT: beqz a4, .LBB4_7430; NO-SINK-NEXT: .LBB4_5: # %for.body.preheader431; NO-SINK-NEXT: slli a1, a2, 2432; NO-SINK-NEXT: lui a2, 1433; NO-SINK-NEXT: add a1, a0, a1434; NO-SINK-NEXT: add a0, a0, a2435; NO-SINK-NEXT: .LBB4_6: # %for.body436; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1437; NO-SINK-NEXT: flw fa5, 0(a1)438; NO-SINK-NEXT: fadd.s fa5, fa5, fa0439; NO-SINK-NEXT: fsw fa5, 0(a1)440; NO-SINK-NEXT: addi a1, a1, 4441; NO-SINK-NEXT: bne a1, a0, .LBB4_6442; NO-SINK-NEXT: .LBB4_7: # %for.cond.cleanup443; NO-SINK-NEXT: ret444;445; SINK-LABEL: sink_splat_fadd_scalable:446; SINK: # %bb.0: # %entry447; SINK-NEXT: csrr a1, vlenb448; SINK-NEXT: srli a3, a1, 2449; SINK-NEXT: li a2, 1024450; SINK-NEXT: bgeu a2, a3, .LBB4_2451; SINK-NEXT: # %bb.1:452; SINK-NEXT: li a2, 0453; SINK-NEXT: j .LBB4_5454; SINK-NEXT: .LBB4_2: # %vector.ph455; SINK-NEXT: addi a2, a3, -1456; SINK-NEXT: andi a4, a2, 1024457; SINK-NEXT: xori a2, a4, 1024458; SINK-NEXT: mv a5, a0459; SINK-NEXT: mv a6, a2460; SINK-NEXT: vsetvli a7, zero, e32, m1, ta, ma461; SINK-NEXT: .LBB4_3: # %vector.body462; SINK-NEXT: # =>This Inner Loop Header: Depth=1463; SINK-NEXT: vl1re32.v v8, (a5)464; SINK-NEXT: sub a6, a6, a3465; SINK-NEXT: vfadd.vf v8, v8, fa0466; SINK-NEXT: vs1r.v v8, (a5)467; SINK-NEXT: add a5, a5, a1468; SINK-NEXT: bnez a6, .LBB4_3469; SINK-NEXT: # %bb.4: # %middle.block470; SINK-NEXT: beqz a4, .LBB4_7471; SINK-NEXT: .LBB4_5: # %for.body.preheader472; SINK-NEXT: slli a1, a2, 2473; SINK-NEXT: lui a2, 1474; SINK-NEXT: add a1, a0, a1475; SINK-NEXT: add a0, a0, a2476; SINK-NEXT: .LBB4_6: # %for.body477; SINK-NEXT: # =>This Inner Loop Header: Depth=1478; SINK-NEXT: flw fa5, 0(a1)479; SINK-NEXT: fadd.s fa5, fa5, fa0480; SINK-NEXT: fsw fa5, 0(a1)481; SINK-NEXT: addi a1, a1, 4482; SINK-NEXT: bne a1, a0, .LBB4_6483; SINK-NEXT: .LBB4_7: # %for.cond.cleanup484; SINK-NEXT: ret485;486; DEFAULT-LABEL: sink_splat_fadd_scalable:487; DEFAULT: # %bb.0: # %entry488; DEFAULT-NEXT: csrr a1, vlenb489; DEFAULT-NEXT: srli a3, a1, 2490; DEFAULT-NEXT: li a2, 1024491; DEFAULT-NEXT: bgeu a2, a3, .LBB4_2492; DEFAULT-NEXT: # %bb.1:493; DEFAULT-NEXT: li a2, 0494; DEFAULT-NEXT: j .LBB4_5495; DEFAULT-NEXT: .LBB4_2: # %vector.ph496; DEFAULT-NEXT: addi a2, a3, -1497; DEFAULT-NEXT: andi a4, a2, 1024498; DEFAULT-NEXT: xori a2, a4, 1024499; DEFAULT-NEXT: mv a5, a0500; DEFAULT-NEXT: mv a6, a2501; DEFAULT-NEXT: vsetvli a7, zero, e32, m1, ta, ma502; DEFAULT-NEXT: .LBB4_3: # %vector.body503; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1504; DEFAULT-NEXT: vl1re32.v v8, (a5)505; DEFAULT-NEXT: sub a6, a6, a3506; DEFAULT-NEXT: vfadd.vf v8, v8, fa0507; DEFAULT-NEXT: vs1r.v v8, (a5)508; DEFAULT-NEXT: add a5, a5, a1509; DEFAULT-NEXT: bnez a6, .LBB4_3510; DEFAULT-NEXT: # %bb.4: # %middle.block511; DEFAULT-NEXT: beqz a4, .LBB4_7512; DEFAULT-NEXT: .LBB4_5: # %for.body.preheader513; DEFAULT-NEXT: slli a1, a2, 2514; DEFAULT-NEXT: lui a2, 1515; DEFAULT-NEXT: add a1, a0, a1516; DEFAULT-NEXT: add a0, a0, a2517; DEFAULT-NEXT: .LBB4_6: # %for.body518; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1519; DEFAULT-NEXT: flw fa5, 0(a1)520; DEFAULT-NEXT: fadd.s fa5, fa5, fa0521; DEFAULT-NEXT: fsw fa5, 0(a1)522; DEFAULT-NEXT: addi a1, a1, 4523; DEFAULT-NEXT: bne a1, a0, .LBB4_6524; DEFAULT-NEXT: .LBB4_7: # %for.cond.cleanup525; DEFAULT-NEXT: ret526entry:527 %0 = call i64 @llvm.vscale.i64()528 %1 = shl i64 %0, 1529 %min.iters.check = icmp ugt i64 %1, 1024530 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph531 532vector.ph: ; preds = %entry533 %2 = call i64 @llvm.vscale.i64()534 %3 = shl i64 %2, 1535 %n.mod.vf = urem i64 1024, %3536 %n.vec = sub nsw i64 1024, %n.mod.vf537 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 0538 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer539 %4 = call i64 @llvm.vscale.i64()540 %5 = shl i64 %4, 1541 br label %vector.body542 543vector.body: ; preds = %vector.body, %vector.ph544 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]545 %6 = getelementptr inbounds float, ptr %a, i64 %index546 %7 = bitcast ptr %6 to ptr547 %wide.load = load <vscale x 2 x float>, ptr %7, align 4548 %8 = fadd <vscale x 2 x float> %wide.load, %broadcast.splat549 %9 = bitcast ptr %6 to ptr550 store <vscale x 2 x float> %8, ptr %9, align 4551 %index.next = add nuw i64 %index, %5552 %10 = icmp eq i64 %index.next, %n.vec553 br i1 %10, label %middle.block, label %vector.body554 555middle.block: ; preds = %vector.body556 %cmp.n = icmp eq i64 %n.mod.vf, 0557 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader558 559for.body.preheader: ; preds = %entry, %middle.block560 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]561 br label %for.body562 563for.cond.cleanup: ; preds = %for.body, %middle.block564 ret void565 566for.body: ; preds = %for.body.preheader, %for.body567 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]568 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv569 %11 = load float, ptr %arrayidx, align 4570 %mul = fadd float %11, %x571 store float %mul, ptr %arrayidx, align 4572 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1573 %cmp.not = icmp eq i64 %indvars.iv.next, 1024574 br i1 %cmp.not, label %for.cond.cleanup, label %for.body575}576 577define void @sink_splat_vp_fadd(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {578; NO-SINK-LABEL: sink_splat_vp_fadd:579; NO-SINK: # %bb.0: # %entry580; NO-SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma581; NO-SINK-NEXT: vfmv.v.f v8, fa0582; NO-SINK-NEXT: lui a2, 1583; NO-SINK-NEXT: add a2, a0, a2584; NO-SINK-NEXT: .LBB5_1: # %vector.body585; NO-SINK-NEXT: # =>This Inner Loop Header: Depth=1586; NO-SINK-NEXT: vle32.v v9, (a0)587; NO-SINK-NEXT: vsetvli zero, a1, e32, m1, ta, ma588; NO-SINK-NEXT: vfadd.vv v9, v9, v8, v0.t589; NO-SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma590; NO-SINK-NEXT: vse32.v v9, (a0)591; NO-SINK-NEXT: addi a0, a0, 16592; NO-SINK-NEXT: bne a0, a2, .LBB5_1593; NO-SINK-NEXT: # %bb.2: # %for.cond.cleanup594; NO-SINK-NEXT: ret595;596; SINK-LABEL: sink_splat_vp_fadd:597; SINK: # %bb.0: # %entry598; SINK-NEXT: lui a2, 1599; SINK-NEXT: add a2, a0, a2600; SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma601; SINK-NEXT: .LBB5_1: # %vector.body602; SINK-NEXT: # =>This Inner Loop Header: Depth=1603; SINK-NEXT: vle32.v v8, (a0)604; SINK-NEXT: vsetvli zero, a1, e32, m1, ta, ma605; SINK-NEXT: vfadd.vf v8, v8, fa0, v0.t606; SINK-NEXT: vsetivli zero, 4, e32, m1, ta, ma607; SINK-NEXT: vse32.v v8, (a0)608; SINK-NEXT: addi a0, a0, 16609; SINK-NEXT: bne a0, a2, .LBB5_1610; SINK-NEXT: # %bb.2: # %for.cond.cleanup611; SINK-NEXT: ret612;613; DEFAULT-LABEL: sink_splat_vp_fadd:614; DEFAULT: # %bb.0: # %entry615; DEFAULT-NEXT: lui a2, 1616; DEFAULT-NEXT: add a2, a0, a2617; DEFAULT-NEXT: vsetivli zero, 4, e32, m1, ta, ma618; DEFAULT-NEXT: .LBB5_1: # %vector.body619; DEFAULT-NEXT: # =>This Inner Loop Header: Depth=1620; DEFAULT-NEXT: vle32.v v8, (a0)621; DEFAULT-NEXT: vsetvli zero, a1, e32, m1, ta, ma622; DEFAULT-NEXT: vfadd.vf v8, v8, fa0, v0.t623; DEFAULT-NEXT: vsetivli zero, 4, e32, m1, ta, ma624; DEFAULT-NEXT: vse32.v v8, (a0)625; DEFAULT-NEXT: addi a0, a0, 16626; DEFAULT-NEXT: bne a0, a2, .LBB5_1627; DEFAULT-NEXT: # %bb.2: # %for.cond.cleanup628; DEFAULT-NEXT: ret629entry:630 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 0631 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer632 br label %vector.body633 634vector.body: ; preds = %vector.body, %entry635 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]636 %0 = getelementptr inbounds float, ptr %a, i64 %index637 %1 = bitcast ptr %0 to ptr638 %wide.load = load <4 x float>, ptr %1, align 4639 %2 = call <4 x float> @llvm.vp.fadd.v4i32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x i1> %m, i32 %vl)640 %3 = bitcast ptr %0 to ptr641 store <4 x float> %2, ptr %3, align 4642 %index.next = add nuw i64 %index, 4643 %4 = icmp eq i64 %index.next, 1024644 br i1 %4, label %for.cond.cleanup, label %vector.body645 646for.cond.cleanup: ; preds = %vector.body647 ret void648}649