brintos

brintos / llvm-project-archived public Read only

0
0
Text · 24.5 KiB · 9baa2f7 Raw
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