5983 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: | FileCheck %s4 5define void @sink_splat_mul(ptr nocapture %a, i32 signext %x) {6; CHECK-LABEL: sink_splat_mul:7; CHECK: # %bb.0: # %entry8; CHECK-NEXT: lui a2, 19; CHECK-NEXT: add a2, a0, a210; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma11; CHECK-NEXT: .LBB0_1: # %vector.body12; CHECK-NEXT: # =>This Inner Loop Header: Depth=113; CHECK-NEXT: vle32.v v8, (a0)14; CHECK-NEXT: vmul.vx v8, v8, a115; CHECK-NEXT: vse32.v v8, (a0)16; CHECK-NEXT: addi a0, a0, 1617; CHECK-NEXT: bne a0, a2, .LBB0_118; CHECK-NEXT: # %bb.2: # %for.cond.cleanup19; CHECK-NEXT: ret20entry:21 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 022 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer23 br label %vector.body24 25vector.body: ; preds = %vector.body, %entry26 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]27 %0 = getelementptr inbounds i32, ptr %a, i64 %index28 %wide.load = load <4 x i32>, ptr %0, align 429 %1 = mul <4 x i32> %wide.load, %broadcast.splat30 store <4 x i32> %1, ptr %0, align 431 %index.next = add nuw i64 %index, 432 %2 = icmp eq i64 %index.next, 102433 br i1 %2, label %for.cond.cleanup, label %vector.body34 35for.cond.cleanup: ; preds = %vector.body36 ret void37}38 39define void @sink_splat_add(ptr nocapture %a, i32 signext %x) {40; CHECK-LABEL: sink_splat_add:41; CHECK: # %bb.0: # %entry42; CHECK-NEXT: lui a2, 143; CHECK-NEXT: add a2, a0, a244; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma45; CHECK-NEXT: .LBB1_1: # %vector.body46; CHECK-NEXT: # =>This Inner Loop Header: Depth=147; CHECK-NEXT: vle32.v v8, (a0)48; CHECK-NEXT: vadd.vx v8, v8, a149; CHECK-NEXT: vse32.v v8, (a0)50; CHECK-NEXT: addi a0, a0, 1651; CHECK-NEXT: bne a0, a2, .LBB1_152; CHECK-NEXT: # %bb.2: # %for.cond.cleanup53; CHECK-NEXT: ret54entry:55 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 056 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer57 br label %vector.body58 59vector.body: ; preds = %vector.body, %entry60 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]61 %0 = getelementptr inbounds i32, ptr %a, i64 %index62 %wide.load = load <4 x i32>, ptr %0, align 463 %1 = add <4 x i32> %wide.load, %broadcast.splat64 store <4 x i32> %1, ptr %0, align 465 %index.next = add nuw i64 %index, 466 %2 = icmp eq i64 %index.next, 102467 br i1 %2, label %for.cond.cleanup, label %vector.body68 69for.cond.cleanup: ; preds = %vector.body70 ret void71}72 73define void @sink_splat_sub(ptr nocapture %a, i32 signext %x) {74; CHECK-LABEL: sink_splat_sub:75; CHECK: # %bb.0: # %entry76; CHECK-NEXT: lui a2, 177; CHECK-NEXT: add a2, a0, a278; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma79; CHECK-NEXT: .LBB2_1: # %vector.body80; CHECK-NEXT: # =>This Inner Loop Header: Depth=181; CHECK-NEXT: vle32.v v8, (a0)82; CHECK-NEXT: vsub.vx v8, v8, a183; CHECK-NEXT: vse32.v v8, (a0)84; CHECK-NEXT: addi a0, a0, 1685; CHECK-NEXT: bne a0, a2, .LBB2_186; CHECK-NEXT: # %bb.2: # %for.cond.cleanup87; CHECK-NEXT: ret88entry:89 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 090 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer91 br label %vector.body92 93vector.body: ; preds = %vector.body, %entry94 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]95 %0 = getelementptr inbounds i32, ptr %a, i64 %index96 %wide.load = load <4 x i32>, ptr %0, align 497 %1 = sub <4 x i32> %wide.load, %broadcast.splat98 store <4 x i32> %1, ptr %0, align 499 %index.next = add nuw i64 %index, 4100 %2 = icmp eq i64 %index.next, 1024101 br i1 %2, label %for.cond.cleanup, label %vector.body102 103for.cond.cleanup: ; preds = %vector.body104 ret void105}106 107define void @sink_splat_rsub(ptr nocapture %a, i32 signext %x) {108; CHECK-LABEL: sink_splat_rsub:109; CHECK: # %bb.0: # %entry110; CHECK-NEXT: lui a2, 1111; CHECK-NEXT: add a2, a0, a2112; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma113; CHECK-NEXT: .LBB3_1: # %vector.body114; CHECK-NEXT: # =>This Inner Loop Header: Depth=1115; CHECK-NEXT: vle32.v v8, (a0)116; CHECK-NEXT: vrsub.vx v8, v8, a1117; CHECK-NEXT: vse32.v v8, (a0)118; CHECK-NEXT: addi a0, a0, 16119; CHECK-NEXT: bne a0, a2, .LBB3_1120; CHECK-NEXT: # %bb.2: # %for.cond.cleanup121; CHECK-NEXT: ret122entry:123 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0124 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer125 br label %vector.body126 127vector.body: ; preds = %vector.body, %entry128 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]129 %0 = getelementptr inbounds i32, ptr %a, i64 %index130 %wide.load = load <4 x i32>, ptr %0, align 4131 %1 = sub <4 x i32> %broadcast.splat, %wide.load132 store <4 x i32> %1, ptr %0, align 4133 %index.next = add nuw i64 %index, 4134 %2 = icmp eq i64 %index.next, 1024135 br i1 %2, label %for.cond.cleanup, label %vector.body136 137for.cond.cleanup: ; preds = %vector.body138 ret void139}140 141define void @sink_splat_and(ptr nocapture %a, i32 signext %x) {142; CHECK-LABEL: sink_splat_and:143; CHECK: # %bb.0: # %entry144; CHECK-NEXT: lui a2, 1145; CHECK-NEXT: add a2, a0, a2146; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma147; CHECK-NEXT: .LBB4_1: # %vector.body148; CHECK-NEXT: # =>This Inner Loop Header: Depth=1149; CHECK-NEXT: vle32.v v8, (a0)150; CHECK-NEXT: vand.vx v8, v8, a1151; CHECK-NEXT: vse32.v v8, (a0)152; CHECK-NEXT: addi a0, a0, 16153; CHECK-NEXT: bne a0, a2, .LBB4_1154; CHECK-NEXT: # %bb.2: # %for.cond.cleanup155; CHECK-NEXT: ret156entry:157 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0158 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer159 br label %vector.body160 161vector.body: ; preds = %vector.body, %entry162 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]163 %0 = getelementptr inbounds i32, ptr %a, i64 %index164 %wide.load = load <4 x i32>, ptr %0, align 4165 %1 = and <4 x i32> %wide.load, %broadcast.splat166 store <4 x i32> %1, ptr %0, align 4167 %index.next = add nuw i64 %index, 4168 %2 = icmp eq i64 %index.next, 1024169 br i1 %2, label %for.cond.cleanup, label %vector.body170 171for.cond.cleanup: ; preds = %vector.body172 ret void173}174 175define void @sink_splat_or(ptr nocapture %a, i32 signext %x) {176; CHECK-LABEL: sink_splat_or:177; CHECK: # %bb.0: # %entry178; CHECK-NEXT: lui a2, 1179; CHECK-NEXT: add a2, a0, a2180; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma181; CHECK-NEXT: .LBB5_1: # %vector.body182; CHECK-NEXT: # =>This Inner Loop Header: Depth=1183; CHECK-NEXT: vle32.v v8, (a0)184; CHECK-NEXT: vor.vx v8, v8, a1185; CHECK-NEXT: vse32.v v8, (a0)186; CHECK-NEXT: addi a0, a0, 16187; CHECK-NEXT: bne a0, a2, .LBB5_1188; CHECK-NEXT: # %bb.2: # %for.cond.cleanup189; CHECK-NEXT: ret190entry:191 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0192 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer193 br label %vector.body194 195vector.body: ; preds = %vector.body, %entry196 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]197 %0 = getelementptr inbounds i32, ptr %a, i64 %index198 %wide.load = load <4 x i32>, ptr %0, align 4199 %1 = or <4 x i32> %wide.load, %broadcast.splat200 store <4 x i32> %1, ptr %0, align 4201 %index.next = add nuw i64 %index, 4202 %2 = icmp eq i64 %index.next, 1024203 br i1 %2, label %for.cond.cleanup, label %vector.body204 205for.cond.cleanup: ; preds = %vector.body206 ret void207}208 209define void @sink_splat_xor(ptr nocapture %a, i32 signext %x) {210; CHECK-LABEL: sink_splat_xor:211; CHECK: # %bb.0: # %entry212; CHECK-NEXT: lui a2, 1213; CHECK-NEXT: add a2, a0, a2214; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma215; CHECK-NEXT: .LBB6_1: # %vector.body216; CHECK-NEXT: # =>This Inner Loop Header: Depth=1217; CHECK-NEXT: vle32.v v8, (a0)218; CHECK-NEXT: vxor.vx v8, v8, a1219; CHECK-NEXT: vse32.v v8, (a0)220; CHECK-NEXT: addi a0, a0, 16221; CHECK-NEXT: bne a0, a2, .LBB6_1222; CHECK-NEXT: # %bb.2: # %for.cond.cleanup223; CHECK-NEXT: ret224entry:225 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0226 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer227 br label %vector.body228 229vector.body: ; preds = %vector.body, %entry230 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]231 %0 = getelementptr inbounds i32, ptr %a, i64 %index232 %wide.load = load <4 x i32>, ptr %0, align 4233 %1 = xor <4 x i32> %wide.load, %broadcast.splat234 store <4 x i32> %1, ptr %0, align 4235 %index.next = add nuw i64 %index, 4236 %2 = icmp eq i64 %index.next, 1024237 br i1 %2, label %for.cond.cleanup, label %vector.body238 239for.cond.cleanup: ; preds = %vector.body240 ret void241}242 243define void @sink_splat_mul_scalable(ptr nocapture %a, i32 signext %x) {244; CHECK-LABEL: sink_splat_mul_scalable:245; CHECK: # %bb.0: # %entry246; CHECK-NEXT: csrr a5, vlenb247; CHECK-NEXT: srli a3, a5, 1248; CHECK-NEXT: li a2, 1024249; CHECK-NEXT: bgeu a2, a3, .LBB7_2250; CHECK-NEXT: # %bb.1:251; CHECK-NEXT: li a2, 0252; CHECK-NEXT: j .LBB7_5253; CHECK-NEXT: .LBB7_2: # %vector.ph254; CHECK-NEXT: addi a2, a3, -1255; CHECK-NEXT: andi a4, a2, 1024256; CHECK-NEXT: xori a2, a4, 1024257; CHECK-NEXT: slli a5, a5, 1258; CHECK-NEXT: mv a6, a0259; CHECK-NEXT: mv a7, a2260; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma261; CHECK-NEXT: .LBB7_3: # %vector.body262; CHECK-NEXT: # =>This Inner Loop Header: Depth=1263; CHECK-NEXT: vl2re32.v v8, (a6)264; CHECK-NEXT: sub a7, a7, a3265; CHECK-NEXT: vmul.vx v8, v8, a1266; CHECK-NEXT: vs2r.v v8, (a6)267; CHECK-NEXT: add a6, a6, a5268; CHECK-NEXT: bnez a7, .LBB7_3269; CHECK-NEXT: # %bb.4: # %middle.block270; CHECK-NEXT: beqz a4, .LBB7_7271; CHECK-NEXT: .LBB7_5: # %for.body.preheader272; CHECK-NEXT: slli a2, a2, 2273; CHECK-NEXT: lui a3, 1274; CHECK-NEXT: add a2, a0, a2275; CHECK-NEXT: add a0, a0, a3276; CHECK-NEXT: .LBB7_6: # %for.body277; CHECK-NEXT: # =>This Inner Loop Header: Depth=1278; CHECK-NEXT: lw a3, 0(a2)279; CHECK-NEXT: mul a3, a3, a1280; CHECK-NEXT: sw a3, 0(a2)281; CHECK-NEXT: addi a2, a2, 4282; CHECK-NEXT: bne a2, a0, .LBB7_6283; CHECK-NEXT: .LBB7_7: # %for.cond.cleanup284; CHECK-NEXT: ret285entry:286 %0 = call i64 @llvm.vscale.i64()287 %1 = shl i64 %0, 2288 %min.iters.check = icmp ugt i64 %1, 1024289 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph290 291vector.ph: ; preds = %entry292 %2 = call i64 @llvm.vscale.i64()293 %3 = shl i64 %2, 2294 %n.mod.vf = urem i64 1024, %3295 %n.vec = sub nsw i64 1024, %n.mod.vf296 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0297 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer298 %4 = call i64 @llvm.vscale.i64()299 %5 = shl i64 %4, 2300 br label %vector.body301 302vector.body: ; preds = %vector.body, %vector.ph303 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]304 %6 = getelementptr inbounds i32, ptr %a, i64 %index305 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4306 %7 = mul <vscale x 4 x i32> %wide.load, %broadcast.splat307 store <vscale x 4 x i32> %7, ptr %6, align 4308 %index.next = add nuw i64 %index, %5309 %8 = icmp eq i64 %index.next, %n.vec310 br i1 %8, label %middle.block, label %vector.body311 312middle.block: ; preds = %vector.body313 %cmp.n = icmp eq i64 %n.mod.vf, 0314 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader315 316for.body.preheader: ; preds = %entry, %middle.block317 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]318 br label %for.body319 320for.cond.cleanup: ; preds = %for.body, %middle.block321 ret void322 323for.body: ; preds = %for.body.preheader, %for.body324 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]325 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv326 %9 = load i32, ptr %arrayidx, align 4327 %mul = mul i32 %9, %x328 store i32 %mul, ptr %arrayidx, align 4329 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1330 %cmp.not = icmp eq i64 %indvars.iv.next, 1024331 br i1 %cmp.not, label %for.cond.cleanup, label %for.body332}333 334define void @sink_splat_add_scalable(ptr nocapture %a, i32 signext %x) {335; CHECK-LABEL: sink_splat_add_scalable:336; CHECK: # %bb.0: # %entry337; CHECK-NEXT: csrr a5, vlenb338; CHECK-NEXT: srli a3, a5, 1339; CHECK-NEXT: li a2, 1024340; CHECK-NEXT: bgeu a2, a3, .LBB8_2341; CHECK-NEXT: # %bb.1:342; CHECK-NEXT: li a2, 0343; CHECK-NEXT: j .LBB8_5344; CHECK-NEXT: .LBB8_2: # %vector.ph345; CHECK-NEXT: addi a2, a3, -1346; CHECK-NEXT: andi a4, a2, 1024347; CHECK-NEXT: xori a2, a4, 1024348; CHECK-NEXT: slli a5, a5, 1349; CHECK-NEXT: mv a6, a0350; CHECK-NEXT: mv a7, a2351; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma352; CHECK-NEXT: .LBB8_3: # %vector.body353; CHECK-NEXT: # =>This Inner Loop Header: Depth=1354; CHECK-NEXT: vl2re32.v v8, (a6)355; CHECK-NEXT: sub a7, a7, a3356; CHECK-NEXT: vadd.vx v8, v8, a1357; CHECK-NEXT: vs2r.v v8, (a6)358; CHECK-NEXT: add a6, a6, a5359; CHECK-NEXT: bnez a7, .LBB8_3360; CHECK-NEXT: # %bb.4: # %middle.block361; CHECK-NEXT: beqz a4, .LBB8_7362; CHECK-NEXT: .LBB8_5: # %for.body.preheader363; CHECK-NEXT: slli a2, a2, 2364; CHECK-NEXT: lui a3, 1365; CHECK-NEXT: add a2, a0, a2366; CHECK-NEXT: add a0, a0, a3367; CHECK-NEXT: .LBB8_6: # %for.body368; CHECK-NEXT: # =>This Inner Loop Header: Depth=1369; CHECK-NEXT: lw a3, 0(a2)370; CHECK-NEXT: add a3, a3, a1371; CHECK-NEXT: sw a3, 0(a2)372; CHECK-NEXT: addi a2, a2, 4373; CHECK-NEXT: bne a2, a0, .LBB8_6374; CHECK-NEXT: .LBB8_7: # %for.cond.cleanup375; CHECK-NEXT: ret376entry:377 %0 = call i64 @llvm.vscale.i64()378 %1 = shl i64 %0, 2379 %min.iters.check = icmp ugt i64 %1, 1024380 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph381 382vector.ph: ; preds = %entry383 %2 = call i64 @llvm.vscale.i64()384 %3 = shl i64 %2, 2385 %n.mod.vf = urem i64 1024, %3386 %n.vec = sub nsw i64 1024, %n.mod.vf387 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0388 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer389 %4 = call i64 @llvm.vscale.i64()390 %5 = shl i64 %4, 2391 br label %vector.body392 393vector.body: ; preds = %vector.body, %vector.ph394 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]395 %6 = getelementptr inbounds i32, ptr %a, i64 %index396 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4397 %7 = add <vscale x 4 x i32> %wide.load, %broadcast.splat398 store <vscale x 4 x i32> %7, ptr %6, align 4399 %index.next = add nuw i64 %index, %5400 %8 = icmp eq i64 %index.next, %n.vec401 br i1 %8, label %middle.block, label %vector.body402 403middle.block: ; preds = %vector.body404 %cmp.n = icmp eq i64 %n.mod.vf, 0405 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader406 407for.body.preheader: ; preds = %entry, %middle.block408 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]409 br label %for.body410 411for.cond.cleanup: ; preds = %for.body, %middle.block412 ret void413 414for.body: ; preds = %for.body.preheader, %for.body415 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]416 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv417 %9 = load i32, ptr %arrayidx, align 4418 %add = add i32 %9, %x419 store i32 %add, ptr %arrayidx, align 4420 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1421 %cmp.not = icmp eq i64 %indvars.iv.next, 1024422 br i1 %cmp.not, label %for.cond.cleanup, label %for.body423}424 425define void @sink_splat_sub_scalable(ptr nocapture %a, i32 signext %x) {426; CHECK-LABEL: sink_splat_sub_scalable:427; CHECK: # %bb.0: # %entry428; CHECK-NEXT: csrr a5, vlenb429; CHECK-NEXT: srli a3, a5, 1430; CHECK-NEXT: li a2, 1024431; CHECK-NEXT: bgeu a2, a3, .LBB9_2432; CHECK-NEXT: # %bb.1:433; CHECK-NEXT: li a2, 0434; CHECK-NEXT: j .LBB9_5435; CHECK-NEXT: .LBB9_2: # %vector.ph436; CHECK-NEXT: addi a2, a3, -1437; CHECK-NEXT: andi a4, a2, 1024438; CHECK-NEXT: xori a2, a4, 1024439; CHECK-NEXT: slli a5, a5, 1440; CHECK-NEXT: mv a6, a0441; CHECK-NEXT: mv a7, a2442; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma443; CHECK-NEXT: .LBB9_3: # %vector.body444; CHECK-NEXT: # =>This Inner Loop Header: Depth=1445; CHECK-NEXT: vl2re32.v v8, (a6)446; CHECK-NEXT: sub a7, a7, a3447; CHECK-NEXT: vsub.vx v8, v8, a1448; CHECK-NEXT: vs2r.v v8, (a6)449; CHECK-NEXT: add a6, a6, a5450; CHECK-NEXT: bnez a7, .LBB9_3451; CHECK-NEXT: # %bb.4: # %middle.block452; CHECK-NEXT: beqz a4, .LBB9_7453; CHECK-NEXT: .LBB9_5: # %for.body.preheader454; CHECK-NEXT: slli a2, a2, 2455; CHECK-NEXT: lui a3, 1456; CHECK-NEXT: add a2, a0, a2457; CHECK-NEXT: add a0, a0, a3458; CHECK-NEXT: .LBB9_6: # %for.body459; CHECK-NEXT: # =>This Inner Loop Header: Depth=1460; CHECK-NEXT: lw a3, 0(a2)461; CHECK-NEXT: add a3, a3, a1462; CHECK-NEXT: sw a3, 0(a2)463; CHECK-NEXT: addi a2, a2, 4464; CHECK-NEXT: bne a2, a0, .LBB9_6465; CHECK-NEXT: .LBB9_7: # %for.cond.cleanup466; CHECK-NEXT: ret467entry:468 %0 = call i64 @llvm.vscale.i64()469 %1 = shl i64 %0, 2470 %min.iters.check = icmp ugt i64 %1, 1024471 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph472 473vector.ph: ; preds = %entry474 %2 = call i64 @llvm.vscale.i64()475 %3 = shl i64 %2, 2476 %n.mod.vf = urem i64 1024, %3477 %n.vec = sub nsw i64 1024, %n.mod.vf478 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0479 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer480 %4 = call i64 @llvm.vscale.i64()481 %5 = shl i64 %4, 2482 br label %vector.body483 484vector.body: ; preds = %vector.body, %vector.ph485 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]486 %6 = getelementptr inbounds i32, ptr %a, i64 %index487 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4488 %7 = sub <vscale x 4 x i32> %wide.load, %broadcast.splat489 store <vscale x 4 x i32> %7, ptr %6, align 4490 %index.next = add nuw i64 %index, %5491 %8 = icmp eq i64 %index.next, %n.vec492 br i1 %8, label %middle.block, label %vector.body493 494middle.block: ; preds = %vector.body495 %cmp.n = icmp eq i64 %n.mod.vf, 0496 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader497 498for.body.preheader: ; preds = %entry, %middle.block499 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]500 br label %for.body501 502for.cond.cleanup: ; preds = %for.body, %middle.block503 ret void504 505for.body: ; preds = %for.body.preheader, %for.body506 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]507 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv508 %9 = load i32, ptr %arrayidx, align 4509 %add = add i32 %9, %x510 store i32 %add, ptr %arrayidx, align 4511 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1512 %cmp.not = icmp eq i64 %indvars.iv.next, 1024513 br i1 %cmp.not, label %for.cond.cleanup, label %for.body514}515 516define void @sink_splat_rsub_scalable(ptr nocapture %a, i32 signext %x) {517; CHECK-LABEL: sink_splat_rsub_scalable:518; CHECK: # %bb.0: # %entry519; CHECK-NEXT: csrr a5, vlenb520; CHECK-NEXT: srli a3, a5, 1521; CHECK-NEXT: li a2, 1024522; CHECK-NEXT: bgeu a2, a3, .LBB10_2523; CHECK-NEXT: # %bb.1:524; CHECK-NEXT: li a2, 0525; CHECK-NEXT: j .LBB10_5526; CHECK-NEXT: .LBB10_2: # %vector.ph527; CHECK-NEXT: addi a2, a3, -1528; CHECK-NEXT: andi a4, a2, 1024529; CHECK-NEXT: xori a2, a4, 1024530; CHECK-NEXT: slli a5, a5, 1531; CHECK-NEXT: mv a6, a0532; CHECK-NEXT: mv a7, a2533; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma534; CHECK-NEXT: .LBB10_3: # %vector.body535; CHECK-NEXT: # =>This Inner Loop Header: Depth=1536; CHECK-NEXT: vl2re32.v v8, (a6)537; CHECK-NEXT: sub a7, a7, a3538; CHECK-NEXT: vrsub.vx v8, v8, a1539; CHECK-NEXT: vs2r.v v8, (a6)540; CHECK-NEXT: add a6, a6, a5541; CHECK-NEXT: bnez a7, .LBB10_3542; CHECK-NEXT: # %bb.4: # %middle.block543; CHECK-NEXT: beqz a4, .LBB10_7544; CHECK-NEXT: .LBB10_5: # %for.body.preheader545; CHECK-NEXT: slli a2, a2, 2546; CHECK-NEXT: lui a3, 1547; CHECK-NEXT: add a2, a0, a2548; CHECK-NEXT: add a0, a0, a3549; CHECK-NEXT: .LBB10_6: # %for.body550; CHECK-NEXT: # =>This Inner Loop Header: Depth=1551; CHECK-NEXT: lw a3, 0(a2)552; CHECK-NEXT: sub a3, a1, a3553; CHECK-NEXT: sw a3, 0(a2)554; CHECK-NEXT: addi a2, a2, 4555; CHECK-NEXT: bne a2, a0, .LBB10_6556; CHECK-NEXT: .LBB10_7: # %for.cond.cleanup557; CHECK-NEXT: ret558entry:559 %0 = call i64 @llvm.vscale.i64()560 %1 = shl i64 %0, 2561 %min.iters.check = icmp ugt i64 %1, 1024562 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph563 564vector.ph: ; preds = %entry565 %2 = call i64 @llvm.vscale.i64()566 %3 = shl i64 %2, 2567 %n.mod.vf = urem i64 1024, %3568 %n.vec = sub nsw i64 1024, %n.mod.vf569 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0570 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer571 %4 = call i64 @llvm.vscale.i64()572 %5 = shl i64 %4, 2573 br label %vector.body574 575vector.body: ; preds = %vector.body, %vector.ph576 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]577 %6 = getelementptr inbounds i32, ptr %a, i64 %index578 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4579 %7 = sub <vscale x 4 x i32> %broadcast.splat, %wide.load580 store <vscale x 4 x i32> %7, ptr %6, align 4581 %index.next = add nuw i64 %index, %5582 %8 = icmp eq i64 %index.next, %n.vec583 br i1 %8, label %middle.block, label %vector.body584 585middle.block: ; preds = %vector.body586 %cmp.n = icmp eq i64 %n.mod.vf, 0587 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader588 589for.body.preheader: ; preds = %entry, %middle.block590 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]591 br label %for.body592 593for.cond.cleanup: ; preds = %for.body, %middle.block594 ret void595 596for.body: ; preds = %for.body.preheader, %for.body597 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]598 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv599 %9 = load i32, ptr %arrayidx, align 4600 %add = sub i32 %x, %9601 store i32 %add, ptr %arrayidx, align 4602 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1603 %cmp.not = icmp eq i64 %indvars.iv.next, 1024604 br i1 %cmp.not, label %for.cond.cleanup, label %for.body605}606 607define void @sink_splat_and_scalable(ptr nocapture %a, i32 signext %x) {608; CHECK-LABEL: sink_splat_and_scalable:609; CHECK: # %bb.0: # %entry610; CHECK-NEXT: csrr a5, vlenb611; CHECK-NEXT: srli a3, a5, 1612; CHECK-NEXT: li a2, 1024613; CHECK-NEXT: bgeu a2, a3, .LBB11_2614; CHECK-NEXT: # %bb.1:615; CHECK-NEXT: li a2, 0616; CHECK-NEXT: j .LBB11_5617; CHECK-NEXT: .LBB11_2: # %vector.ph618; CHECK-NEXT: addi a2, a3, -1619; CHECK-NEXT: andi a4, a2, 1024620; CHECK-NEXT: xori a2, a4, 1024621; CHECK-NEXT: slli a5, a5, 1622; CHECK-NEXT: mv a6, a0623; CHECK-NEXT: mv a7, a2624; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma625; CHECK-NEXT: .LBB11_3: # %vector.body626; CHECK-NEXT: # =>This Inner Loop Header: Depth=1627; CHECK-NEXT: vl2re32.v v8, (a6)628; CHECK-NEXT: sub a7, a7, a3629; CHECK-NEXT: vand.vx v8, v8, a1630; CHECK-NEXT: vs2r.v v8, (a6)631; CHECK-NEXT: add a6, a6, a5632; CHECK-NEXT: bnez a7, .LBB11_3633; CHECK-NEXT: # %bb.4: # %middle.block634; CHECK-NEXT: beqz a4, .LBB11_7635; CHECK-NEXT: .LBB11_5: # %for.body.preheader636; CHECK-NEXT: slli a2, a2, 2637; CHECK-NEXT: lui a3, 1638; CHECK-NEXT: add a2, a0, a2639; CHECK-NEXT: add a0, a0, a3640; CHECK-NEXT: .LBB11_6: # %for.body641; CHECK-NEXT: # =>This Inner Loop Header: Depth=1642; CHECK-NEXT: lw a3, 0(a2)643; CHECK-NEXT: and a3, a3, a1644; CHECK-NEXT: sw a3, 0(a2)645; CHECK-NEXT: addi a2, a2, 4646; CHECK-NEXT: bne a2, a0, .LBB11_6647; CHECK-NEXT: .LBB11_7: # %for.cond.cleanup648; CHECK-NEXT: ret649entry:650 %0 = call i64 @llvm.vscale.i64()651 %1 = shl i64 %0, 2652 %min.iters.check = icmp ugt i64 %1, 1024653 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph654 655vector.ph: ; preds = %entry656 %2 = call i64 @llvm.vscale.i64()657 %3 = shl i64 %2, 2658 %n.mod.vf = urem i64 1024, %3659 %n.vec = sub nsw i64 1024, %n.mod.vf660 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0661 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer662 %4 = call i64 @llvm.vscale.i64()663 %5 = shl i64 %4, 2664 br label %vector.body665 666vector.body: ; preds = %vector.body, %vector.ph667 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]668 %6 = getelementptr inbounds i32, ptr %a, i64 %index669 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4670 %7 = and <vscale x 4 x i32> %wide.load, %broadcast.splat671 store <vscale x 4 x i32> %7, ptr %6, align 4672 %index.next = add nuw i64 %index, %5673 %8 = icmp eq i64 %index.next, %n.vec674 br i1 %8, label %middle.block, label %vector.body675 676middle.block: ; preds = %vector.body677 %cmp.n = icmp eq i64 %n.mod.vf, 0678 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader679 680for.body.preheader: ; preds = %entry, %middle.block681 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]682 br label %for.body683 684for.cond.cleanup: ; preds = %for.body, %middle.block685 ret void686 687for.body: ; preds = %for.body.preheader, %for.body688 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]689 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv690 %9 = load i32, ptr %arrayidx, align 4691 %and = and i32 %9, %x692 store i32 %and, ptr %arrayidx, align 4693 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1694 %cmp.not = icmp eq i64 %indvars.iv.next, 1024695 br i1 %cmp.not, label %for.cond.cleanup, label %for.body696}697 698define void @sink_splat_or_scalable(ptr nocapture %a, i32 signext %x) {699; CHECK-LABEL: sink_splat_or_scalable:700; CHECK: # %bb.0: # %entry701; CHECK-NEXT: csrr a5, vlenb702; CHECK-NEXT: srli a3, a5, 1703; CHECK-NEXT: li a2, 1024704; CHECK-NEXT: bgeu a2, a3, .LBB12_2705; CHECK-NEXT: # %bb.1:706; CHECK-NEXT: li a2, 0707; CHECK-NEXT: j .LBB12_5708; CHECK-NEXT: .LBB12_2: # %vector.ph709; CHECK-NEXT: addi a2, a3, -1710; CHECK-NEXT: andi a4, a2, 1024711; CHECK-NEXT: xori a2, a4, 1024712; CHECK-NEXT: slli a5, a5, 1713; CHECK-NEXT: mv a6, a0714; CHECK-NEXT: mv a7, a2715; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma716; CHECK-NEXT: .LBB12_3: # %vector.body717; CHECK-NEXT: # =>This Inner Loop Header: Depth=1718; CHECK-NEXT: vl2re32.v v8, (a6)719; CHECK-NEXT: sub a7, a7, a3720; CHECK-NEXT: vor.vx v8, v8, a1721; CHECK-NEXT: vs2r.v v8, (a6)722; CHECK-NEXT: add a6, a6, a5723; CHECK-NEXT: bnez a7, .LBB12_3724; CHECK-NEXT: # %bb.4: # %middle.block725; CHECK-NEXT: beqz a4, .LBB12_7726; CHECK-NEXT: .LBB12_5: # %for.body.preheader727; CHECK-NEXT: slli a2, a2, 2728; CHECK-NEXT: lui a3, 1729; CHECK-NEXT: add a2, a0, a2730; CHECK-NEXT: add a0, a0, a3731; CHECK-NEXT: .LBB12_6: # %for.body732; CHECK-NEXT: # =>This Inner Loop Header: Depth=1733; CHECK-NEXT: lw a3, 0(a2)734; CHECK-NEXT: or a3, a3, a1735; CHECK-NEXT: sw a3, 0(a2)736; CHECK-NEXT: addi a2, a2, 4737; CHECK-NEXT: bne a2, a0, .LBB12_6738; CHECK-NEXT: .LBB12_7: # %for.cond.cleanup739; CHECK-NEXT: ret740entry:741 %0 = call i64 @llvm.vscale.i64()742 %1 = shl i64 %0, 2743 %min.iters.check = icmp ugt i64 %1, 1024744 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph745 746vector.ph: ; preds = %entry747 %2 = call i64 @llvm.vscale.i64()748 %3 = shl i64 %2, 2749 %n.mod.vf = urem i64 1024, %3750 %n.vec = sub nsw i64 1024, %n.mod.vf751 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0752 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer753 %4 = call i64 @llvm.vscale.i64()754 %5 = shl i64 %4, 2755 br label %vector.body756 757vector.body: ; preds = %vector.body, %vector.ph758 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]759 %6 = getelementptr inbounds i32, ptr %a, i64 %index760 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4761 %7 = or <vscale x 4 x i32> %wide.load, %broadcast.splat762 store <vscale x 4 x i32> %7, ptr %6, align 4763 %index.next = add nuw i64 %index, %5764 %8 = icmp eq i64 %index.next, %n.vec765 br i1 %8, label %middle.block, label %vector.body766 767middle.block: ; preds = %vector.body768 %cmp.n = icmp eq i64 %n.mod.vf, 0769 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader770 771for.body.preheader: ; preds = %entry, %middle.block772 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]773 br label %for.body774 775for.cond.cleanup: ; preds = %for.body, %middle.block776 ret void777 778for.body: ; preds = %for.body.preheader, %for.body779 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]780 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv781 %9 = load i32, ptr %arrayidx, align 4782 %or = or i32 %9, %x783 store i32 %or, ptr %arrayidx, align 4784 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1785 %cmp.not = icmp eq i64 %indvars.iv.next, 1024786 br i1 %cmp.not, label %for.cond.cleanup, label %for.body787}788 789define void @sink_splat_xor_scalable(ptr nocapture %a, i32 signext %x) {790; CHECK-LABEL: sink_splat_xor_scalable:791; CHECK: # %bb.0: # %entry792; CHECK-NEXT: csrr a5, vlenb793; CHECK-NEXT: srli a3, a5, 1794; CHECK-NEXT: li a2, 1024795; CHECK-NEXT: bgeu a2, a3, .LBB13_2796; CHECK-NEXT: # %bb.1:797; CHECK-NEXT: li a2, 0798; CHECK-NEXT: j .LBB13_5799; CHECK-NEXT: .LBB13_2: # %vector.ph800; CHECK-NEXT: addi a2, a3, -1801; CHECK-NEXT: andi a4, a2, 1024802; CHECK-NEXT: xori a2, a4, 1024803; CHECK-NEXT: slli a5, a5, 1804; CHECK-NEXT: mv a6, a0805; CHECK-NEXT: mv a7, a2806; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma807; CHECK-NEXT: .LBB13_3: # %vector.body808; CHECK-NEXT: # =>This Inner Loop Header: Depth=1809; CHECK-NEXT: vl2re32.v v8, (a6)810; CHECK-NEXT: sub a7, a7, a3811; CHECK-NEXT: vxor.vx v8, v8, a1812; CHECK-NEXT: vs2r.v v8, (a6)813; CHECK-NEXT: add a6, a6, a5814; CHECK-NEXT: bnez a7, .LBB13_3815; CHECK-NEXT: # %bb.4: # %middle.block816; CHECK-NEXT: beqz a4, .LBB13_7817; CHECK-NEXT: .LBB13_5: # %for.body.preheader818; CHECK-NEXT: slli a2, a2, 2819; CHECK-NEXT: lui a3, 1820; CHECK-NEXT: add a2, a0, a2821; CHECK-NEXT: add a0, a0, a3822; CHECK-NEXT: .LBB13_6: # %for.body823; CHECK-NEXT: # =>This Inner Loop Header: Depth=1824; CHECK-NEXT: lw a3, 0(a2)825; CHECK-NEXT: xor a3, a3, a1826; CHECK-NEXT: sw a3, 0(a2)827; CHECK-NEXT: addi a2, a2, 4828; CHECK-NEXT: bne a2, a0, .LBB13_6829; CHECK-NEXT: .LBB13_7: # %for.cond.cleanup830; CHECK-NEXT: ret831entry:832 %0 = call i64 @llvm.vscale.i64()833 %1 = shl i64 %0, 2834 %min.iters.check = icmp ugt i64 %1, 1024835 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph836 837vector.ph: ; preds = %entry838 %2 = call i64 @llvm.vscale.i64()839 %3 = shl i64 %2, 2840 %n.mod.vf = urem i64 1024, %3841 %n.vec = sub nsw i64 1024, %n.mod.vf842 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 0843 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer844 %4 = call i64 @llvm.vscale.i64()845 %5 = shl i64 %4, 2846 br label %vector.body847 848vector.body: ; preds = %vector.body, %vector.ph849 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]850 %6 = getelementptr inbounds i32, ptr %a, i64 %index851 %wide.load = load <vscale x 4 x i32>, ptr %6, align 4852 %7 = xor <vscale x 4 x i32> %wide.load, %broadcast.splat853 store <vscale x 4 x i32> %7, ptr %6, align 4854 %index.next = add nuw i64 %index, %5855 %8 = icmp eq i64 %index.next, %n.vec856 br i1 %8, label %middle.block, label %vector.body857 858middle.block: ; preds = %vector.body859 %cmp.n = icmp eq i64 %n.mod.vf, 0860 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader861 862for.body.preheader: ; preds = %entry, %middle.block863 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]864 br label %for.body865 866for.cond.cleanup: ; preds = %for.body, %middle.block867 ret void868 869for.body: ; preds = %for.body.preheader, %for.body870 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]871 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv872 %9 = load i32, ptr %arrayidx, align 4873 %xor = xor i32 %9, %x874 store i32 %xor, ptr %arrayidx, align 4875 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1876 %cmp.not = icmp eq i64 %indvars.iv.next, 1024877 br i1 %cmp.not, label %for.cond.cleanup, label %for.body878}879 880define void @sink_splat_shl(ptr nocapture %a, i32 signext %x) {881; CHECK-LABEL: sink_splat_shl:882; CHECK: # %bb.0: # %entry883; CHECK-NEXT: lui a2, 1884; CHECK-NEXT: add a2, a0, a2885; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma886; CHECK-NEXT: .LBB14_1: # %vector.body887; CHECK-NEXT: # =>This Inner Loop Header: Depth=1888; CHECK-NEXT: vle32.v v8, (a0)889; CHECK-NEXT: vsll.vx v8, v8, a1890; CHECK-NEXT: vse32.v v8, (a0)891; CHECK-NEXT: addi a0, a0, 16892; CHECK-NEXT: bne a0, a2, .LBB14_1893; CHECK-NEXT: # %bb.2: # %for.cond.cleanup894; CHECK-NEXT: ret895entry:896 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0897 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer898 br label %vector.body899 900vector.body: ; preds = %vector.body, %entry901 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]902 %0 = getelementptr inbounds i32, ptr %a, i64 %index903 %wide.load = load <4 x i32>, ptr %0, align 4904 %1 = shl <4 x i32> %wide.load, %broadcast.splat905 store <4 x i32> %1, ptr %0, align 4906 %index.next = add nuw i64 %index, 4907 %2 = icmp eq i64 %index.next, 1024908 br i1 %2, label %for.cond.cleanup, label %vector.body909 910for.cond.cleanup: ; preds = %vector.body911 ret void912}913 914define void @sink_splat_lshr(ptr nocapture %a, i32 signext %x) {915; CHECK-LABEL: sink_splat_lshr:916; CHECK: # %bb.0: # %entry917; CHECK-NEXT: lui a2, 1918; CHECK-NEXT: add a2, a0, a2919; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma920; CHECK-NEXT: .LBB15_1: # %vector.body921; CHECK-NEXT: # =>This Inner Loop Header: Depth=1922; CHECK-NEXT: vle32.v v8, (a0)923; CHECK-NEXT: vsrl.vx v8, v8, a1924; CHECK-NEXT: vse32.v v8, (a0)925; CHECK-NEXT: addi a0, a0, 16926; CHECK-NEXT: bne a0, a2, .LBB15_1927; CHECK-NEXT: # %bb.2: # %for.cond.cleanup928; CHECK-NEXT: ret929entry:930 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0931 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer932 br label %vector.body933 934vector.body: ; preds = %vector.body, %entry935 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]936 %0 = getelementptr inbounds i32, ptr %a, i64 %index937 %wide.load = load <4 x i32>, ptr %0, align 4938 %1 = lshr <4 x i32> %wide.load, %broadcast.splat939 store <4 x i32> %1, ptr %0, align 4940 %index.next = add nuw i64 %index, 4941 %2 = icmp eq i64 %index.next, 1024942 br i1 %2, label %for.cond.cleanup, label %vector.body943 944for.cond.cleanup: ; preds = %vector.body945 ret void946}947 948define void @sink_splat_ashr(ptr nocapture %a, i32 signext %x) {949; CHECK-LABEL: sink_splat_ashr:950; CHECK: # %bb.0: # %entry951; CHECK-NEXT: lui a2, 1952; CHECK-NEXT: add a2, a0, a2953; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma954; CHECK-NEXT: .LBB16_1: # %vector.body955; CHECK-NEXT: # =>This Inner Loop Header: Depth=1956; CHECK-NEXT: vle32.v v8, (a0)957; CHECK-NEXT: vsra.vx v8, v8, a1958; CHECK-NEXT: vse32.v v8, (a0)959; CHECK-NEXT: addi a0, a0, 16960; CHECK-NEXT: bne a0, a2, .LBB16_1961; CHECK-NEXT: # %bb.2: # %for.cond.cleanup962; CHECK-NEXT: ret963entry:964 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 0965 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer966 br label %vector.body967 968vector.body: ; preds = %vector.body, %entry969 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]970 %0 = getelementptr inbounds i32, ptr %a, i64 %index971 %wide.load = load <4 x i32>, ptr %0, align 4972 %1 = ashr <4 x i32> %wide.load, %broadcast.splat973 store <4 x i32> %1, ptr %0, align 4974 %index.next = add nuw i64 %index, 4975 %2 = icmp eq i64 %index.next, 1024976 br i1 %2, label %for.cond.cleanup, label %vector.body977 978for.cond.cleanup: ; preds = %vector.body979 ret void980}981 982define void @sink_splat_shl_scalable(ptr nocapture %a, i32 signext %x) {983; CHECK-LABEL: sink_splat_shl_scalable:984; CHECK: # %bb.0: # %entry985; CHECK-NEXT: csrr a5, vlenb986; CHECK-NEXT: srli a3, a5, 1987; CHECK-NEXT: li a2, 1024988; CHECK-NEXT: bgeu a2, a3, .LBB17_2989; CHECK-NEXT: # %bb.1:990; CHECK-NEXT: li a2, 0991; CHECK-NEXT: j .LBB17_5992; CHECK-NEXT: .LBB17_2: # %vector.ph993; CHECK-NEXT: addi a2, a3, -1994; CHECK-NEXT: andi a4, a2, 1024995; CHECK-NEXT: xori a2, a4, 1024996; CHECK-NEXT: slli a5, a5, 1997; CHECK-NEXT: mv a6, a0998; CHECK-NEXT: mv a7, a2999; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma1000; CHECK-NEXT: .LBB17_3: # %vector.body1001; CHECK-NEXT: # =>This Inner Loop Header: Depth=11002; CHECK-NEXT: vl2re32.v v8, (a6)1003; CHECK-NEXT: sub a7, a7, a31004; CHECK-NEXT: vsll.vx v8, v8, a11005; CHECK-NEXT: vs2r.v v8, (a6)1006; CHECK-NEXT: add a6, a6, a51007; CHECK-NEXT: bnez a7, .LBB17_31008; CHECK-NEXT: # %bb.4: # %middle.block1009; CHECK-NEXT: beqz a4, .LBB17_71010; CHECK-NEXT: .LBB17_5: # %for.body.preheader1011; CHECK-NEXT: slli a2, a2, 21012; CHECK-NEXT: lui a3, 11013; CHECK-NEXT: add a2, a0, a21014; CHECK-NEXT: add a0, a0, a31015; CHECK-NEXT: .LBB17_6: # %for.body1016; CHECK-NEXT: # =>This Inner Loop Header: Depth=11017; CHECK-NEXT: lw a3, 0(a2)1018; CHECK-NEXT: sllw a3, a3, a11019; CHECK-NEXT: sw a3, 0(a2)1020; CHECK-NEXT: addi a2, a2, 41021; CHECK-NEXT: bne a2, a0, .LBB17_61022; CHECK-NEXT: .LBB17_7: # %for.cond.cleanup1023; CHECK-NEXT: ret1024entry:1025 %0 = call i64 @llvm.vscale.i64()1026 %1 = shl i64 %0, 21027 %min.iters.check = icmp ugt i64 %1, 10241028 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1029 1030vector.ph: ; preds = %entry1031 %2 = call i64 @llvm.vscale.i64()1032 %3 = shl i64 %2, 21033 %n.mod.vf = urem i64 1024, %31034 %n.vec = sub nsw i64 1024, %n.mod.vf1035 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 01036 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer1037 %4 = call i64 @llvm.vscale.i64()1038 %5 = shl i64 %4, 21039 br label %vector.body1040 1041vector.body: ; preds = %vector.body, %vector.ph1042 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1043 %6 = getelementptr inbounds i32, ptr %a, i64 %index1044 %wide.load = load <vscale x 4 x i32>, ptr %6, align 41045 %7 = shl <vscale x 4 x i32> %wide.load, %broadcast.splat1046 store <vscale x 4 x i32> %7, ptr %6, align 41047 %index.next = add nuw i64 %index, %51048 %8 = icmp eq i64 %index.next, %n.vec1049 br i1 %8, label %middle.block, label %vector.body1050 1051middle.block: ; preds = %vector.body1052 %cmp.n = icmp eq i64 %n.mod.vf, 01053 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1054 1055for.body.preheader: ; preds = %entry, %middle.block1056 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1057 br label %for.body1058 1059for.cond.cleanup: ; preds = %for.body, %middle.block1060 ret void1061 1062for.body: ; preds = %for.body.preheader, %for.body1063 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1064 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1065 %9 = load i32, ptr %arrayidx, align 41066 %shl = shl i32 %9, %x1067 store i32 %shl, ptr %arrayidx, align 41068 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11069 %cmp.not = icmp eq i64 %indvars.iv.next, 10241070 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1071}1072 1073define void @sink_splat_lshr_scalable(ptr nocapture %a, i32 signext %x) {1074; CHECK-LABEL: sink_splat_lshr_scalable:1075; CHECK: # %bb.0: # %entry1076; CHECK-NEXT: csrr a5, vlenb1077; CHECK-NEXT: srli a3, a5, 11078; CHECK-NEXT: li a2, 10241079; CHECK-NEXT: bgeu a2, a3, .LBB18_21080; CHECK-NEXT: # %bb.1:1081; CHECK-NEXT: li a2, 01082; CHECK-NEXT: j .LBB18_51083; CHECK-NEXT: .LBB18_2: # %vector.ph1084; CHECK-NEXT: addi a2, a3, -11085; CHECK-NEXT: andi a4, a2, 10241086; CHECK-NEXT: xori a2, a4, 10241087; CHECK-NEXT: slli a5, a5, 11088; CHECK-NEXT: mv a6, a01089; CHECK-NEXT: mv a7, a21090; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma1091; CHECK-NEXT: .LBB18_3: # %vector.body1092; CHECK-NEXT: # =>This Inner Loop Header: Depth=11093; CHECK-NEXT: vl2re32.v v8, (a6)1094; CHECK-NEXT: sub a7, a7, a31095; CHECK-NEXT: vsrl.vx v8, v8, a11096; CHECK-NEXT: vs2r.v v8, (a6)1097; CHECK-NEXT: add a6, a6, a51098; CHECK-NEXT: bnez a7, .LBB18_31099; CHECK-NEXT: # %bb.4: # %middle.block1100; CHECK-NEXT: beqz a4, .LBB18_71101; CHECK-NEXT: .LBB18_5: # %for.body.preheader1102; CHECK-NEXT: slli a2, a2, 21103; CHECK-NEXT: lui a3, 11104; CHECK-NEXT: add a2, a0, a21105; CHECK-NEXT: add a0, a0, a31106; CHECK-NEXT: .LBB18_6: # %for.body1107; CHECK-NEXT: # =>This Inner Loop Header: Depth=11108; CHECK-NEXT: lw a3, 0(a2)1109; CHECK-NEXT: srlw a3, a3, a11110; CHECK-NEXT: sw a3, 0(a2)1111; CHECK-NEXT: addi a2, a2, 41112; CHECK-NEXT: bne a2, a0, .LBB18_61113; CHECK-NEXT: .LBB18_7: # %for.cond.cleanup1114; CHECK-NEXT: ret1115entry:1116 %0 = call i64 @llvm.vscale.i64()1117 %1 = shl i64 %0, 21118 %min.iters.check = icmp ugt i64 %1, 10241119 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1120 1121vector.ph: ; preds = %entry1122 %2 = call i64 @llvm.vscale.i64()1123 %3 = shl i64 %2, 21124 %n.mod.vf = urem i64 1024, %31125 %n.vec = sub nsw i64 1024, %n.mod.vf1126 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 01127 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer1128 %4 = call i64 @llvm.vscale.i64()1129 %5 = shl i64 %4, 21130 br label %vector.body1131 1132vector.body: ; preds = %vector.body, %vector.ph1133 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1134 %6 = getelementptr inbounds i32, ptr %a, i64 %index1135 %wide.load = load <vscale x 4 x i32>, ptr %6, align 41136 %7 = lshr <vscale x 4 x i32> %wide.load, %broadcast.splat1137 store <vscale x 4 x i32> %7, ptr %6, align 41138 %index.next = add nuw i64 %index, %51139 %8 = icmp eq i64 %index.next, %n.vec1140 br i1 %8, label %middle.block, label %vector.body1141 1142middle.block: ; preds = %vector.body1143 %cmp.n = icmp eq i64 %n.mod.vf, 01144 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1145 1146for.body.preheader: ; preds = %entry, %middle.block1147 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1148 br label %for.body1149 1150for.cond.cleanup: ; preds = %for.body, %middle.block1151 ret void1152 1153for.body: ; preds = %for.body.preheader, %for.body1154 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1155 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1156 %9 = load i32, ptr %arrayidx, align 41157 %lshr = lshr i32 %9, %x1158 store i32 %lshr, ptr %arrayidx, align 41159 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11160 %cmp.not = icmp eq i64 %indvars.iv.next, 10241161 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1162}1163 1164define void @sink_splat_ashr_scalable(ptr nocapture %a) {1165; CHECK-LABEL: sink_splat_ashr_scalable:1166; CHECK: # %bb.0: # %entry1167; CHECK-NEXT: csrr a4, vlenb1168; CHECK-NEXT: srli a2, a4, 11169; CHECK-NEXT: li a1, 10241170; CHECK-NEXT: bgeu a1, a2, .LBB19_21171; CHECK-NEXT: # %bb.1:1172; CHECK-NEXT: li a1, 01173; CHECK-NEXT: j .LBB19_51174; CHECK-NEXT: .LBB19_2: # %vector.ph1175; CHECK-NEXT: addi a1, a2, -11176; CHECK-NEXT: andi a3, a1, 10241177; CHECK-NEXT: xori a1, a3, 10241178; CHECK-NEXT: slli a4, a4, 11179; CHECK-NEXT: mv a5, a01180; CHECK-NEXT: mv a6, a11181; CHECK-NEXT: vsetvli a7, zero, e32, m2, ta, ma1182; CHECK-NEXT: .LBB19_3: # %vector.body1183; CHECK-NEXT: # =>This Inner Loop Header: Depth=11184; CHECK-NEXT: vl2re32.v v8, (a5)1185; CHECK-NEXT: sub a6, a6, a21186; CHECK-NEXT: vsra.vi v8, v8, 21187; CHECK-NEXT: vs2r.v v8, (a5)1188; CHECK-NEXT: add a5, a5, a41189; CHECK-NEXT: bnez a6, .LBB19_31190; CHECK-NEXT: # %bb.4: # %middle.block1191; CHECK-NEXT: beqz a3, .LBB19_71192; CHECK-NEXT: .LBB19_5: # %for.body.preheader1193; CHECK-NEXT: slli a1, a1, 21194; CHECK-NEXT: lui a2, 11195; CHECK-NEXT: add a1, a0, a11196; CHECK-NEXT: add a0, a0, a21197; CHECK-NEXT: .LBB19_6: # %for.body1198; CHECK-NEXT: # =>This Inner Loop Header: Depth=11199; CHECK-NEXT: lw a2, 0(a1)1200; CHECK-NEXT: srli a2, a2, 21201; CHECK-NEXT: sw a2, 0(a1)1202; CHECK-NEXT: addi a1, a1, 41203; CHECK-NEXT: bne a1, a0, .LBB19_61204; CHECK-NEXT: .LBB19_7: # %for.cond.cleanup1205; CHECK-NEXT: ret1206entry:1207 %0 = call i64 @llvm.vscale.i64()1208 %1 = shl i64 %0, 21209 %min.iters.check = icmp ugt i64 %1, 10241210 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1211 1212vector.ph: ; preds = %entry1213 %2 = call i64 @llvm.vscale.i64()1214 %3 = shl i64 %2, 21215 %n.mod.vf = urem i64 1024, %31216 %n.vec = sub nsw i64 1024, %n.mod.vf1217 %4 = call i64 @llvm.vscale.i64()1218 %5 = shl i64 %4, 21219 br label %vector.body1220 1221vector.body: ; preds = %vector.body, %vector.ph1222 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1223 %6 = getelementptr inbounds i32, ptr %a, i64 %index1224 %wide.load = load <vscale x 4 x i32>, ptr %6, align 41225 %7 = ashr <vscale x 4 x i32> %wide.load, splat (i32 2)1226 store <vscale x 4 x i32> %7, ptr %6, align 41227 %index.next = add nuw i64 %index, %51228 %8 = icmp eq i64 %index.next, %n.vec1229 br i1 %8, label %middle.block, label %vector.body1230 1231middle.block: ; preds = %vector.body1232 %cmp.n = icmp eq i64 %n.mod.vf, 01233 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1234 1235for.body.preheader: ; preds = %entry, %middle.block1236 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1237 br label %for.body1238 1239for.cond.cleanup: ; preds = %for.body, %middle.block1240 ret void1241 1242for.body: ; preds = %for.body.preheader, %for.body1243 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1244 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv1245 %9 = load i32, ptr %arrayidx, align 41246 %ashr = ashr i32 %9, 21247 store i32 %ashr, ptr %arrayidx, align 41248 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11249 %cmp.not = icmp eq i64 %indvars.iv.next, 10241250 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1251}1252 1253define void @sink_splat_fmul(ptr nocapture %a, float %x) {1254; CHECK-LABEL: sink_splat_fmul:1255; CHECK: # %bb.0: # %entry1256; CHECK-NEXT: lui a1, 11257; CHECK-NEXT: add a1, a0, a11258; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma1259; CHECK-NEXT: .LBB20_1: # %vector.body1260; CHECK-NEXT: # =>This Inner Loop Header: Depth=11261; CHECK-NEXT: vle32.v v8, (a0)1262; CHECK-NEXT: vfmul.vf v8, v8, fa01263; CHECK-NEXT: vse32.v v8, (a0)1264; CHECK-NEXT: addi a0, a0, 161265; CHECK-NEXT: bne a0, a1, .LBB20_11266; CHECK-NEXT: # %bb.2: # %for.cond.cleanup1267; CHECK-NEXT: ret1268entry:1269 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 01270 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1271 br label %vector.body1272 1273vector.body: ; preds = %vector.body, %entry1274 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]1275 %0 = getelementptr inbounds float, ptr %a, i64 %index1276 %wide.load = load <4 x float>, ptr %0, align 41277 %1 = fmul <4 x float> %wide.load, %broadcast.splat1278 store <4 x float> %1, ptr %0, align 41279 %index.next = add nuw i64 %index, 41280 %2 = icmp eq i64 %index.next, 10241281 br i1 %2, label %for.cond.cleanup, label %vector.body1282 1283for.cond.cleanup: ; preds = %vector.body1284 ret void1285}1286 1287define void @sink_splat_fdiv(ptr nocapture %a, float %x) {1288; CHECK-LABEL: sink_splat_fdiv:1289; CHECK: # %bb.0: # %entry1290; CHECK-NEXT: lui a1, 11291; CHECK-NEXT: add a1, a0, a11292; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma1293; CHECK-NEXT: .LBB21_1: # %vector.body1294; CHECK-NEXT: # =>This Inner Loop Header: Depth=11295; CHECK-NEXT: vle32.v v8, (a0)1296; CHECK-NEXT: vfdiv.vf v8, v8, fa01297; CHECK-NEXT: vse32.v v8, (a0)1298; CHECK-NEXT: addi a0, a0, 161299; CHECK-NEXT: bne a0, a1, .LBB21_11300; CHECK-NEXT: # %bb.2: # %for.cond.cleanup1301; CHECK-NEXT: ret1302entry:1303 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 01304 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1305 br label %vector.body1306 1307vector.body: ; preds = %vector.body, %entry1308 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]1309 %0 = getelementptr inbounds float, ptr %a, i64 %index1310 %wide.load = load <4 x float>, ptr %0, align 41311 %1 = fdiv <4 x float> %wide.load, %broadcast.splat1312 store <4 x float> %1, ptr %0, align 41313 %index.next = add nuw i64 %index, 41314 %2 = icmp eq i64 %index.next, 10241315 br i1 %2, label %for.cond.cleanup, label %vector.body1316 1317for.cond.cleanup: ; preds = %vector.body1318 ret void1319}1320 1321define void @sink_splat_frdiv(ptr nocapture %a, float %x) {1322; CHECK-LABEL: sink_splat_frdiv:1323; CHECK: # %bb.0: # %entry1324; CHECK-NEXT: lui a1, 11325; CHECK-NEXT: add a1, a0, a11326; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma1327; CHECK-NEXT: .LBB22_1: # %vector.body1328; CHECK-NEXT: # =>This Inner Loop Header: Depth=11329; CHECK-NEXT: vle32.v v8, (a0)1330; CHECK-NEXT: vfrdiv.vf v8, v8, fa01331; CHECK-NEXT: vse32.v v8, (a0)1332; CHECK-NEXT: addi a0, a0, 161333; CHECK-NEXT: bne a0, a1, .LBB22_11334; CHECK-NEXT: # %bb.2: # %for.cond.cleanup1335; CHECK-NEXT: ret1336entry:1337 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 01338 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1339 br label %vector.body1340 1341vector.body: ; preds = %vector.body, %entry1342 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]1343 %0 = getelementptr inbounds float, ptr %a, i64 %index1344 %wide.load = load <4 x float>, ptr %0, align 41345 %1 = fdiv <4 x float> %broadcast.splat, %wide.load1346 store <4 x float> %1, ptr %0, align 41347 %index.next = add nuw i64 %index, 41348 %2 = icmp eq i64 %index.next, 10241349 br i1 %2, label %for.cond.cleanup, label %vector.body1350 1351for.cond.cleanup: ; preds = %vector.body1352 ret void1353}1354 1355define void @sink_splat_fadd(ptr nocapture %a, float %x) {1356; CHECK-LABEL: sink_splat_fadd:1357; CHECK: # %bb.0: # %entry1358; CHECK-NEXT: lui a1, 11359; CHECK-NEXT: add a1, a0, a11360; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma1361; CHECK-NEXT: .LBB23_1: # %vector.body1362; CHECK-NEXT: # =>This Inner Loop Header: Depth=11363; CHECK-NEXT: vle32.v v8, (a0)1364; CHECK-NEXT: vfadd.vf v8, v8, fa01365; CHECK-NEXT: vse32.v v8, (a0)1366; CHECK-NEXT: addi a0, a0, 161367; CHECK-NEXT: bne a0, a1, .LBB23_11368; CHECK-NEXT: # %bb.2: # %for.cond.cleanup1369; CHECK-NEXT: ret1370entry:1371 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 01372 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1373 br label %vector.body1374 1375vector.body: ; preds = %vector.body, %entry1376 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]1377 %0 = getelementptr inbounds float, ptr %a, i64 %index1378 %wide.load = load <4 x float>, ptr %0, align 41379 %1 = fadd <4 x float> %wide.load, %broadcast.splat1380 store <4 x float> %1, ptr %0, align 41381 %index.next = add nuw i64 %index, 41382 %2 = icmp eq i64 %index.next, 10241383 br i1 %2, label %for.cond.cleanup, label %vector.body1384 1385for.cond.cleanup: ; preds = %vector.body1386 ret void1387}1388 1389define void @sink_splat_fsub(ptr nocapture %a, float %x) {1390; CHECK-LABEL: sink_splat_fsub:1391; CHECK: # %bb.0: # %entry1392; CHECK-NEXT: lui a1, 11393; CHECK-NEXT: add a1, a0, a11394; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma1395; CHECK-NEXT: .LBB24_1: # %vector.body1396; CHECK-NEXT: # =>This Inner Loop Header: Depth=11397; CHECK-NEXT: vle32.v v8, (a0)1398; CHECK-NEXT: vfsub.vf v8, v8, fa01399; CHECK-NEXT: vse32.v v8, (a0)1400; CHECK-NEXT: addi a0, a0, 161401; CHECK-NEXT: bne a0, a1, .LBB24_11402; CHECK-NEXT: # %bb.2: # %for.cond.cleanup1403; CHECK-NEXT: ret1404entry:1405 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 01406 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1407 br label %vector.body1408 1409vector.body: ; preds = %vector.body, %entry1410 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]1411 %0 = getelementptr inbounds float, ptr %a, i64 %index1412 %wide.load = load <4 x float>, ptr %0, align 41413 %1 = fsub <4 x float> %wide.load, %broadcast.splat1414 store <4 x float> %1, ptr %0, align 41415 %index.next = add nuw i64 %index, 41416 %2 = icmp eq i64 %index.next, 10241417 br i1 %2, label %for.cond.cleanup, label %vector.body1418 1419for.cond.cleanup: ; preds = %vector.body1420 ret void1421}1422 1423define void @sink_splat_frsub(ptr nocapture %a, float %x) {1424; CHECK-LABEL: sink_splat_frsub:1425; CHECK: # %bb.0: # %entry1426; CHECK-NEXT: lui a1, 11427; CHECK-NEXT: add a1, a0, a11428; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma1429; CHECK-NEXT: .LBB25_1: # %vector.body1430; CHECK-NEXT: # =>This Inner Loop Header: Depth=11431; CHECK-NEXT: vle32.v v8, (a0)1432; CHECK-NEXT: vfrsub.vf v8, v8, fa01433; CHECK-NEXT: vse32.v v8, (a0)1434; CHECK-NEXT: addi a0, a0, 161435; CHECK-NEXT: bne a0, a1, .LBB25_11436; CHECK-NEXT: # %bb.2: # %for.cond.cleanup1437; CHECK-NEXT: ret1438entry:1439 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 01440 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer1441 br label %vector.body1442 1443vector.body: ; preds = %vector.body, %entry1444 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]1445 %0 = getelementptr inbounds float, ptr %a, i64 %index1446 %wide.load = load <4 x float>, ptr %0, align 41447 %1 = fsub <4 x float> %broadcast.splat, %wide.load1448 store <4 x float> %1, ptr %0, align 41449 %index.next = add nuw i64 %index, 41450 %2 = icmp eq i64 %index.next, 10241451 br i1 %2, label %for.cond.cleanup, label %vector.body1452 1453for.cond.cleanup: ; preds = %vector.body1454 ret void1455}1456 1457define void @sink_splat_fmul_scalable(ptr nocapture %a, float %x) {1458; CHECK-LABEL: sink_splat_fmul_scalable:1459; CHECK: # %bb.0: # %entry1460; CHECK-NEXT: csrr a1, vlenb1461; CHECK-NEXT: srli a3, a1, 21462; CHECK-NEXT: li a2, 10241463; CHECK-NEXT: bgeu a2, a3, .LBB26_21464; CHECK-NEXT: # %bb.1:1465; CHECK-NEXT: li a2, 01466; CHECK-NEXT: j .LBB26_51467; CHECK-NEXT: .LBB26_2: # %vector.ph1468; CHECK-NEXT: addi a2, a3, -11469; CHECK-NEXT: andi a4, a2, 10241470; CHECK-NEXT: xori a2, a4, 10241471; CHECK-NEXT: mv a5, a01472; CHECK-NEXT: mv a6, a21473; CHECK-NEXT: vsetvli a7, zero, e32, m1, ta, ma1474; CHECK-NEXT: .LBB26_3: # %vector.body1475; CHECK-NEXT: # =>This Inner Loop Header: Depth=11476; CHECK-NEXT: vl1re32.v v8, (a5)1477; CHECK-NEXT: sub a6, a6, a31478; CHECK-NEXT: vfmul.vf v8, v8, fa01479; CHECK-NEXT: vs1r.v v8, (a5)1480; CHECK-NEXT: add a5, a5, a11481; CHECK-NEXT: bnez a6, .LBB26_31482; CHECK-NEXT: # %bb.4: # %middle.block1483; CHECK-NEXT: beqz a4, .LBB26_71484; CHECK-NEXT: .LBB26_5: # %for.body.preheader1485; CHECK-NEXT: slli a1, a2, 21486; CHECK-NEXT: lui a2, 11487; CHECK-NEXT: add a1, a0, a11488; CHECK-NEXT: add a0, a0, a21489; CHECK-NEXT: .LBB26_6: # %for.body1490; CHECK-NEXT: # =>This Inner Loop Header: Depth=11491; CHECK-NEXT: flw fa5, 0(a1)1492; CHECK-NEXT: fmul.s fa5, fa5, fa01493; CHECK-NEXT: fsw fa5, 0(a1)1494; CHECK-NEXT: addi a1, a1, 41495; CHECK-NEXT: bne a1, a0, .LBB26_61496; CHECK-NEXT: .LBB26_7: # %for.cond.cleanup1497; CHECK-NEXT: ret1498entry:1499 %0 = call i64 @llvm.vscale.i64()1500 %1 = shl i64 %0, 11501 %min.iters.check = icmp ugt i64 %1, 10241502 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1503 1504vector.ph: ; preds = %entry1505 %2 = call i64 @llvm.vscale.i64()1506 %3 = shl i64 %2, 11507 %n.mod.vf = urem i64 1024, %31508 %n.vec = sub nsw i64 1024, %n.mod.vf1509 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 01510 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer1511 %4 = call i64 @llvm.vscale.i64()1512 %5 = shl i64 %4, 11513 br label %vector.body1514 1515vector.body: ; preds = %vector.body, %vector.ph1516 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1517 %6 = getelementptr inbounds float, ptr %a, i64 %index1518 %wide.load = load <vscale x 2 x float>, ptr %6, align 41519 %7 = fmul <vscale x 2 x float> %wide.load, %broadcast.splat1520 store <vscale x 2 x float> %7, ptr %6, align 41521 %index.next = add nuw i64 %index, %51522 %8 = icmp eq i64 %index.next, %n.vec1523 br i1 %8, label %middle.block, label %vector.body1524 1525middle.block: ; preds = %vector.body1526 %cmp.n = icmp eq i64 %n.mod.vf, 01527 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1528 1529for.body.preheader: ; preds = %entry, %middle.block1530 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1531 br label %for.body1532 1533for.cond.cleanup: ; preds = %for.body, %middle.block1534 ret void1535 1536for.body: ; preds = %for.body.preheader, %for.body1537 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1538 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv1539 %9 = load float, ptr %arrayidx, align 41540 %mul = fmul float %9, %x1541 store float %mul, ptr %arrayidx, align 41542 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11543 %cmp.not = icmp eq i64 %indvars.iv.next, 10241544 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1545}1546 1547define void @sink_splat_fdiv_scalable(ptr nocapture %a, float %x) {1548; CHECK-LABEL: sink_splat_fdiv_scalable:1549; CHECK: # %bb.0: # %entry1550; CHECK-NEXT: csrr a1, vlenb1551; CHECK-NEXT: srli a3, a1, 21552; CHECK-NEXT: li a2, 10241553; CHECK-NEXT: bgeu a2, a3, .LBB27_21554; CHECK-NEXT: # %bb.1:1555; CHECK-NEXT: li a2, 01556; CHECK-NEXT: j .LBB27_51557; CHECK-NEXT: .LBB27_2: # %vector.ph1558; CHECK-NEXT: addi a2, a3, -11559; CHECK-NEXT: andi a4, a2, 10241560; CHECK-NEXT: xori a2, a4, 10241561; CHECK-NEXT: mv a5, a01562; CHECK-NEXT: mv a6, a21563; CHECK-NEXT: vsetvli a7, zero, e32, m1, ta, ma1564; CHECK-NEXT: .LBB27_3: # %vector.body1565; CHECK-NEXT: # =>This Inner Loop Header: Depth=11566; CHECK-NEXT: vl1re32.v v8, (a5)1567; CHECK-NEXT: vfdiv.vf v8, v8, fa01568; CHECK-NEXT: sub a6, a6, a31569; CHECK-NEXT: vs1r.v v8, (a5)1570; CHECK-NEXT: add a5, a5, a11571; CHECK-NEXT: bnez a6, .LBB27_31572; CHECK-NEXT: # %bb.4: # %middle.block1573; CHECK-NEXT: beqz a4, .LBB27_71574; CHECK-NEXT: .LBB27_5: # %for.body.preheader1575; CHECK-NEXT: slli a1, a2, 21576; CHECK-NEXT: lui a2, 11577; CHECK-NEXT: add a1, a0, a11578; CHECK-NEXT: add a0, a0, a21579; CHECK-NEXT: .LBB27_6: # %for.body1580; CHECK-NEXT: # =>This Inner Loop Header: Depth=11581; CHECK-NEXT: flw fa5, 0(a1)1582; CHECK-NEXT: fdiv.s fa5, fa5, fa01583; CHECK-NEXT: fsw fa5, 0(a1)1584; CHECK-NEXT: addi a1, a1, 41585; CHECK-NEXT: bne a1, a0, .LBB27_61586; CHECK-NEXT: .LBB27_7: # %for.cond.cleanup1587; CHECK-NEXT: ret1588entry:1589 %0 = call i64 @llvm.vscale.i64()1590 %1 = shl i64 %0, 11591 %min.iters.check = icmp ugt i64 %1, 10241592 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1593 1594vector.ph: ; preds = %entry1595 %2 = call i64 @llvm.vscale.i64()1596 %3 = shl i64 %2, 11597 %n.mod.vf = urem i64 1024, %31598 %n.vec = sub nsw i64 1024, %n.mod.vf1599 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 01600 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer1601 %4 = call i64 @llvm.vscale.i64()1602 %5 = shl i64 %4, 11603 br label %vector.body1604 1605vector.body: ; preds = %vector.body, %vector.ph1606 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1607 %6 = getelementptr inbounds float, ptr %a, i64 %index1608 %wide.load = load <vscale x 2 x float>, ptr %6, align 41609 %7 = fdiv <vscale x 2 x float> %wide.load, %broadcast.splat1610 store <vscale x 2 x float> %7, ptr %6, align 41611 %index.next = add nuw i64 %index, %51612 %8 = icmp eq i64 %index.next, %n.vec1613 br i1 %8, label %middle.block, label %vector.body1614 1615middle.block: ; preds = %vector.body1616 %cmp.n = icmp eq i64 %n.mod.vf, 01617 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1618 1619for.body.preheader: ; preds = %entry, %middle.block1620 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1621 br label %for.body1622 1623for.cond.cleanup: ; preds = %for.body, %middle.block1624 ret void1625 1626for.body: ; preds = %for.body.preheader, %for.body1627 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1628 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv1629 %9 = load float, ptr %arrayidx, align 41630 %mul = fdiv float %9, %x1631 store float %mul, ptr %arrayidx, align 41632 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11633 %cmp.not = icmp eq i64 %indvars.iv.next, 10241634 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1635}1636 1637define void @sink_splat_frdiv_scalable(ptr nocapture %a, float %x) {1638; CHECK-LABEL: sink_splat_frdiv_scalable:1639; CHECK: # %bb.0: # %entry1640; CHECK-NEXT: csrr a1, vlenb1641; CHECK-NEXT: srli a3, a1, 21642; CHECK-NEXT: li a2, 10241643; CHECK-NEXT: bgeu a2, a3, .LBB28_21644; CHECK-NEXT: # %bb.1:1645; CHECK-NEXT: li a2, 01646; CHECK-NEXT: j .LBB28_51647; CHECK-NEXT: .LBB28_2: # %vector.ph1648; CHECK-NEXT: addi a2, a3, -11649; CHECK-NEXT: andi a4, a2, 10241650; CHECK-NEXT: xori a2, a4, 10241651; CHECK-NEXT: mv a5, a01652; CHECK-NEXT: mv a6, a21653; CHECK-NEXT: vsetvli a7, zero, e32, m1, ta, ma1654; CHECK-NEXT: .LBB28_3: # %vector.body1655; CHECK-NEXT: # =>This Inner Loop Header: Depth=11656; CHECK-NEXT: vl1re32.v v8, (a5)1657; CHECK-NEXT: vfrdiv.vf v8, v8, fa01658; CHECK-NEXT: sub a6, a6, a31659; CHECK-NEXT: vs1r.v v8, (a5)1660; CHECK-NEXT: add a5, a5, a11661; CHECK-NEXT: bnez a6, .LBB28_31662; CHECK-NEXT: # %bb.4: # %middle.block1663; CHECK-NEXT: beqz a4, .LBB28_71664; CHECK-NEXT: .LBB28_5: # %for.body.preheader1665; CHECK-NEXT: slli a1, a2, 21666; CHECK-NEXT: lui a2, 11667; CHECK-NEXT: add a1, a0, a11668; CHECK-NEXT: add a0, a0, a21669; CHECK-NEXT: .LBB28_6: # %for.body1670; CHECK-NEXT: # =>This Inner Loop Header: Depth=11671; CHECK-NEXT: flw fa5, 0(a1)1672; CHECK-NEXT: fdiv.s fa5, fa0, fa51673; CHECK-NEXT: fsw fa5, 0(a1)1674; CHECK-NEXT: addi a1, a1, 41675; CHECK-NEXT: bne a1, a0, .LBB28_61676; CHECK-NEXT: .LBB28_7: # %for.cond.cleanup1677; CHECK-NEXT: ret1678entry:1679 %0 = call i64 @llvm.vscale.i64()1680 %1 = shl i64 %0, 11681 %min.iters.check = icmp ugt i64 %1, 10241682 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1683 1684vector.ph: ; preds = %entry1685 %2 = call i64 @llvm.vscale.i64()1686 %3 = shl i64 %2, 11687 %n.mod.vf = urem i64 1024, %31688 %n.vec = sub nsw i64 1024, %n.mod.vf1689 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 01690 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer1691 %4 = call i64 @llvm.vscale.i64()1692 %5 = shl i64 %4, 11693 br label %vector.body1694 1695vector.body: ; preds = %vector.body, %vector.ph1696 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1697 %6 = getelementptr inbounds float, ptr %a, i64 %index1698 %wide.load = load <vscale x 2 x float>, ptr %6, align 41699 %7 = fdiv <vscale x 2 x float> %broadcast.splat, %wide.load1700 store <vscale x 2 x float> %7, ptr %6, align 41701 %index.next = add nuw i64 %index, %51702 %8 = icmp eq i64 %index.next, %n.vec1703 br i1 %8, label %middle.block, label %vector.body1704 1705middle.block: ; preds = %vector.body1706 %cmp.n = icmp eq i64 %n.mod.vf, 01707 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1708 1709for.body.preheader: ; preds = %entry, %middle.block1710 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1711 br label %for.body1712 1713for.cond.cleanup: ; preds = %for.body, %middle.block1714 ret void1715 1716for.body: ; preds = %for.body.preheader, %for.body1717 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1718 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv1719 %9 = load float, ptr %arrayidx, align 41720 %mul = fdiv float %x, %91721 store float %mul, ptr %arrayidx, align 41722 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11723 %cmp.not = icmp eq i64 %indvars.iv.next, 10241724 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1725}1726 1727define void @sink_splat_fadd_scalable(ptr nocapture %a, float %x) {1728; CHECK-LABEL: sink_splat_fadd_scalable:1729; CHECK: # %bb.0: # %entry1730; CHECK-NEXT: csrr a1, vlenb1731; CHECK-NEXT: srli a3, a1, 21732; CHECK-NEXT: li a2, 10241733; CHECK-NEXT: bgeu a2, a3, .LBB29_21734; CHECK-NEXT: # %bb.1:1735; CHECK-NEXT: li a2, 01736; CHECK-NEXT: j .LBB29_51737; CHECK-NEXT: .LBB29_2: # %vector.ph1738; CHECK-NEXT: addi a2, a3, -11739; CHECK-NEXT: andi a4, a2, 10241740; CHECK-NEXT: xori a2, a4, 10241741; CHECK-NEXT: mv a5, a01742; CHECK-NEXT: mv a6, a21743; CHECK-NEXT: vsetvli a7, zero, e32, m1, ta, ma1744; CHECK-NEXT: .LBB29_3: # %vector.body1745; CHECK-NEXT: # =>This Inner Loop Header: Depth=11746; CHECK-NEXT: vl1re32.v v8, (a5)1747; CHECK-NEXT: sub a6, a6, a31748; CHECK-NEXT: vfadd.vf v8, v8, fa01749; CHECK-NEXT: vs1r.v v8, (a5)1750; CHECK-NEXT: add a5, a5, a11751; CHECK-NEXT: bnez a6, .LBB29_31752; CHECK-NEXT: # %bb.4: # %middle.block1753; CHECK-NEXT: beqz a4, .LBB29_71754; CHECK-NEXT: .LBB29_5: # %for.body.preheader1755; CHECK-NEXT: slli a1, a2, 21756; CHECK-NEXT: lui a2, 11757; CHECK-NEXT: add a1, a0, a11758; CHECK-NEXT: add a0, a0, a21759; CHECK-NEXT: .LBB29_6: # %for.body1760; CHECK-NEXT: # =>This Inner Loop Header: Depth=11761; CHECK-NEXT: flw fa5, 0(a1)1762; CHECK-NEXT: fadd.s fa5, fa5, fa01763; CHECK-NEXT: fsw fa5, 0(a1)1764; CHECK-NEXT: addi a1, a1, 41765; CHECK-NEXT: bne a1, a0, .LBB29_61766; CHECK-NEXT: .LBB29_7: # %for.cond.cleanup1767; CHECK-NEXT: ret1768entry:1769 %0 = call i64 @llvm.vscale.i64()1770 %1 = shl i64 %0, 11771 %min.iters.check = icmp ugt i64 %1, 10241772 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1773 1774vector.ph: ; preds = %entry1775 %2 = call i64 @llvm.vscale.i64()1776 %3 = shl i64 %2, 11777 %n.mod.vf = urem i64 1024, %31778 %n.vec = sub nsw i64 1024, %n.mod.vf1779 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 01780 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer1781 %4 = call i64 @llvm.vscale.i64()1782 %5 = shl i64 %4, 11783 br label %vector.body1784 1785vector.body: ; preds = %vector.body, %vector.ph1786 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1787 %6 = getelementptr inbounds float, ptr %a, i64 %index1788 %wide.load = load <vscale x 2 x float>, ptr %6, align 41789 %7 = fadd <vscale x 2 x float> %wide.load, %broadcast.splat1790 store <vscale x 2 x float> %7, ptr %6, align 41791 %index.next = add nuw i64 %index, %51792 %8 = icmp eq i64 %index.next, %n.vec1793 br i1 %8, label %middle.block, label %vector.body1794 1795middle.block: ; preds = %vector.body1796 %cmp.n = icmp eq i64 %n.mod.vf, 01797 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1798 1799for.body.preheader: ; preds = %entry, %middle.block1800 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1801 br label %for.body1802 1803for.cond.cleanup: ; preds = %for.body, %middle.block1804 ret void1805 1806for.body: ; preds = %for.body.preheader, %for.body1807 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1808 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv1809 %9 = load float, ptr %arrayidx, align 41810 %mul = fadd float %9, %x1811 store float %mul, ptr %arrayidx, align 41812 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11813 %cmp.not = icmp eq i64 %indvars.iv.next, 10241814 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1815}1816 1817define void @sink_splat_fsub_scalable(ptr nocapture %a, float %x) {1818; CHECK-LABEL: sink_splat_fsub_scalable:1819; CHECK: # %bb.0: # %entry1820; CHECK-NEXT: csrr a1, vlenb1821; CHECK-NEXT: srli a3, a1, 21822; CHECK-NEXT: li a2, 10241823; CHECK-NEXT: bgeu a2, a3, .LBB30_21824; CHECK-NEXT: # %bb.1:1825; CHECK-NEXT: li a2, 01826; CHECK-NEXT: j .LBB30_51827; CHECK-NEXT: .LBB30_2: # %vector.ph1828; CHECK-NEXT: addi a2, a3, -11829; CHECK-NEXT: andi a4, a2, 10241830; CHECK-NEXT: xori a2, a4, 10241831; CHECK-NEXT: mv a5, a01832; CHECK-NEXT: mv a6, a21833; CHECK-NEXT: vsetvli a7, zero, e32, m1, ta, ma1834; CHECK-NEXT: .LBB30_3: # %vector.body1835; CHECK-NEXT: # =>This Inner Loop Header: Depth=11836; CHECK-NEXT: vl1re32.v v8, (a5)1837; CHECK-NEXT: sub a6, a6, a31838; CHECK-NEXT: vfsub.vf v8, v8, fa01839; CHECK-NEXT: vs1r.v v8, (a5)1840; CHECK-NEXT: add a5, a5, a11841; CHECK-NEXT: bnez a6, .LBB30_31842; CHECK-NEXT: # %bb.4: # %middle.block1843; CHECK-NEXT: beqz a4, .LBB30_71844; CHECK-NEXT: .LBB30_5: # %for.body.preheader1845; CHECK-NEXT: slli a1, a2, 21846; CHECK-NEXT: lui a2, 11847; CHECK-NEXT: add a1, a0, a11848; CHECK-NEXT: add a0, a0, a21849; CHECK-NEXT: .LBB30_6: # %for.body1850; CHECK-NEXT: # =>This Inner Loop Header: Depth=11851; CHECK-NEXT: flw fa5, 0(a1)1852; CHECK-NEXT: fsub.s fa5, fa5, fa01853; CHECK-NEXT: fsw fa5, 0(a1)1854; CHECK-NEXT: addi a1, a1, 41855; CHECK-NEXT: bne a1, a0, .LBB30_61856; CHECK-NEXT: .LBB30_7: # %for.cond.cleanup1857; CHECK-NEXT: ret1858entry:1859 %0 = call i64 @llvm.vscale.i64()1860 %1 = shl i64 %0, 11861 %min.iters.check = icmp ugt i64 %1, 10241862 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1863 1864vector.ph: ; preds = %entry1865 %2 = call i64 @llvm.vscale.i64()1866 %3 = shl i64 %2, 11867 %n.mod.vf = urem i64 1024, %31868 %n.vec = sub nsw i64 1024, %n.mod.vf1869 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 01870 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer1871 %4 = call i64 @llvm.vscale.i64()1872 %5 = shl i64 %4, 11873 br label %vector.body1874 1875vector.body: ; preds = %vector.body, %vector.ph1876 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1877 %6 = getelementptr inbounds float, ptr %a, i64 %index1878 %wide.load = load <vscale x 2 x float>, ptr %6, align 41879 %7 = fsub <vscale x 2 x float> %wide.load, %broadcast.splat1880 store <vscale x 2 x float> %7, ptr %6, align 41881 %index.next = add nuw i64 %index, %51882 %8 = icmp eq i64 %index.next, %n.vec1883 br i1 %8, label %middle.block, label %vector.body1884 1885middle.block: ; preds = %vector.body1886 %cmp.n = icmp eq i64 %n.mod.vf, 01887 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1888 1889for.body.preheader: ; preds = %entry, %middle.block1890 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1891 br label %for.body1892 1893for.cond.cleanup: ; preds = %for.body, %middle.block1894 ret void1895 1896for.body: ; preds = %for.body.preheader, %for.body1897 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1898 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv1899 %9 = load float, ptr %arrayidx, align 41900 %mul = fsub float %9, %x1901 store float %mul, ptr %arrayidx, align 41902 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11903 %cmp.not = icmp eq i64 %indvars.iv.next, 10241904 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1905}1906 1907define void @sink_splat_frsub_scalable(ptr nocapture %a, float %x) {1908; CHECK-LABEL: sink_splat_frsub_scalable:1909; CHECK: # %bb.0: # %entry1910; CHECK-NEXT: csrr a1, vlenb1911; CHECK-NEXT: srli a3, a1, 21912; CHECK-NEXT: li a2, 10241913; CHECK-NEXT: bgeu a2, a3, .LBB31_21914; CHECK-NEXT: # %bb.1:1915; CHECK-NEXT: li a2, 01916; CHECK-NEXT: j .LBB31_51917; CHECK-NEXT: .LBB31_2: # %vector.ph1918; CHECK-NEXT: addi a2, a3, -11919; CHECK-NEXT: andi a4, a2, 10241920; CHECK-NEXT: xori a2, a4, 10241921; CHECK-NEXT: mv a5, a01922; CHECK-NEXT: mv a6, a21923; CHECK-NEXT: vsetvli a7, zero, e32, m1, ta, ma1924; CHECK-NEXT: .LBB31_3: # %vector.body1925; CHECK-NEXT: # =>This Inner Loop Header: Depth=11926; CHECK-NEXT: vl1re32.v v8, (a5)1927; CHECK-NEXT: sub a6, a6, a31928; CHECK-NEXT: vfrsub.vf v8, v8, fa01929; CHECK-NEXT: vs1r.v v8, (a5)1930; CHECK-NEXT: add a5, a5, a11931; CHECK-NEXT: bnez a6, .LBB31_31932; CHECK-NEXT: # %bb.4: # %middle.block1933; CHECK-NEXT: beqz a4, .LBB31_71934; CHECK-NEXT: .LBB31_5: # %for.body.preheader1935; CHECK-NEXT: slli a1, a2, 21936; CHECK-NEXT: lui a2, 11937; CHECK-NEXT: add a1, a0, a11938; CHECK-NEXT: add a0, a0, a21939; CHECK-NEXT: .LBB31_6: # %for.body1940; CHECK-NEXT: # =>This Inner Loop Header: Depth=11941; CHECK-NEXT: flw fa5, 0(a1)1942; CHECK-NEXT: fsub.s fa5, fa0, fa51943; CHECK-NEXT: fsw fa5, 0(a1)1944; CHECK-NEXT: addi a1, a1, 41945; CHECK-NEXT: bne a1, a0, .LBB31_61946; CHECK-NEXT: .LBB31_7: # %for.cond.cleanup1947; CHECK-NEXT: ret1948entry:1949 %0 = call i64 @llvm.vscale.i64()1950 %1 = shl i64 %0, 11951 %min.iters.check = icmp ugt i64 %1, 10241952 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph1953 1954vector.ph: ; preds = %entry1955 %2 = call i64 @llvm.vscale.i64()1956 %3 = shl i64 %2, 11957 %n.mod.vf = urem i64 1024, %31958 %n.vec = sub nsw i64 1024, %n.mod.vf1959 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 01960 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer1961 %4 = call i64 @llvm.vscale.i64()1962 %5 = shl i64 %4, 11963 br label %vector.body1964 1965vector.body: ; preds = %vector.body, %vector.ph1966 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]1967 %6 = getelementptr inbounds float, ptr %a, i64 %index1968 %wide.load = load <vscale x 2 x float>, ptr %6, align 41969 %7 = fsub <vscale x 2 x float> %broadcast.splat, %wide.load1970 store <vscale x 2 x float> %7, ptr %6, align 41971 %index.next = add nuw i64 %index, %51972 %8 = icmp eq i64 %index.next, %n.vec1973 br i1 %8, label %middle.block, label %vector.body1974 1975middle.block: ; preds = %vector.body1976 %cmp.n = icmp eq i64 %n.mod.vf, 01977 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader1978 1979for.body.preheader: ; preds = %entry, %middle.block1980 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]1981 br label %for.body1982 1983for.cond.cleanup: ; preds = %for.body, %middle.block1984 ret void1985 1986for.body: ; preds = %for.body.preheader, %for.body1987 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]1988 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv1989 %9 = load float, ptr %arrayidx, align 41990 %mul = fsub float %x, %91991 store float %mul, ptr %arrayidx, align 41992 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 11993 %cmp.not = icmp eq i64 %indvars.iv.next, 10241994 br i1 %cmp.not, label %for.cond.cleanup, label %for.body1995}1996 1997define void @sink_splat_fma(ptr noalias nocapture %a, ptr nocapture readonly %b, float %x) {1998; CHECK-LABEL: sink_splat_fma:1999; CHECK: # %bb.0: # %entry2000; CHECK-NEXT: lui a2, 12001; CHECK-NEXT: add a2, a1, a22002; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2003; CHECK-NEXT: .LBB32_1: # %vector.body2004; CHECK-NEXT: # =>This Inner Loop Header: Depth=12005; CHECK-NEXT: vle32.v v8, (a0)2006; CHECK-NEXT: vle32.v v9, (a1)2007; CHECK-NEXT: addi a1, a1, 162008; CHECK-NEXT: vfmacc.vf v9, fa0, v82009; CHECK-NEXT: vse32.v v9, (a0)2010; CHECK-NEXT: addi a0, a0, 162011; CHECK-NEXT: bne a1, a2, .LBB32_12012; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2013; CHECK-NEXT: ret2014entry:2015 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 02016 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer2017 br label %vector.body2018 2019vector.body: ; preds = %vector.body, %entry2020 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2021 %0 = getelementptr inbounds float, ptr %a, i64 %index2022 %wide.load = load <4 x float>, ptr %0, align 42023 %1 = getelementptr inbounds float, ptr %b, i64 %index2024 %wide.load12 = load <4 x float>, ptr %1, align 42025 %2 = call <4 x float> @llvm.fma.v4f32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x float> %wide.load12)2026 store <4 x float> %2, ptr %0, align 42027 %index.next = add nuw i64 %index, 42028 %3 = icmp eq i64 %index.next, 10242029 br i1 %3, label %for.cond.cleanup, label %vector.body2030 2031for.cond.cleanup: ; preds = %vector.body2032 ret void2033}2034 2035define void @sink_splat_fma_commute(ptr noalias nocapture %a, ptr nocapture readonly %b, float %x) {2036; CHECK-LABEL: sink_splat_fma_commute:2037; CHECK: # %bb.0: # %entry2038; CHECK-NEXT: lui a2, 12039; CHECK-NEXT: add a2, a1, a22040; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2041; CHECK-NEXT: .LBB33_1: # %vector.body2042; CHECK-NEXT: # =>This Inner Loop Header: Depth=12043; CHECK-NEXT: vle32.v v8, (a0)2044; CHECK-NEXT: vle32.v v9, (a1)2045; CHECK-NEXT: addi a1, a1, 162046; CHECK-NEXT: vfmacc.vf v9, fa0, v82047; CHECK-NEXT: vse32.v v9, (a0)2048; CHECK-NEXT: addi a0, a0, 162049; CHECK-NEXT: bne a1, a2, .LBB33_12050; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2051; CHECK-NEXT: ret2052entry:2053 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 02054 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer2055 br label %vector.body2056 2057vector.body: ; preds = %vector.body, %entry2058 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2059 %0 = getelementptr inbounds float, ptr %a, i64 %index2060 %wide.load = load <4 x float>, ptr %0, align 42061 %1 = getelementptr inbounds float, ptr %b, i64 %index2062 %wide.load12 = load <4 x float>, ptr %1, align 42063 %2 = call <4 x float> @llvm.fma.v4f32(<4 x float> %broadcast.splat, <4 x float> %wide.load, <4 x float> %wide.load12)2064 store <4 x float> %2, ptr %0, align 42065 %index.next = add nuw i64 %index, 42066 %3 = icmp eq i64 %index.next, 10242067 br i1 %3, label %for.cond.cleanup, label %vector.body2068 2069for.cond.cleanup: ; preds = %vector.body2070 ret void2071}2072 2073define void @sink_splat_fma_scalable(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, float %x) {2074; CHECK-LABEL: sink_splat_fma_scalable:2075; CHECK: # %bb.0: # %entry2076; CHECK-NEXT: csrr a2, vlenb2077; CHECK-NEXT: srli a4, a2, 22078; CHECK-NEXT: li a3, 10242079; CHECK-NEXT: bgeu a3, a4, .LBB34_22080; CHECK-NEXT: # %bb.1:2081; CHECK-NEXT: li a3, 02082; CHECK-NEXT: j .LBB34_52083; CHECK-NEXT: .LBB34_2: # %vector.ph2084; CHECK-NEXT: addi a3, a4, -12085; CHECK-NEXT: andi a5, a3, 10242086; CHECK-NEXT: xori a3, a5, 10242087; CHECK-NEXT: mv a6, a02088; CHECK-NEXT: mv a7, a12089; CHECK-NEXT: mv t0, a32090; CHECK-NEXT: vsetvli t1, zero, e32, m1, ta, ma2091; CHECK-NEXT: .LBB34_3: # %vector.body2092; CHECK-NEXT: # =>This Inner Loop Header: Depth=12093; CHECK-NEXT: vl1re32.v v8, (a6)2094; CHECK-NEXT: vl1re32.v v9, (a7)2095; CHECK-NEXT: sub t0, t0, a42096; CHECK-NEXT: add a7, a7, a22097; CHECK-NEXT: vfmacc.vf v9, fa0, v82098; CHECK-NEXT: vs1r.v v9, (a6)2099; CHECK-NEXT: add a6, a6, a22100; CHECK-NEXT: bnez t0, .LBB34_32101; CHECK-NEXT: # %bb.4: # %middle.block2102; CHECK-NEXT: beqz a5, .LBB34_72103; CHECK-NEXT: .LBB34_5: # %for.body.preheader2104; CHECK-NEXT: slli a2, a3, 22105; CHECK-NEXT: lui a3, 12106; CHECK-NEXT: add a0, a0, a22107; CHECK-NEXT: add a2, a1, a22108; CHECK-NEXT: add a1, a1, a32109; CHECK-NEXT: .LBB34_6: # %for.body2110; CHECK-NEXT: # =>This Inner Loop Header: Depth=12111; CHECK-NEXT: flw fa5, 0(a0)2112; CHECK-NEXT: flw fa4, 0(a2)2113; CHECK-NEXT: addi a2, a2, 42114; CHECK-NEXT: fmadd.s fa5, fa5, fa0, fa42115; CHECK-NEXT: fsw fa5, 0(a0)2116; CHECK-NEXT: addi a0, a0, 42117; CHECK-NEXT: bne a2, a1, .LBB34_62118; CHECK-NEXT: .LBB34_7: # %for.cond.cleanup2119; CHECK-NEXT: ret2120entry:2121 %0 = call i64 @llvm.vscale.i64()2122 %1 = shl i64 %0, 12123 %min.iters.check = icmp ugt i64 %1, 10242124 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph2125 2126vector.ph: ; preds = %entry2127 %2 = call i64 @llvm.vscale.i64()2128 %3 = shl i64 %2, 12129 %n.mod.vf = urem i64 1024, %32130 %n.vec = sub nsw i64 1024, %n.mod.vf2131 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 02132 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer2133 %4 = call i64 @llvm.vscale.i64()2134 %5 = shl i64 %4, 12135 br label %vector.body2136 2137vector.body: ; preds = %vector.body, %vector.ph2138 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]2139 %6 = getelementptr inbounds float, ptr %a, i64 %index2140 %wide.load = load <vscale x 2 x float>, ptr %6, align 42141 %7 = getelementptr inbounds float, ptr %b, i64 %index2142 %wide.load12 = load <vscale x 2 x float>, ptr %7, align 42143 %8 = call <vscale x 2 x float> @llvm.fma.nxv2f32(<vscale x 2 x float> %wide.load, <vscale x 2 x float> %broadcast.splat, <vscale x 2 x float> %wide.load12)2144 store <vscale x 2 x float> %8, ptr %6, align 42145 %index.next = add nuw i64 %index, %52146 %9 = icmp eq i64 %index.next, %n.vec2147 br i1 %9, label %middle.block, label %vector.body2148 2149middle.block: ; preds = %vector.body2150 %cmp.n = icmp eq i64 %n.mod.vf, 02151 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader2152 2153for.body.preheader: ; preds = %entry, %middle.block2154 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]2155 br label %for.body2156 2157for.cond.cleanup: ; preds = %for.body, %middle.block2158 ret void2159 2160for.body: ; preds = %for.body.preheader, %for.body2161 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]2162 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv2163 %10 = load float, ptr %arrayidx, align 42164 %arrayidx2 = getelementptr inbounds float, ptr %b, i64 %indvars.iv2165 %11 = load float, ptr %arrayidx2, align 42166 %12 = tail call float @llvm.fma.f32(float %10, float %x, float %11)2167 store float %12, ptr %arrayidx, align 42168 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12169 %cmp.not = icmp eq i64 %indvars.iv.next, 10242170 br i1 %cmp.not, label %for.cond.cleanup, label %for.body2171}2172 2173define void @sink_splat_fma_commute_scalable(ptr noalias nocapture %a, ptr noalias nocapture readonly %b, float %x) {2174; CHECK-LABEL: sink_splat_fma_commute_scalable:2175; CHECK: # %bb.0: # %entry2176; CHECK-NEXT: csrr a2, vlenb2177; CHECK-NEXT: srli a4, a2, 22178; CHECK-NEXT: li a3, 10242179; CHECK-NEXT: bgeu a3, a4, .LBB35_22180; CHECK-NEXT: # %bb.1:2181; CHECK-NEXT: li a3, 02182; CHECK-NEXT: j .LBB35_52183; CHECK-NEXT: .LBB35_2: # %vector.ph2184; CHECK-NEXT: addi a3, a4, -12185; CHECK-NEXT: andi a5, a3, 10242186; CHECK-NEXT: xori a3, a5, 10242187; CHECK-NEXT: mv a6, a02188; CHECK-NEXT: mv a7, a12189; CHECK-NEXT: mv t0, a32190; CHECK-NEXT: vsetvli t1, zero, e32, m1, ta, ma2191; CHECK-NEXT: .LBB35_3: # %vector.body2192; CHECK-NEXT: # =>This Inner Loop Header: Depth=12193; CHECK-NEXT: vl1re32.v v8, (a6)2194; CHECK-NEXT: vl1re32.v v9, (a7)2195; CHECK-NEXT: sub t0, t0, a42196; CHECK-NEXT: add a7, a7, a22197; CHECK-NEXT: vfmacc.vf v9, fa0, v82198; CHECK-NEXT: vs1r.v v9, (a6)2199; CHECK-NEXT: add a6, a6, a22200; CHECK-NEXT: bnez t0, .LBB35_32201; CHECK-NEXT: # %bb.4: # %middle.block2202; CHECK-NEXT: beqz a5, .LBB35_72203; CHECK-NEXT: .LBB35_5: # %for.body.preheader2204; CHECK-NEXT: slli a2, a3, 22205; CHECK-NEXT: lui a3, 12206; CHECK-NEXT: add a0, a0, a22207; CHECK-NEXT: add a2, a1, a22208; CHECK-NEXT: add a1, a1, a32209; CHECK-NEXT: .LBB35_6: # %for.body2210; CHECK-NEXT: # =>This Inner Loop Header: Depth=12211; CHECK-NEXT: flw fa5, 0(a0)2212; CHECK-NEXT: flw fa4, 0(a2)2213; CHECK-NEXT: addi a2, a2, 42214; CHECK-NEXT: fmadd.s fa5, fa0, fa5, fa42215; CHECK-NEXT: fsw fa5, 0(a0)2216; CHECK-NEXT: addi a0, a0, 42217; CHECK-NEXT: bne a2, a1, .LBB35_62218; CHECK-NEXT: .LBB35_7: # %for.cond.cleanup2219; CHECK-NEXT: ret2220entry:2221 %0 = call i64 @llvm.vscale.i64()2222 %1 = shl i64 %0, 12223 %min.iters.check = icmp ugt i64 %1, 10242224 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph2225 2226vector.ph: ; preds = %entry2227 %2 = call i64 @llvm.vscale.i64()2228 %3 = shl i64 %2, 12229 %n.mod.vf = urem i64 1024, %32230 %n.vec = sub nsw i64 1024, %n.mod.vf2231 %broadcast.splatinsert = insertelement <vscale x 2 x float> poison, float %x, i32 02232 %broadcast.splat = shufflevector <vscale x 2 x float> %broadcast.splatinsert, <vscale x 2 x float> poison, <vscale x 2 x i32> zeroinitializer2233 %4 = call i64 @llvm.vscale.i64()2234 %5 = shl i64 %4, 12235 br label %vector.body2236 2237vector.body: ; preds = %vector.body, %vector.ph2238 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]2239 %6 = getelementptr inbounds float, ptr %a, i64 %index2240 %wide.load = load <vscale x 2 x float>, ptr %6, align 42241 %7 = getelementptr inbounds float, ptr %b, i64 %index2242 %wide.load12 = load <vscale x 2 x float>, ptr %7, align 42243 %8 = call <vscale x 2 x float> @llvm.fma.nxv2f32(<vscale x 2 x float> %broadcast.splat, <vscale x 2 x float> %wide.load, <vscale x 2 x float> %wide.load12)2244 store <vscale x 2 x float> %8, ptr %6, align 42245 %index.next = add nuw i64 %index, %52246 %9 = icmp eq i64 %index.next, %n.vec2247 br i1 %9, label %middle.block, label %vector.body2248 2249middle.block: ; preds = %vector.body2250 %cmp.n = icmp eq i64 %n.mod.vf, 02251 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader2252 2253for.body.preheader: ; preds = %entry, %middle.block2254 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]2255 br label %for.body2256 2257for.cond.cleanup: ; preds = %for.body, %middle.block2258 ret void2259 2260for.body: ; preds = %for.body.preheader, %for.body2261 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]2262 %arrayidx = getelementptr inbounds float, ptr %a, i64 %indvars.iv2263 %10 = load float, ptr %arrayidx, align 42264 %arrayidx2 = getelementptr inbounds float, ptr %b, i64 %indvars.iv2265 %11 = load float, ptr %arrayidx2, align 42266 %12 = tail call float @llvm.fma.f32(float %x, float %10, float %11)2267 store float %12, ptr %arrayidx, align 42268 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12269 %cmp.not = icmp eq i64 %indvars.iv.next, 10242270 br i1 %cmp.not, label %for.cond.cleanup, label %for.body2271}2272 2273define void @sink_splat_icmp(ptr nocapture %x, i32 signext %y) {2274; CHECK-LABEL: sink_splat_icmp:2275; CHECK: # %bb.0: # %entry2276; CHECK-NEXT: lui a2, 12277; CHECK-NEXT: add a2, a0, a22278; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2279; CHECK-NEXT: vmv.v.i v8, 02280; CHECK-NEXT: .LBB36_1: # %vector.body2281; CHECK-NEXT: # =>This Inner Loop Header: Depth=12282; CHECK-NEXT: vle32.v v9, (a0)2283; CHECK-NEXT: vmseq.vx v0, v9, a12284; CHECK-NEXT: vse32.v v8, (a0), v0.t2285; CHECK-NEXT: addi a0, a0, 162286; CHECK-NEXT: bne a0, a2, .LBB36_12287; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2288; CHECK-NEXT: ret2289entry:2290 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %y, i32 02291 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2292 br label %vector.body2293 2294vector.body: ; preds = %vector.body, %entry2295 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2296 %0 = getelementptr inbounds i32, ptr %x, i64 %index2297 %wide.load = load <4 x i32>, ptr %0, align 42298 %1 = icmp eq <4 x i32> %wide.load, %broadcast.splat2299 call void @llvm.masked.store.v4i32.p0(<4 x i32> zeroinitializer, ptr %0, i32 4, <4 x i1> %1)2300 %index.next = add nuw i64 %index, 42301 %2 = icmp eq i64 %index.next, 10242302 br i1 %2, label %for.cond.cleanup, label %vector.body2303 2304for.cond.cleanup: ; preds = %vector.body2305 ret void2306}2307 2308define void @sink_splat_fcmp(ptr nocapture %x, float %y) {2309; CHECK-LABEL: sink_splat_fcmp:2310; CHECK: # %bb.0: # %entry2311; CHECK-NEXT: lui a1, 12312; CHECK-NEXT: add a1, a0, a12313; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2314; CHECK-NEXT: vmv.v.i v8, 02315; CHECK-NEXT: .LBB37_1: # %vector.body2316; CHECK-NEXT: # =>This Inner Loop Header: Depth=12317; CHECK-NEXT: vle32.v v9, (a0)2318; CHECK-NEXT: vmfeq.vf v0, v9, fa02319; CHECK-NEXT: vse32.v v8, (a0), v0.t2320; CHECK-NEXT: addi a0, a0, 162321; CHECK-NEXT: bne a0, a1, .LBB37_12322; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2323; CHECK-NEXT: ret2324entry:2325 %broadcast.splatinsert = insertelement <4 x float> poison, float %y, i32 02326 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer2327 br label %vector.body2328 2329vector.body: ; preds = %vector.body, %entry2330 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2331 %0 = getelementptr inbounds float, ptr %x, i64 %index2332 %wide.load = load <4 x float>, ptr %0, align 42333 %1 = fcmp fast oeq <4 x float> %wide.load, %broadcast.splat2334 call void @llvm.masked.store.v4f32.p0(<4 x float> zeroinitializer, ptr %0, i32 4, <4 x i1> %1)2335 %index.next = add nuw i64 %index, 42336 %2 = icmp eq i64 %index.next, 10242337 br i1 %2, label %for.cond.cleanup, label %vector.body2338 2339for.cond.cleanup: ; preds = %vector.body2340 ret void2341}2342 2343define void @sink_splat_udiv(ptr nocapture %a, i32 signext %x) {2344; CHECK-LABEL: sink_splat_udiv:2345; CHECK: # %bb.0: # %entry2346; CHECK-NEXT: lui a2, 12347; CHECK-NEXT: add a2, a0, a22348; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2349; CHECK-NEXT: .LBB38_1: # %vector.body2350; CHECK-NEXT: # =>This Inner Loop Header: Depth=12351; CHECK-NEXT: vle32.v v8, (a0)2352; CHECK-NEXT: vdivu.vx v8, v8, a12353; CHECK-NEXT: vse32.v v8, (a0)2354; CHECK-NEXT: addi a0, a0, 162355; CHECK-NEXT: bne a0, a2, .LBB38_12356; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2357; CHECK-NEXT: ret2358entry:2359 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02360 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2361 br label %vector.body2362 2363vector.body: ; preds = %vector.body, %entry2364 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2365 %0 = getelementptr inbounds i32, ptr %a, i64 %index2366 %wide.load = load <4 x i32>, ptr %0, align 42367 %1 = udiv <4 x i32> %wide.load, %broadcast.splat2368 store <4 x i32> %1, ptr %0, align 42369 %index.next = add nuw i64 %index, 42370 %2 = icmp eq i64 %index.next, 10242371 br i1 %2, label %for.cond.cleanup, label %vector.body2372 2373for.cond.cleanup: ; preds = %vector.body2374 ret void2375}2376 2377define void @sink_splat_sdiv(ptr nocapture %a, i32 signext %x) {2378; CHECK-LABEL: sink_splat_sdiv:2379; CHECK: # %bb.0: # %entry2380; CHECK-NEXT: lui a2, 12381; CHECK-NEXT: add a2, a0, a22382; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2383; CHECK-NEXT: .LBB39_1: # %vector.body2384; CHECK-NEXT: # =>This Inner Loop Header: Depth=12385; CHECK-NEXT: vle32.v v8, (a0)2386; CHECK-NEXT: vdiv.vx v8, v8, a12387; CHECK-NEXT: vse32.v v8, (a0)2388; CHECK-NEXT: addi a0, a0, 162389; CHECK-NEXT: bne a0, a2, .LBB39_12390; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2391; CHECK-NEXT: ret2392entry:2393 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02394 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2395 br label %vector.body2396 2397vector.body: ; preds = %vector.body, %entry2398 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2399 %0 = getelementptr inbounds i32, ptr %a, i64 %index2400 %wide.load = load <4 x i32>, ptr %0, align 42401 %1 = sdiv <4 x i32> %wide.load, %broadcast.splat2402 store <4 x i32> %1, ptr %0, align 42403 %index.next = add nuw i64 %index, 42404 %2 = icmp eq i64 %index.next, 10242405 br i1 %2, label %for.cond.cleanup, label %vector.body2406 2407for.cond.cleanup: ; preds = %vector.body2408 ret void2409}2410 2411define void @sink_splat_urem(ptr nocapture %a, i32 signext %x) {2412; CHECK-LABEL: sink_splat_urem:2413; CHECK: # %bb.0: # %entry2414; CHECK-NEXT: lui a2, 12415; CHECK-NEXT: add a2, a0, a22416; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2417; CHECK-NEXT: .LBB40_1: # %vector.body2418; CHECK-NEXT: # =>This Inner Loop Header: Depth=12419; CHECK-NEXT: vle32.v v8, (a0)2420; CHECK-NEXT: vremu.vx v8, v8, a12421; CHECK-NEXT: vse32.v v8, (a0)2422; CHECK-NEXT: addi a0, a0, 162423; CHECK-NEXT: bne a0, a2, .LBB40_12424; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2425; CHECK-NEXT: ret2426entry:2427 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02428 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2429 br label %vector.body2430 2431vector.body: ; preds = %vector.body, %entry2432 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2433 %0 = getelementptr inbounds i32, ptr %a, i64 %index2434 %wide.load = load <4 x i32>, ptr %0, align 42435 %1 = urem <4 x i32> %wide.load, %broadcast.splat2436 store <4 x i32> %1, ptr %0, align 42437 %index.next = add nuw i64 %index, 42438 %2 = icmp eq i64 %index.next, 10242439 br i1 %2, label %for.cond.cleanup, label %vector.body2440 2441for.cond.cleanup: ; preds = %vector.body2442 ret void2443}2444 2445define void @sink_splat_srem(ptr nocapture %a, i32 signext %x) {2446; CHECK-LABEL: sink_splat_srem:2447; CHECK: # %bb.0: # %entry2448; CHECK-NEXT: lui a2, 12449; CHECK-NEXT: add a2, a0, a22450; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2451; CHECK-NEXT: .LBB41_1: # %vector.body2452; CHECK-NEXT: # =>This Inner Loop Header: Depth=12453; CHECK-NEXT: vle32.v v8, (a0)2454; CHECK-NEXT: vrem.vx v8, v8, a12455; CHECK-NEXT: vse32.v v8, (a0)2456; CHECK-NEXT: addi a0, a0, 162457; CHECK-NEXT: bne a0, a2, .LBB41_12458; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2459; CHECK-NEXT: ret2460entry:2461 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02462 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2463 br label %vector.body2464 2465vector.body: ; preds = %vector.body, %entry2466 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2467 %0 = getelementptr inbounds i32, ptr %a, i64 %index2468 %wide.load = load <4 x i32>, ptr %0, align 42469 %1 = srem <4 x i32> %wide.load, %broadcast.splat2470 store <4 x i32> %1, ptr %0, align 42471 %index.next = add nuw i64 %index, 42472 %2 = icmp eq i64 %index.next, 10242473 br i1 %2, label %for.cond.cleanup, label %vector.body2474 2475for.cond.cleanup: ; preds = %vector.body2476 ret void2477}2478 2479define void @sink_splat_udiv_scalable(ptr nocapture %a, i32 signext %x) {2480; CHECK-LABEL: sink_splat_udiv_scalable:2481; CHECK: # %bb.0: # %entry2482; CHECK-NEXT: csrr a5, vlenb2483; CHECK-NEXT: srli a3, a5, 12484; CHECK-NEXT: li a2, 10242485; CHECK-NEXT: bgeu a2, a3, .LBB42_22486; CHECK-NEXT: # %bb.1:2487; CHECK-NEXT: li a2, 02488; CHECK-NEXT: j .LBB42_52489; CHECK-NEXT: .LBB42_2: # %vector.ph2490; CHECK-NEXT: addi a2, a3, -12491; CHECK-NEXT: andi a4, a2, 10242492; CHECK-NEXT: xori a2, a4, 10242493; CHECK-NEXT: slli a5, a5, 12494; CHECK-NEXT: mv a6, a02495; CHECK-NEXT: mv a7, a22496; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma2497; CHECK-NEXT: .LBB42_3: # %vector.body2498; CHECK-NEXT: # =>This Inner Loop Header: Depth=12499; CHECK-NEXT: vl2re32.v v8, (a6)2500; CHECK-NEXT: vdivu.vx v8, v8, a12501; CHECK-NEXT: sub a7, a7, a32502; CHECK-NEXT: vs2r.v v8, (a6)2503; CHECK-NEXT: add a6, a6, a52504; CHECK-NEXT: bnez a7, .LBB42_32505; CHECK-NEXT: # %bb.4: # %middle.block2506; CHECK-NEXT: beqz a4, .LBB42_72507; CHECK-NEXT: .LBB42_5: # %for.body.preheader2508; CHECK-NEXT: slli a2, a2, 22509; CHECK-NEXT: lui a3, 12510; CHECK-NEXT: add a2, a0, a22511; CHECK-NEXT: add a0, a0, a32512; CHECK-NEXT: .LBB42_6: # %for.body2513; CHECK-NEXT: # =>This Inner Loop Header: Depth=12514; CHECK-NEXT: lw a3, 0(a2)2515; CHECK-NEXT: divuw a3, a3, a12516; CHECK-NEXT: sw a3, 0(a2)2517; CHECK-NEXT: addi a2, a2, 42518; CHECK-NEXT: bne a2, a0, .LBB42_62519; CHECK-NEXT: .LBB42_7: # %for.cond.cleanup2520; CHECK-NEXT: ret2521entry:2522 %0 = call i64 @llvm.vscale.i64()2523 %1 = shl i64 %0, 22524 %min.iters.check = icmp ugt i64 %1, 10242525 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph2526 2527vector.ph: ; preds = %entry2528 %2 = call i64 @llvm.vscale.i64()2529 %3 = shl i64 %2, 22530 %n.mod.vf = urem i64 1024, %32531 %n.vec = sub nsw i64 1024, %n.mod.vf2532 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 02533 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer2534 %4 = call i64 @llvm.vscale.i64()2535 %5 = shl i64 %4, 22536 br label %vector.body2537 2538vector.body: ; preds = %vector.body, %vector.ph2539 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]2540 %6 = getelementptr inbounds i32, ptr %a, i64 %index2541 %wide.load = load <vscale x 4 x i32>, ptr %6, align 42542 %7 = udiv <vscale x 4 x i32> %wide.load, %broadcast.splat2543 store <vscale x 4 x i32> %7, ptr %6, align 42544 %index.next = add nuw i64 %index, %52545 %8 = icmp eq i64 %index.next, %n.vec2546 br i1 %8, label %middle.block, label %vector.body2547 2548middle.block: ; preds = %vector.body2549 %cmp.n = icmp eq i64 %n.mod.vf, 02550 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader2551 2552for.body.preheader: ; preds = %entry, %middle.block2553 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]2554 br label %for.body2555 2556for.cond.cleanup: ; preds = %for.body, %middle.block2557 ret void2558 2559for.body: ; preds = %for.body.preheader, %for.body2560 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]2561 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2562 %9 = load i32, ptr %arrayidx, align 42563 %div = udiv i32 %9, %x2564 store i32 %div, ptr %arrayidx, align 42565 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12566 %cmp.not = icmp eq i64 %indvars.iv.next, 10242567 br i1 %cmp.not, label %for.cond.cleanup, label %for.body2568}2569 2570define void @sink_splat_sdiv_scalable(ptr nocapture %a, i32 signext %x) {2571; CHECK-LABEL: sink_splat_sdiv_scalable:2572; CHECK: # %bb.0: # %entry2573; CHECK-NEXT: csrr a5, vlenb2574; CHECK-NEXT: srli a3, a5, 12575; CHECK-NEXT: li a2, 10242576; CHECK-NEXT: bgeu a2, a3, .LBB43_22577; CHECK-NEXT: # %bb.1:2578; CHECK-NEXT: li a2, 02579; CHECK-NEXT: j .LBB43_52580; CHECK-NEXT: .LBB43_2: # %vector.ph2581; CHECK-NEXT: addi a2, a3, -12582; CHECK-NEXT: andi a4, a2, 10242583; CHECK-NEXT: xori a2, a4, 10242584; CHECK-NEXT: slli a5, a5, 12585; CHECK-NEXT: mv a6, a02586; CHECK-NEXT: mv a7, a22587; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma2588; CHECK-NEXT: .LBB43_3: # %vector.body2589; CHECK-NEXT: # =>This Inner Loop Header: Depth=12590; CHECK-NEXT: vl2re32.v v8, (a6)2591; CHECK-NEXT: vdiv.vx v8, v8, a12592; CHECK-NEXT: sub a7, a7, a32593; CHECK-NEXT: vs2r.v v8, (a6)2594; CHECK-NEXT: add a6, a6, a52595; CHECK-NEXT: bnez a7, .LBB43_32596; CHECK-NEXT: # %bb.4: # %middle.block2597; CHECK-NEXT: beqz a4, .LBB43_72598; CHECK-NEXT: .LBB43_5: # %for.body.preheader2599; CHECK-NEXT: slli a2, a2, 22600; CHECK-NEXT: lui a3, 12601; CHECK-NEXT: add a2, a0, a22602; CHECK-NEXT: add a0, a0, a32603; CHECK-NEXT: .LBB43_6: # %for.body2604; CHECK-NEXT: # =>This Inner Loop Header: Depth=12605; CHECK-NEXT: lw a3, 0(a2)2606; CHECK-NEXT: divw a3, a3, a12607; CHECK-NEXT: sw a3, 0(a2)2608; CHECK-NEXT: addi a2, a2, 42609; CHECK-NEXT: bne a2, a0, .LBB43_62610; CHECK-NEXT: .LBB43_7: # %for.cond.cleanup2611; CHECK-NEXT: ret2612entry:2613 %0 = call i64 @llvm.vscale.i64()2614 %1 = shl i64 %0, 22615 %min.iters.check = icmp ugt i64 %1, 10242616 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph2617 2618vector.ph: ; preds = %entry2619 %2 = call i64 @llvm.vscale.i64()2620 %3 = shl i64 %2, 22621 %n.mod.vf = urem i64 1024, %32622 %n.vec = sub nsw i64 1024, %n.mod.vf2623 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 02624 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer2625 %4 = call i64 @llvm.vscale.i64()2626 %5 = shl i64 %4, 22627 br label %vector.body2628 2629vector.body: ; preds = %vector.body, %vector.ph2630 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]2631 %6 = getelementptr inbounds i32, ptr %a, i64 %index2632 %wide.load = load <vscale x 4 x i32>, ptr %6, align 42633 %7 = sdiv <vscale x 4 x i32> %wide.load, %broadcast.splat2634 store <vscale x 4 x i32> %7, ptr %6, align 42635 %index.next = add nuw i64 %index, %52636 %8 = icmp eq i64 %index.next, %n.vec2637 br i1 %8, label %middle.block, label %vector.body2638 2639middle.block: ; preds = %vector.body2640 %cmp.n = icmp eq i64 %n.mod.vf, 02641 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader2642 2643for.body.preheader: ; preds = %entry, %middle.block2644 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]2645 br label %for.body2646 2647for.cond.cleanup: ; preds = %for.body, %middle.block2648 ret void2649 2650for.body: ; preds = %for.body.preheader, %for.body2651 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]2652 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2653 %9 = load i32, ptr %arrayidx, align 42654 %div = sdiv i32 %9, %x2655 store i32 %div, ptr %arrayidx, align 42656 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12657 %cmp.not = icmp eq i64 %indvars.iv.next, 10242658 br i1 %cmp.not, label %for.cond.cleanup, label %for.body2659}2660 2661define void @sink_splat_urem_scalable(ptr nocapture %a, i32 signext %x) {2662; CHECK-LABEL: sink_splat_urem_scalable:2663; CHECK: # %bb.0: # %entry2664; CHECK-NEXT: csrr a5, vlenb2665; CHECK-NEXT: srli a3, a5, 12666; CHECK-NEXT: li a2, 10242667; CHECK-NEXT: bgeu a2, a3, .LBB44_22668; CHECK-NEXT: # %bb.1:2669; CHECK-NEXT: li a2, 02670; CHECK-NEXT: j .LBB44_52671; CHECK-NEXT: .LBB44_2: # %vector.ph2672; CHECK-NEXT: addi a2, a3, -12673; CHECK-NEXT: andi a4, a2, 10242674; CHECK-NEXT: xori a2, a4, 10242675; CHECK-NEXT: slli a5, a5, 12676; CHECK-NEXT: mv a6, a02677; CHECK-NEXT: mv a7, a22678; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma2679; CHECK-NEXT: .LBB44_3: # %vector.body2680; CHECK-NEXT: # =>This Inner Loop Header: Depth=12681; CHECK-NEXT: vl2re32.v v8, (a6)2682; CHECK-NEXT: vremu.vx v8, v8, a12683; CHECK-NEXT: sub a7, a7, a32684; CHECK-NEXT: vs2r.v v8, (a6)2685; CHECK-NEXT: add a6, a6, a52686; CHECK-NEXT: bnez a7, .LBB44_32687; CHECK-NEXT: # %bb.4: # %middle.block2688; CHECK-NEXT: beqz a4, .LBB44_72689; CHECK-NEXT: .LBB44_5: # %for.body.preheader2690; CHECK-NEXT: slli a2, a2, 22691; CHECK-NEXT: lui a3, 12692; CHECK-NEXT: add a2, a0, a22693; CHECK-NEXT: add a0, a0, a32694; CHECK-NEXT: .LBB44_6: # %for.body2695; CHECK-NEXT: # =>This Inner Loop Header: Depth=12696; CHECK-NEXT: lw a3, 0(a2)2697; CHECK-NEXT: remuw a3, a3, a12698; CHECK-NEXT: sw a3, 0(a2)2699; CHECK-NEXT: addi a2, a2, 42700; CHECK-NEXT: bne a2, a0, .LBB44_62701; CHECK-NEXT: .LBB44_7: # %for.cond.cleanup2702; CHECK-NEXT: ret2703entry:2704 %0 = call i64 @llvm.vscale.i64()2705 %1 = shl i64 %0, 22706 %min.iters.check = icmp ugt i64 %1, 10242707 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph2708 2709vector.ph: ; preds = %entry2710 %2 = call i64 @llvm.vscale.i64()2711 %3 = shl i64 %2, 22712 %n.mod.vf = urem i64 1024, %32713 %n.vec = sub nsw i64 1024, %n.mod.vf2714 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 02715 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer2716 %4 = call i64 @llvm.vscale.i64()2717 %5 = shl i64 %4, 22718 br label %vector.body2719 2720vector.body: ; preds = %vector.body, %vector.ph2721 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]2722 %6 = getelementptr inbounds i32, ptr %a, i64 %index2723 %wide.load = load <vscale x 4 x i32>, ptr %6, align 42724 %7 = urem <vscale x 4 x i32> %wide.load, %broadcast.splat2725 store <vscale x 4 x i32> %7, ptr %6, align 42726 %index.next = add nuw i64 %index, %52727 %8 = icmp eq i64 %index.next, %n.vec2728 br i1 %8, label %middle.block, label %vector.body2729 2730middle.block: ; preds = %vector.body2731 %cmp.n = icmp eq i64 %n.mod.vf, 02732 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader2733 2734for.body.preheader: ; preds = %entry, %middle.block2735 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]2736 br label %for.body2737 2738for.cond.cleanup: ; preds = %for.body, %middle.block2739 ret void2740 2741for.body: ; preds = %for.body.preheader, %for.body2742 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]2743 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2744 %9 = load i32, ptr %arrayidx, align 42745 %rem = urem i32 %9, %x2746 store i32 %rem, ptr %arrayidx, align 42747 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12748 %cmp.not = icmp eq i64 %indvars.iv.next, 10242749 br i1 %cmp.not, label %for.cond.cleanup, label %for.body2750}2751 2752define void @sink_splat_srem_scalable(ptr nocapture %a, i32 signext %x) {2753; CHECK-LABEL: sink_splat_srem_scalable:2754; CHECK: # %bb.0: # %entry2755; CHECK-NEXT: csrr a5, vlenb2756; CHECK-NEXT: srli a3, a5, 12757; CHECK-NEXT: li a2, 10242758; CHECK-NEXT: bgeu a2, a3, .LBB45_22759; CHECK-NEXT: # %bb.1:2760; CHECK-NEXT: li a2, 02761; CHECK-NEXT: j .LBB45_52762; CHECK-NEXT: .LBB45_2: # %vector.ph2763; CHECK-NEXT: addi a2, a3, -12764; CHECK-NEXT: andi a4, a2, 10242765; CHECK-NEXT: xori a2, a4, 10242766; CHECK-NEXT: slli a5, a5, 12767; CHECK-NEXT: mv a6, a02768; CHECK-NEXT: mv a7, a22769; CHECK-NEXT: vsetvli t0, zero, e32, m2, ta, ma2770; CHECK-NEXT: .LBB45_3: # %vector.body2771; CHECK-NEXT: # =>This Inner Loop Header: Depth=12772; CHECK-NEXT: vl2re32.v v8, (a6)2773; CHECK-NEXT: vrem.vx v8, v8, a12774; CHECK-NEXT: sub a7, a7, a32775; CHECK-NEXT: vs2r.v v8, (a6)2776; CHECK-NEXT: add a6, a6, a52777; CHECK-NEXT: bnez a7, .LBB45_32778; CHECK-NEXT: # %bb.4: # %middle.block2779; CHECK-NEXT: beqz a4, .LBB45_72780; CHECK-NEXT: .LBB45_5: # %for.body.preheader2781; CHECK-NEXT: slli a2, a2, 22782; CHECK-NEXT: lui a3, 12783; CHECK-NEXT: add a2, a0, a22784; CHECK-NEXT: add a0, a0, a32785; CHECK-NEXT: .LBB45_6: # %for.body2786; CHECK-NEXT: # =>This Inner Loop Header: Depth=12787; CHECK-NEXT: lw a3, 0(a2)2788; CHECK-NEXT: remw a3, a3, a12789; CHECK-NEXT: sw a3, 0(a2)2790; CHECK-NEXT: addi a2, a2, 42791; CHECK-NEXT: bne a2, a0, .LBB45_62792; CHECK-NEXT: .LBB45_7: # %for.cond.cleanup2793; CHECK-NEXT: ret2794entry:2795 %0 = call i64 @llvm.vscale.i64()2796 %1 = shl i64 %0, 22797 %min.iters.check = icmp ugt i64 %1, 10242798 br i1 %min.iters.check, label %for.body.preheader, label %vector.ph2799 2800vector.ph: ; preds = %entry2801 %2 = call i64 @llvm.vscale.i64()2802 %3 = shl i64 %2, 22803 %n.mod.vf = urem i64 1024, %32804 %n.vec = sub nsw i64 1024, %n.mod.vf2805 %broadcast.splatinsert = insertelement <vscale x 4 x i32> poison, i32 %x, i32 02806 %broadcast.splat = shufflevector <vscale x 4 x i32> %broadcast.splatinsert, <vscale x 4 x i32> poison, <vscale x 4 x i32> zeroinitializer2807 %4 = call i64 @llvm.vscale.i64()2808 %5 = shl i64 %4, 22809 br label %vector.body2810 2811vector.body: ; preds = %vector.body, %vector.ph2812 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]2813 %6 = getelementptr inbounds i32, ptr %a, i64 %index2814 %wide.load = load <vscale x 4 x i32>, ptr %6, align 42815 %7 = srem <vscale x 4 x i32> %wide.load, %broadcast.splat2816 store <vscale x 4 x i32> %7, ptr %6, align 42817 %index.next = add nuw i64 %index, %52818 %8 = icmp eq i64 %index.next, %n.vec2819 br i1 %8, label %middle.block, label %vector.body2820 2821middle.block: ; preds = %vector.body2822 %cmp.n = icmp eq i64 %n.mod.vf, 02823 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader2824 2825for.body.preheader: ; preds = %entry, %middle.block2826 %indvars.iv.ph = phi i64 [ 0, %entry ], [ %n.vec, %middle.block ]2827 br label %for.body2828 2829for.cond.cleanup: ; preds = %for.body, %middle.block2830 ret void2831 2832for.body: ; preds = %for.body.preheader, %for.body2833 %indvars.iv = phi i64 [ %indvars.iv.next, %for.body ], [ %indvars.iv.ph, %for.body.preheader ]2834 %arrayidx = getelementptr inbounds i32, ptr %a, i64 %indvars.iv2835 %9 = load i32, ptr %arrayidx, align 42836 %rem = srem i32 %9, %x2837 store i32 %rem, ptr %arrayidx, align 42838 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 12839 %cmp.not = icmp eq i64 %indvars.iv.next, 10242840 br i1 %cmp.not, label %for.cond.cleanup, label %for.body2841}2842 2843define void @sink_splat_min(ptr nocapture %a, i32 signext %x) {2844; CHECK-LABEL: sink_splat_min:2845; CHECK: # %bb.0: # %entry2846; CHECK-NEXT: li a2, 10242847; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2848; CHECK-NEXT: .LBB46_1: # %vector.body2849; CHECK-NEXT: # =>This Inner Loop Header: Depth=12850; CHECK-NEXT: vle32.v v8, (a0)2851; CHECK-NEXT: addi a2, a2, 42852; CHECK-NEXT: vmin.vx v8, v8, a12853; CHECK-NEXT: vse32.v v8, (a0)2854; CHECK-NEXT: addi a0, a0, -162855; CHECK-NEXT: bnez a2, .LBB46_12856; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2857; CHECK-NEXT: ret2858entry:2859 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02860 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2861 br label %vector.body2862 2863vector.body: ; preds = %vector.body, %entry2864 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2865 %0 = getelementptr inbounds i32, ptr %a, i64 %index2866 %wide.load = load <4 x i32>, ptr %0, align 42867 %1 = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)2868 store <4 x i32> %1, ptr %0, align 42869 %index.next = sub nuw i64 %index, 42870 %2 = icmp eq i64 %index.next, 10242871 br i1 %2, label %for.cond.cleanup, label %vector.body2872 2873for.cond.cleanup: ; preds = %vector.body2874 ret void2875}2876 2877define void @sink_splat_min_commute(ptr nocapture %a, i32 signext %x) {2878; CHECK-LABEL: sink_splat_min_commute:2879; CHECK: # %bb.0: # %entry2880; CHECK-NEXT: li a2, 10242881; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2882; CHECK-NEXT: .LBB47_1: # %vector.body2883; CHECK-NEXT: # =>This Inner Loop Header: Depth=12884; CHECK-NEXT: vle32.v v8, (a0)2885; CHECK-NEXT: addi a2, a2, 42886; CHECK-NEXT: vmin.vx v8, v8, a12887; CHECK-NEXT: vse32.v v8, (a0)2888; CHECK-NEXT: addi a0, a0, -162889; CHECK-NEXT: bnez a2, .LBB47_12890; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2891; CHECK-NEXT: ret2892entry:2893 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02894 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2895 br label %vector.body2896 2897vector.body: ; preds = %vector.body, %entry2898 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2899 %0 = getelementptr inbounds i32, ptr %a, i64 %index2900 %wide.load = load <4 x i32>, ptr %0, align 42901 %1 = call <4 x i32> @llvm.smin.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load)2902 store <4 x i32> %1, ptr %0, align 42903 %index.next = sub nuw i64 %index, 42904 %2 = icmp eq i64 %index.next, 10242905 br i1 %2, label %for.cond.cleanup, label %vector.body2906 2907for.cond.cleanup: ; preds = %vector.body2908 ret void2909}2910 2911define void @sink_splat_max(ptr nocapture %a, i32 signext %x) {2912; CHECK-LABEL: sink_splat_max:2913; CHECK: # %bb.0: # %entry2914; CHECK-NEXT: li a2, 10242915; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2916; CHECK-NEXT: .LBB48_1: # %vector.body2917; CHECK-NEXT: # =>This Inner Loop Header: Depth=12918; CHECK-NEXT: vle32.v v8, (a0)2919; CHECK-NEXT: addi a2, a2, 42920; CHECK-NEXT: vmax.vx v8, v8, a12921; CHECK-NEXT: vse32.v v8, (a0)2922; CHECK-NEXT: addi a0, a0, -162923; CHECK-NEXT: bnez a2, .LBB48_12924; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2925; CHECK-NEXT: ret2926entry:2927 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02928 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2929 br label %vector.body2930 2931vector.body: ; preds = %vector.body, %entry2932 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2933 %0 = getelementptr inbounds i32, ptr %a, i64 %index2934 %wide.load = load <4 x i32>, ptr %0, align 42935 %1 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)2936 store <4 x i32> %1, ptr %0, align 42937 %index.next = sub nuw i64 %index, 42938 %2 = icmp eq i64 %index.next, 10242939 br i1 %2, label %for.cond.cleanup, label %vector.body2940 2941for.cond.cleanup: ; preds = %vector.body2942 ret void2943}2944 2945define void @sink_splat_max_commute(ptr nocapture %a, i32 signext %x) {2946; CHECK-LABEL: sink_splat_max_commute:2947; CHECK: # %bb.0: # %entry2948; CHECK-NEXT: li a2, 10242949; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2950; CHECK-NEXT: .LBB49_1: # %vector.body2951; CHECK-NEXT: # =>This Inner Loop Header: Depth=12952; CHECK-NEXT: vle32.v v8, (a0)2953; CHECK-NEXT: addi a2, a2, 42954; CHECK-NEXT: vmax.vx v8, v8, a12955; CHECK-NEXT: vse32.v v8, (a0)2956; CHECK-NEXT: addi a0, a0, -162957; CHECK-NEXT: bnez a2, .LBB49_12958; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2959; CHECK-NEXT: ret2960entry:2961 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02962 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2963 br label %vector.body2964 2965vector.body: ; preds = %vector.body, %entry2966 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]2967 %0 = getelementptr inbounds i32, ptr %a, i64 %index2968 %wide.load = load <4 x i32>, ptr %0, align 42969 %1 = call <4 x i32> @llvm.smax.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load)2970 store <4 x i32> %1, ptr %0, align 42971 %index.next = sub nuw i64 %index, 42972 %2 = icmp eq i64 %index.next, 10242973 br i1 %2, label %for.cond.cleanup, label %vector.body2974 2975for.cond.cleanup: ; preds = %vector.body2976 ret void2977}2978 2979define void @sink_splat_umin(ptr nocapture %a, i32 signext %x) {2980; CHECK-LABEL: sink_splat_umin:2981; CHECK: # %bb.0: # %entry2982; CHECK-NEXT: li a2, 10242983; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma2984; CHECK-NEXT: .LBB50_1: # %vector.body2985; CHECK-NEXT: # =>This Inner Loop Header: Depth=12986; CHECK-NEXT: vle32.v v8, (a0)2987; CHECK-NEXT: addi a2, a2, 42988; CHECK-NEXT: vminu.vx v8, v8, a12989; CHECK-NEXT: vse32.v v8, (a0)2990; CHECK-NEXT: addi a0, a0, -162991; CHECK-NEXT: bnez a2, .LBB50_12992; CHECK-NEXT: # %bb.2: # %for.cond.cleanup2993; CHECK-NEXT: ret2994entry:2995 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 02996 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer2997 br label %vector.body2998 2999vector.body: ; preds = %vector.body, %entry3000 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3001 %0 = getelementptr inbounds i32, ptr %a, i64 %index3002 %wide.load = load <4 x i32>, ptr %0, align 43003 %1 = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)3004 store <4 x i32> %1, ptr %0, align 43005 %index.next = sub nuw i64 %index, 43006 %2 = icmp eq i64 %index.next, 10243007 br i1 %2, label %for.cond.cleanup, label %vector.body3008 3009for.cond.cleanup: ; preds = %vector.body3010 ret void3011}3012 3013define void @sink_splat_umin_commute(ptr nocapture %a, i32 signext %x) {3014; CHECK-LABEL: sink_splat_umin_commute:3015; CHECK: # %bb.0: # %entry3016; CHECK-NEXT: li a2, 10243017; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3018; CHECK-NEXT: .LBB51_1: # %vector.body3019; CHECK-NEXT: # =>This Inner Loop Header: Depth=13020; CHECK-NEXT: vle32.v v8, (a0)3021; CHECK-NEXT: addi a2, a2, 43022; CHECK-NEXT: vminu.vx v8, v8, a13023; CHECK-NEXT: vse32.v v8, (a0)3024; CHECK-NEXT: addi a0, a0, -163025; CHECK-NEXT: bnez a2, .LBB51_13026; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3027; CHECK-NEXT: ret3028entry:3029 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03030 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3031 br label %vector.body3032 3033vector.body: ; preds = %vector.body, %entry3034 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3035 %0 = getelementptr inbounds i32, ptr %a, i64 %index3036 %wide.load = load <4 x i32>, ptr %0, align 43037 %1 = call <4 x i32> @llvm.umin.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load)3038 store <4 x i32> %1, ptr %0, align 43039 %index.next = sub nuw i64 %index, 43040 %2 = icmp eq i64 %index.next, 10243041 br i1 %2, label %for.cond.cleanup, label %vector.body3042 3043for.cond.cleanup: ; preds = %vector.body3044 ret void3045}3046 3047define void @sink_splat_umax(ptr nocapture %a, i32 signext %x) {3048; CHECK-LABEL: sink_splat_umax:3049; CHECK: # %bb.0: # %entry3050; CHECK-NEXT: li a2, 10243051; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3052; CHECK-NEXT: .LBB52_1: # %vector.body3053; CHECK-NEXT: # =>This Inner Loop Header: Depth=13054; CHECK-NEXT: vle32.v v8, (a0)3055; CHECK-NEXT: addi a2, a2, 43056; CHECK-NEXT: vmaxu.vx v8, v8, a13057; CHECK-NEXT: vse32.v v8, (a0)3058; CHECK-NEXT: addi a0, a0, -163059; CHECK-NEXT: bnez a2, .LBB52_13060; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3061; CHECK-NEXT: ret3062entry:3063 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03064 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3065 br label %vector.body3066 3067vector.body: ; preds = %vector.body, %entry3068 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3069 %0 = getelementptr inbounds i32, ptr %a, i64 %index3070 %wide.load = load <4 x i32>, ptr %0, align 43071 %1 = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)3072 store <4 x i32> %1, ptr %0, align 43073 %index.next = sub nuw i64 %index, 43074 %2 = icmp eq i64 %index.next, 10243075 br i1 %2, label %for.cond.cleanup, label %vector.body3076 3077for.cond.cleanup: ; preds = %vector.body3078 ret void3079}3080 3081define void @sink_splat_umax_commute(ptr nocapture %a, i32 signext %x) {3082; CHECK-LABEL: sink_splat_umax_commute:3083; CHECK: # %bb.0: # %entry3084; CHECK-NEXT: li a2, 10243085; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3086; CHECK-NEXT: .LBB53_1: # %vector.body3087; CHECK-NEXT: # =>This Inner Loop Header: Depth=13088; CHECK-NEXT: vle32.v v8, (a0)3089; CHECK-NEXT: addi a2, a2, 43090; CHECK-NEXT: vmaxu.vx v8, v8, a13091; CHECK-NEXT: vse32.v v8, (a0)3092; CHECK-NEXT: addi a0, a0, -163093; CHECK-NEXT: bnez a2, .LBB53_13094; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3095; CHECK-NEXT: ret3096entry:3097 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03098 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3099 br label %vector.body3100 3101vector.body: ; preds = %vector.body, %entry3102 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3103 %0 = getelementptr inbounds i32, ptr %a, i64 %index3104 %wide.load = load <4 x i32>, ptr %0, align 43105 %1 = call <4 x i32> @llvm.umax.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load)3106 store <4 x i32> %1, ptr %0, align 43107 %index.next = sub nuw i64 %index, 43108 %2 = icmp eq i64 %index.next, 10243109 br i1 %2, label %for.cond.cleanup, label %vector.body3110 3111for.cond.cleanup: ; preds = %vector.body3112 ret void3113}3114 3115define void @sink_splat_sadd_sat(ptr nocapture %a, i32 signext %x) {3116; CHECK-LABEL: sink_splat_sadd_sat:3117; CHECK: # %bb.0: # %entry3118; CHECK-NEXT: lui a2, 13119; CHECK-NEXT: add a2, a0, a23120; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3121; CHECK-NEXT: .LBB54_1: # %vector.body3122; CHECK-NEXT: # =>This Inner Loop Header: Depth=13123; CHECK-NEXT: vle32.v v8, (a0)3124; CHECK-NEXT: vsadd.vx v8, v8, a13125; CHECK-NEXT: vse32.v v8, (a0)3126; CHECK-NEXT: addi a0, a0, 163127; CHECK-NEXT: bne a0, a2, .LBB54_13128; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3129; CHECK-NEXT: ret3130entry:3131 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03132 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3133 br label %vector.body3134 3135vector.body: ; preds = %vector.body, %entry3136 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3137 %0 = getelementptr inbounds i32, ptr %a, i64 %index3138 %wide.load = load <4 x i32>, ptr %0, align 43139 %1 = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)3140 store <4 x i32> %1, ptr %0, align 43141 %index.next = add nuw i64 %index, 43142 %2 = icmp eq i64 %index.next, 10243143 br i1 %2, label %for.cond.cleanup, label %vector.body3144 3145for.cond.cleanup: ; preds = %vector.body3146 ret void3147}3148 3149define void @sink_splat_sadd_sat_commute(ptr nocapture %a, i32 signext %x) {3150; CHECK-LABEL: sink_splat_sadd_sat_commute:3151; CHECK: # %bb.0: # %entry3152; CHECK-NEXT: lui a2, 13153; CHECK-NEXT: add a2, a0, a23154; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3155; CHECK-NEXT: .LBB55_1: # %vector.body3156; CHECK-NEXT: # =>This Inner Loop Header: Depth=13157; CHECK-NEXT: vle32.v v8, (a0)3158; CHECK-NEXT: vsadd.vx v8, v8, a13159; CHECK-NEXT: vse32.v v8, (a0)3160; CHECK-NEXT: addi a0, a0, 163161; CHECK-NEXT: bne a0, a2, .LBB55_13162; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3163; CHECK-NEXT: ret3164entry:3165 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03166 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3167 br label %vector.body3168 3169vector.body: ; preds = %vector.body, %entry3170 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3171 %0 = getelementptr inbounds i32, ptr %a, i64 %index3172 %wide.load = load <4 x i32>, ptr %0, align 43173 %1 = call <4 x i32> @llvm.sadd.sat.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load)3174 store <4 x i32> %1, ptr %0, align 43175 %index.next = add nuw i64 %index, 43176 %2 = icmp eq i64 %index.next, 10243177 br i1 %2, label %for.cond.cleanup, label %vector.body3178 3179for.cond.cleanup: ; preds = %vector.body3180 ret void3181}3182 3183define void @sink_splat_ssub_sat(ptr nocapture %a, i32 signext %x) {3184; CHECK-LABEL: sink_splat_ssub_sat:3185; CHECK: # %bb.0: # %entry3186; CHECK-NEXT: li a2, 10243187; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3188; CHECK-NEXT: .LBB56_1: # %vector.body3189; CHECK-NEXT: # =>This Inner Loop Header: Depth=13190; CHECK-NEXT: vle32.v v8, (a0)3191; CHECK-NEXT: addi a2, a2, 43192; CHECK-NEXT: vssub.vx v8, v8, a13193; CHECK-NEXT: vse32.v v8, (a0)3194; CHECK-NEXT: addi a0, a0, -163195; CHECK-NEXT: bnez a2, .LBB56_13196; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3197; CHECK-NEXT: ret3198entry:3199 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03200 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3201 br label %vector.body3202 3203vector.body: ; preds = %vector.body, %entry3204 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3205 %0 = getelementptr inbounds i32, ptr %a, i64 %index3206 %wide.load = load <4 x i32>, ptr %0, align 43207 %1 = call <4 x i32> @llvm.ssub.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)3208 store <4 x i32> %1, ptr %0, align 43209 %index.next = sub nuw i64 %index, 43210 %2 = icmp eq i64 %index.next, 10243211 br i1 %2, label %for.cond.cleanup, label %vector.body3212 3213for.cond.cleanup: ; preds = %vector.body3214 ret void3215}3216 3217define void @sink_splat_uadd_sat(ptr nocapture %a, i32 signext %x) {3218; CHECK-LABEL: sink_splat_uadd_sat:3219; CHECK: # %bb.0: # %entry3220; CHECK-NEXT: lui a2, 13221; CHECK-NEXT: add a2, a0, a23222; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3223; CHECK-NEXT: .LBB57_1: # %vector.body3224; CHECK-NEXT: # =>This Inner Loop Header: Depth=13225; CHECK-NEXT: vle32.v v8, (a0)3226; CHECK-NEXT: vsaddu.vx v8, v8, a13227; CHECK-NEXT: vse32.v v8, (a0)3228; CHECK-NEXT: addi a0, a0, 163229; CHECK-NEXT: bne a0, a2, .LBB57_13230; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3231; CHECK-NEXT: ret3232entry:3233 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03234 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3235 br label %vector.body3236 3237vector.body: ; preds = %vector.body, %entry3238 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3239 %0 = getelementptr inbounds i32, ptr %a, i64 %index3240 %wide.load = load <4 x i32>, ptr %0, align 43241 %1 = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)3242 store <4 x i32> %1, ptr %0, align 43243 %index.next = add nuw i64 %index, 43244 %2 = icmp eq i64 %index.next, 10243245 br i1 %2, label %for.cond.cleanup, label %vector.body3246 3247for.cond.cleanup: ; preds = %vector.body3248 ret void3249}3250 3251define void @sink_splat_uadd_sat_commute(ptr nocapture %a, i32 signext %x) {3252; CHECK-LABEL: sink_splat_uadd_sat_commute:3253; CHECK: # %bb.0: # %entry3254; CHECK-NEXT: lui a2, 13255; CHECK-NEXT: add a2, a0, a23256; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3257; CHECK-NEXT: .LBB58_1: # %vector.body3258; CHECK-NEXT: # =>This Inner Loop Header: Depth=13259; CHECK-NEXT: vle32.v v8, (a0)3260; CHECK-NEXT: vsaddu.vx v8, v8, a13261; CHECK-NEXT: vse32.v v8, (a0)3262; CHECK-NEXT: addi a0, a0, 163263; CHECK-NEXT: bne a0, a2, .LBB58_13264; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3265; CHECK-NEXT: ret3266entry:3267 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03268 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3269 br label %vector.body3270 3271vector.body: ; preds = %vector.body, %entry3272 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3273 %0 = getelementptr inbounds i32, ptr %a, i64 %index3274 %wide.load = load <4 x i32>, ptr %0, align 43275 %1 = call <4 x i32> @llvm.uadd.sat.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load)3276 store <4 x i32> %1, ptr %0, align 43277 %index.next = add nuw i64 %index, 43278 %2 = icmp eq i64 %index.next, 10243279 br i1 %2, label %for.cond.cleanup, label %vector.body3280 3281for.cond.cleanup: ; preds = %vector.body3282 ret void3283}3284 3285define void @sink_splat_usub_sat(ptr nocapture %a, i32 signext %x) {3286; CHECK-LABEL: sink_splat_usub_sat:3287; CHECK: # %bb.0: # %entry3288; CHECK-NEXT: li a2, 10243289; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3290; CHECK-NEXT: .LBB59_1: # %vector.body3291; CHECK-NEXT: # =>This Inner Loop Header: Depth=13292; CHECK-NEXT: vle32.v v8, (a0)3293; CHECK-NEXT: addi a2, a2, 43294; CHECK-NEXT: vssubu.vx v8, v8, a13295; CHECK-NEXT: vse32.v v8, (a0)3296; CHECK-NEXT: addi a0, a0, -163297; CHECK-NEXT: bnez a2, .LBB59_13298; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3299; CHECK-NEXT: ret3300entry:3301 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03302 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3303 br label %vector.body3304 3305vector.body: ; preds = %vector.body, %entry3306 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3307 %0 = getelementptr inbounds i32, ptr %a, i64 %index3308 %wide.load = load <4 x i32>, ptr %0, align 43309 %1 = call <4 x i32> @llvm.usub.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat)3310 store <4 x i32> %1, ptr %0, align 43311 %index.next = sub nuw i64 %index, 43312 %2 = icmp eq i64 %index.next, 10243313 br i1 %2, label %for.cond.cleanup, label %vector.body3314 3315for.cond.cleanup: ; preds = %vector.body3316 ret void3317}3318 3319define void @sink_splat_vp_mul(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3320; CHECK-LABEL: sink_splat_vp_mul:3321; CHECK: # %bb.0: # %entry3322; CHECK-NEXT: lui a3, 13323; CHECK-NEXT: add a3, a0, a33324; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3325; CHECK-NEXT: .LBB60_1: # %vector.body3326; CHECK-NEXT: # =>This Inner Loop Header: Depth=13327; CHECK-NEXT: vle32.v v8, (a0)3328; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3329; CHECK-NEXT: vmul.vx v8, v8, a1, v0.t3330; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3331; CHECK-NEXT: vse32.v v8, (a0)3332; CHECK-NEXT: addi a0, a0, 163333; CHECK-NEXT: bne a0, a3, .LBB60_13334; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3335; CHECK-NEXT: ret3336entry:3337 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03338 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3339 br label %vector.body3340 3341vector.body: ; preds = %vector.body, %entry3342 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3343 %0 = getelementptr inbounds i32, ptr %a, i64 %index3344 %wide.load = load <4 x i32>, ptr %0, align 43345 %1 = call <4 x i32> @llvm.vp.mul.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3346 store <4 x i32> %1, ptr %0, align 43347 %index.next = add nuw i64 %index, 43348 %2 = icmp eq i64 %index.next, 10243349 br i1 %2, label %for.cond.cleanup, label %vector.body3350 3351for.cond.cleanup: ; preds = %vector.body3352 ret void3353}3354 3355define void @sink_splat_vp_add(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3356; CHECK-LABEL: sink_splat_vp_add:3357; CHECK: # %bb.0: # %entry3358; CHECK-NEXT: lui a3, 13359; CHECK-NEXT: add a3, a0, a33360; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3361; CHECK-NEXT: .LBB61_1: # %vector.body3362; CHECK-NEXT: # =>This Inner Loop Header: Depth=13363; CHECK-NEXT: vle32.v v8, (a0)3364; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3365; CHECK-NEXT: vadd.vx v8, v8, a1, v0.t3366; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3367; CHECK-NEXT: vse32.v v8, (a0)3368; CHECK-NEXT: addi a0, a0, 163369; CHECK-NEXT: bne a0, a3, .LBB61_13370; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3371; CHECK-NEXT: ret3372entry:3373 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03374 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3375 br label %vector.body3376 3377vector.body: ; preds = %vector.body, %entry3378 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3379 %0 = getelementptr inbounds i32, ptr %a, i64 %index3380 %wide.load = load <4 x i32>, ptr %0, align 43381 %1 = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3382 store <4 x i32> %1, ptr %0, align 43383 %index.next = add nuw i64 %index, 43384 %2 = icmp eq i64 %index.next, 10243385 br i1 %2, label %for.cond.cleanup, label %vector.body3386 3387for.cond.cleanup: ; preds = %vector.body3388 ret void3389}3390 3391define void @sink_splat_vp_add_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3392; CHECK-LABEL: sink_splat_vp_add_commute:3393; CHECK: # %bb.0: # %entry3394; CHECK-NEXT: lui a3, 13395; CHECK-NEXT: add a3, a0, a33396; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3397; CHECK-NEXT: .LBB62_1: # %vector.body3398; CHECK-NEXT: # =>This Inner Loop Header: Depth=13399; CHECK-NEXT: vle32.v v8, (a0)3400; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3401; CHECK-NEXT: vadd.vx v8, v8, a1, v0.t3402; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3403; CHECK-NEXT: vse32.v v8, (a0)3404; CHECK-NEXT: addi a0, a0, 163405; CHECK-NEXT: bne a0, a3, .LBB62_13406; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3407; CHECK-NEXT: ret3408entry:3409 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03410 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3411 br label %vector.body3412 3413vector.body: ; preds = %vector.body, %entry3414 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3415 %0 = getelementptr inbounds i32, ptr %a, i64 %index3416 %wide.load = load <4 x i32>, ptr %0, align 43417 %1 = call <4 x i32> @llvm.vp.add.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)3418 store <4 x i32> %1, ptr %0, align 43419 %index.next = add nuw i64 %index, 43420 %2 = icmp eq i64 %index.next, 10243421 br i1 %2, label %for.cond.cleanup, label %vector.body3422 3423for.cond.cleanup: ; preds = %vector.body3424 ret void3425}3426 3427define void @sink_splat_vp_sub(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3428; CHECK-LABEL: sink_splat_vp_sub:3429; CHECK: # %bb.0: # %entry3430; CHECK-NEXT: lui a3, 13431; CHECK-NEXT: add a3, a0, a33432; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3433; CHECK-NEXT: .LBB63_1: # %vector.body3434; CHECK-NEXT: # =>This Inner Loop Header: Depth=13435; CHECK-NEXT: vle32.v v8, (a0)3436; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3437; CHECK-NEXT: vsub.vx v8, v8, a1, v0.t3438; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3439; CHECK-NEXT: vse32.v v8, (a0)3440; CHECK-NEXT: addi a0, a0, 163441; CHECK-NEXT: bne a0, a3, .LBB63_13442; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3443; CHECK-NEXT: ret3444entry:3445 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03446 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3447 br label %vector.body3448 3449vector.body: ; preds = %vector.body, %entry3450 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3451 %0 = getelementptr inbounds i32, ptr %a, i64 %index3452 %wide.load = load <4 x i32>, ptr %0, align 43453 %1 = call <4 x i32> @llvm.vp.sub.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3454 store <4 x i32> %1, ptr %0, align 43455 %index.next = add nuw i64 %index, 43456 %2 = icmp eq i64 %index.next, 10243457 br i1 %2, label %for.cond.cleanup, label %vector.body3458 3459for.cond.cleanup: ; preds = %vector.body3460 ret void3461}3462 3463define void @sink_splat_vp_rsub(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3464; CHECK-LABEL: sink_splat_vp_rsub:3465; CHECK: # %bb.0: # %entry3466; CHECK-NEXT: lui a3, 13467; CHECK-NEXT: add a3, a0, a33468; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3469; CHECK-NEXT: .LBB64_1: # %vector.body3470; CHECK-NEXT: # =>This Inner Loop Header: Depth=13471; CHECK-NEXT: vle32.v v8, (a0)3472; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3473; CHECK-NEXT: vrsub.vx v8, v8, a1, v0.t3474; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3475; CHECK-NEXT: vse32.v v8, (a0)3476; CHECK-NEXT: addi a0, a0, 163477; CHECK-NEXT: bne a0, a3, .LBB64_13478; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3479; CHECK-NEXT: ret3480entry:3481 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03482 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3483 br label %vector.body3484 3485vector.body: ; preds = %vector.body, %entry3486 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3487 %0 = getelementptr inbounds i32, ptr %a, i64 %index3488 %wide.load = load <4 x i32>, ptr %0, align 43489 %1 = call <4 x i32> @llvm.vp.sub.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)3490 store <4 x i32> %1, ptr %0, align 43491 %index.next = add nuw i64 %index, 43492 %2 = icmp eq i64 %index.next, 10243493 br i1 %2, label %for.cond.cleanup, label %vector.body3494 3495for.cond.cleanup: ; preds = %vector.body3496 ret void3497}3498 3499define void @sink_splat_vp_shl(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3500; CHECK-LABEL: sink_splat_vp_shl:3501; CHECK: # %bb.0: # %entry3502; CHECK-NEXT: lui a3, 13503; CHECK-NEXT: add a3, a0, a33504; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3505; CHECK-NEXT: .LBB65_1: # %vector.body3506; CHECK-NEXT: # =>This Inner Loop Header: Depth=13507; CHECK-NEXT: vle32.v v8, (a0)3508; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3509; CHECK-NEXT: vsll.vx v8, v8, a1, v0.t3510; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3511; CHECK-NEXT: vse32.v v8, (a0)3512; CHECK-NEXT: addi a0, a0, 163513; CHECK-NEXT: bne a0, a3, .LBB65_13514; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3515; CHECK-NEXT: ret3516entry:3517 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03518 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3519 br label %vector.body3520 3521vector.body: ; preds = %vector.body, %entry3522 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3523 %0 = getelementptr inbounds i32, ptr %a, i64 %index3524 %wide.load = load <4 x i32>, ptr %0, align 43525 %1 = call <4 x i32> @llvm.vp.shl.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3526 store <4 x i32> %1, ptr %0, align 43527 %index.next = add nuw i64 %index, 43528 %2 = icmp eq i64 %index.next, 10243529 br i1 %2, label %for.cond.cleanup, label %vector.body3530 3531for.cond.cleanup: ; preds = %vector.body3532 ret void3533}3534 3535define void @sink_splat_vp_lshr(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3536; CHECK-LABEL: sink_splat_vp_lshr:3537; CHECK: # %bb.0: # %entry3538; CHECK-NEXT: lui a3, 13539; CHECK-NEXT: add a3, a0, a33540; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3541; CHECK-NEXT: .LBB66_1: # %vector.body3542; CHECK-NEXT: # =>This Inner Loop Header: Depth=13543; CHECK-NEXT: vle32.v v8, (a0)3544; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3545; CHECK-NEXT: vsrl.vx v8, v8, a1, v0.t3546; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3547; CHECK-NEXT: vse32.v v8, (a0)3548; CHECK-NEXT: addi a0, a0, 163549; CHECK-NEXT: bne a0, a3, .LBB66_13550; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3551; CHECK-NEXT: ret3552entry:3553 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03554 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3555 br label %vector.body3556 3557vector.body: ; preds = %vector.body, %entry3558 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3559 %0 = getelementptr inbounds i32, ptr %a, i64 %index3560 %wide.load = load <4 x i32>, ptr %0, align 43561 %1 = call <4 x i32> @llvm.vp.lshr.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3562 store <4 x i32> %1, ptr %0, align 43563 %index.next = add nuw i64 %index, 43564 %2 = icmp eq i64 %index.next, 10243565 br i1 %2, label %for.cond.cleanup, label %vector.body3566 3567for.cond.cleanup: ; preds = %vector.body3568 ret void3569}3570 3571define void @sink_splat_vp_ashr(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3572; CHECK-LABEL: sink_splat_vp_ashr:3573; CHECK: # %bb.0: # %entry3574; CHECK-NEXT: lui a3, 13575; CHECK-NEXT: add a3, a0, a33576; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3577; CHECK-NEXT: .LBB67_1: # %vector.body3578; CHECK-NEXT: # =>This Inner Loop Header: Depth=13579; CHECK-NEXT: vle32.v v8, (a0)3580; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3581; CHECK-NEXT: vsra.vx v8, v8, a1, v0.t3582; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3583; CHECK-NEXT: vse32.v v8, (a0)3584; CHECK-NEXT: addi a0, a0, 163585; CHECK-NEXT: bne a0, a3, .LBB67_13586; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3587; CHECK-NEXT: ret3588entry:3589 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03590 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3591 br label %vector.body3592 3593vector.body: ; preds = %vector.body, %entry3594 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3595 %0 = getelementptr inbounds i32, ptr %a, i64 %index3596 %wide.load = load <4 x i32>, ptr %0, align 43597 %1 = call <4 x i32> @llvm.vp.ashr.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3598 store <4 x i32> %1, ptr %0, align 43599 %index.next = add nuw i64 %index, 43600 %2 = icmp eq i64 %index.next, 10243601 br i1 %2, label %for.cond.cleanup, label %vector.body3602 3603for.cond.cleanup: ; preds = %vector.body3604 ret void3605}3606 3607define void @sink_splat_vp_fmul(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {3608; CHECK-LABEL: sink_splat_vp_fmul:3609; CHECK: # %bb.0: # %entry3610; CHECK-NEXT: lui a2, 13611; CHECK-NEXT: add a2, a0, a23612; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3613; CHECK-NEXT: .LBB68_1: # %vector.body3614; CHECK-NEXT: # =>This Inner Loop Header: Depth=13615; CHECK-NEXT: vle32.v v8, (a0)3616; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma3617; CHECK-NEXT: vfmul.vf v8, v8, fa0, v0.t3618; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3619; CHECK-NEXT: vse32.v v8, (a0)3620; CHECK-NEXT: addi a0, a0, 163621; CHECK-NEXT: bne a0, a2, .LBB68_13622; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3623; CHECK-NEXT: ret3624entry:3625 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 03626 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer3627 br label %vector.body3628 3629vector.body: ; preds = %vector.body, %entry3630 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3631 %0 = getelementptr inbounds float, ptr %a, i64 %index3632 %wide.load = load <4 x float>, ptr %0, align 43633 %1 = call <4 x float> @llvm.vp.fmul.v4i32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x i1> %m, i32 %vl)3634 store <4 x float> %1, ptr %0, align 43635 %index.next = add nuw i64 %index, 43636 %2 = icmp eq i64 %index.next, 10243637 br i1 %2, label %for.cond.cleanup, label %vector.body3638 3639for.cond.cleanup: ; preds = %vector.body3640 ret void3641}3642 3643define void @sink_splat_vp_fdiv(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {3644; CHECK-LABEL: sink_splat_vp_fdiv:3645; CHECK: # %bb.0: # %entry3646; CHECK-NEXT: lui a2, 13647; CHECK-NEXT: add a2, a0, a23648; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3649; CHECK-NEXT: .LBB69_1: # %vector.body3650; CHECK-NEXT: # =>This Inner Loop Header: Depth=13651; CHECK-NEXT: vle32.v v8, (a0)3652; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma3653; CHECK-NEXT: vfdiv.vf v8, v8, fa0, v0.t3654; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3655; CHECK-NEXT: vse32.v v8, (a0)3656; CHECK-NEXT: addi a0, a0, 163657; CHECK-NEXT: bne a0, a2, .LBB69_13658; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3659; CHECK-NEXT: ret3660entry:3661 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 03662 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer3663 br label %vector.body3664 3665vector.body: ; preds = %vector.body, %entry3666 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3667 %0 = getelementptr inbounds float, ptr %a, i64 %index3668 %wide.load = load <4 x float>, ptr %0, align 43669 %1 = call <4 x float> @llvm.vp.fdiv.v4i32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x i1> %m, i32 %vl)3670 store <4 x float> %1, ptr %0, align 43671 %index.next = add nuw i64 %index, 43672 %2 = icmp eq i64 %index.next, 10243673 br i1 %2, label %for.cond.cleanup, label %vector.body3674 3675for.cond.cleanup: ; preds = %vector.body3676 ret void3677}3678 3679define void @sink_splat_vp_frdiv(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {3680; CHECK-LABEL: sink_splat_vp_frdiv:3681; CHECK: # %bb.0: # %entry3682; CHECK-NEXT: lui a2, 13683; CHECK-NEXT: add a2, a0, a23684; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3685; CHECK-NEXT: .LBB70_1: # %vector.body3686; CHECK-NEXT: # =>This Inner Loop Header: Depth=13687; CHECK-NEXT: vle32.v v8, (a0)3688; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma3689; CHECK-NEXT: vfrdiv.vf v8, v8, fa0, v0.t3690; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3691; CHECK-NEXT: vse32.v v8, (a0)3692; CHECK-NEXT: addi a0, a0, 163693; CHECK-NEXT: bne a0, a2, .LBB70_13694; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3695; CHECK-NEXT: ret3696entry:3697 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 03698 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer3699 br label %vector.body3700 3701vector.body: ; preds = %vector.body, %entry3702 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3703 %0 = getelementptr inbounds float, ptr %a, i64 %index3704 %wide.load = load <4 x float>, ptr %0, align 43705 %1 = call <4 x float> @llvm.vp.fdiv.v4i32(<4 x float> %broadcast.splat, <4 x float> %wide.load, <4 x i1> %m, i32 %vl)3706 store <4 x float> %1, ptr %0, align 43707 %index.next = add nuw i64 %index, 43708 %2 = icmp eq i64 %index.next, 10243709 br i1 %2, label %for.cond.cleanup, label %vector.body3710 3711for.cond.cleanup: ; preds = %vector.body3712 ret void3713}3714 3715define void @sink_splat_vp_fadd(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {3716; CHECK-LABEL: sink_splat_vp_fadd:3717; CHECK: # %bb.0: # %entry3718; CHECK-NEXT: lui a2, 13719; CHECK-NEXT: add a2, a0, a23720; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3721; CHECK-NEXT: .LBB71_1: # %vector.body3722; CHECK-NEXT: # =>This Inner Loop Header: Depth=13723; CHECK-NEXT: vle32.v v8, (a0)3724; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma3725; CHECK-NEXT: vfadd.vf v8, v8, fa0, v0.t3726; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3727; CHECK-NEXT: vse32.v v8, (a0)3728; CHECK-NEXT: addi a0, a0, 163729; CHECK-NEXT: bne a0, a2, .LBB71_13730; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3731; CHECK-NEXT: ret3732entry:3733 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 03734 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer3735 br label %vector.body3736 3737vector.body: ; preds = %vector.body, %entry3738 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3739 %0 = getelementptr inbounds float, ptr %a, i64 %index3740 %wide.load = load <4 x float>, ptr %0, align 43741 %1 = call <4 x float> @llvm.vp.fadd.v4i32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x i1> %m, i32 %vl)3742 store <4 x float> %1, ptr %0, align 43743 %index.next = add nuw i64 %index, 43744 %2 = icmp eq i64 %index.next, 10243745 br i1 %2, label %for.cond.cleanup, label %vector.body3746 3747for.cond.cleanup: ; preds = %vector.body3748 ret void3749}3750 3751define void @sink_splat_vp_fsub(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {3752; CHECK-LABEL: sink_splat_vp_fsub:3753; CHECK: # %bb.0: # %entry3754; CHECK-NEXT: lui a2, 13755; CHECK-NEXT: add a2, a0, a23756; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3757; CHECK-NEXT: .LBB72_1: # %vector.body3758; CHECK-NEXT: # =>This Inner Loop Header: Depth=13759; CHECK-NEXT: vle32.v v8, (a0)3760; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma3761; CHECK-NEXT: vfsub.vf v8, v8, fa0, v0.t3762; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3763; CHECK-NEXT: vse32.v v8, (a0)3764; CHECK-NEXT: addi a0, a0, 163765; CHECK-NEXT: bne a0, a2, .LBB72_13766; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3767; CHECK-NEXT: ret3768entry:3769 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 03770 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer3771 br label %vector.body3772 3773vector.body: ; preds = %vector.body, %entry3774 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3775 %0 = getelementptr inbounds float, ptr %a, i64 %index3776 %wide.load = load <4 x float>, ptr %0, align 43777 %1 = call <4 x float> @llvm.vp.fsub.v4i32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x i1> %m, i32 %vl)3778 store <4 x float> %1, ptr %0, align 43779 %index.next = add nuw i64 %index, 43780 %2 = icmp eq i64 %index.next, 10243781 br i1 %2, label %for.cond.cleanup, label %vector.body3782 3783for.cond.cleanup: ; preds = %vector.body3784 ret void3785}3786 3787define void @sink_splat_vp_frsub(ptr nocapture %a, float %x, <4 x i1> %m, i32 zeroext %vl) {3788; CHECK-LABEL: sink_splat_vp_frsub:3789; CHECK: # %bb.0: # %entry3790; CHECK-NEXT: lui a2, 13791; CHECK-NEXT: add a2, a0, a23792; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3793; CHECK-NEXT: .LBB73_1: # %vector.body3794; CHECK-NEXT: # =>This Inner Loop Header: Depth=13795; CHECK-NEXT: vle32.v v8, (a0)3796; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma3797; CHECK-NEXT: vfrsub.vf v8, v8, fa0, v0.t3798; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3799; CHECK-NEXT: vse32.v v8, (a0)3800; CHECK-NEXT: addi a0, a0, 163801; CHECK-NEXT: bne a0, a2, .LBB73_13802; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3803; CHECK-NEXT: ret3804entry:3805 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 03806 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer3807 br label %vector.body3808 3809vector.body: ; preds = %vector.body, %entry3810 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3811 %0 = getelementptr inbounds float, ptr %a, i64 %index3812 %wide.load = load <4 x float>, ptr %0, align 43813 %1 = call <4 x float> @llvm.vp.fsub.v4i32(<4 x float> %broadcast.splat, <4 x float> %wide.load, <4 x i1> %m, i32 %vl)3814 store <4 x float> %1, ptr %0, align 43815 %index.next = add nuw i64 %index, 43816 %2 = icmp eq i64 %index.next, 10243817 br i1 %2, label %for.cond.cleanup, label %vector.body3818 3819for.cond.cleanup: ; preds = %vector.body3820 ret void3821}3822 3823define void @sink_splat_vp_udiv(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3824; CHECK-LABEL: sink_splat_vp_udiv:3825; CHECK: # %bb.0: # %entry3826; CHECK-NEXT: lui a3, 13827; CHECK-NEXT: add a3, a0, a33828; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3829; CHECK-NEXT: .LBB74_1: # %vector.body3830; CHECK-NEXT: # =>This Inner Loop Header: Depth=13831; CHECK-NEXT: vle32.v v8, (a0)3832; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3833; CHECK-NEXT: vdivu.vx v8, v8, a1, v0.t3834; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3835; CHECK-NEXT: vse32.v v8, (a0)3836; CHECK-NEXT: addi a0, a0, 163837; CHECK-NEXT: bne a0, a3, .LBB74_13838; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3839; CHECK-NEXT: ret3840entry:3841 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03842 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3843 br label %vector.body3844 3845vector.body: ; preds = %vector.body, %entry3846 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3847 %0 = getelementptr inbounds i32, ptr %a, i64 %index3848 %wide.load = load <4 x i32>, ptr %0, align 43849 %1 = call <4 x i32> @llvm.vp.udiv.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3850 store <4 x i32> %1, ptr %0, align 43851 %index.next = add nuw i64 %index, 43852 %2 = icmp eq i64 %index.next, 10243853 br i1 %2, label %for.cond.cleanup, label %vector.body3854 3855for.cond.cleanup: ; preds = %vector.body3856 ret void3857}3858 3859define void @sink_splat_vp_sdiv(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3860; CHECK-LABEL: sink_splat_vp_sdiv:3861; CHECK: # %bb.0: # %entry3862; CHECK-NEXT: lui a3, 13863; CHECK-NEXT: add a3, a0, a33864; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3865; CHECK-NEXT: .LBB75_1: # %vector.body3866; CHECK-NEXT: # =>This Inner Loop Header: Depth=13867; CHECK-NEXT: vle32.v v8, (a0)3868; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3869; CHECK-NEXT: vdiv.vx v8, v8, a1, v0.t3870; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3871; CHECK-NEXT: vse32.v v8, (a0)3872; CHECK-NEXT: addi a0, a0, 163873; CHECK-NEXT: bne a0, a3, .LBB75_13874; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3875; CHECK-NEXT: ret3876entry:3877 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03878 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3879 br label %vector.body3880 3881vector.body: ; preds = %vector.body, %entry3882 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3883 %0 = getelementptr inbounds i32, ptr %a, i64 %index3884 %wide.load = load <4 x i32>, ptr %0, align 43885 %1 = call <4 x i32> @llvm.vp.sdiv.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3886 store <4 x i32> %1, ptr %0, align 43887 %index.next = add nuw i64 %index, 43888 %2 = icmp eq i64 %index.next, 10243889 br i1 %2, label %for.cond.cleanup, label %vector.body3890 3891for.cond.cleanup: ; preds = %vector.body3892 ret void3893}3894 3895define void @sink_splat_vp_urem(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3896; CHECK-LABEL: sink_splat_vp_urem:3897; CHECK: # %bb.0: # %entry3898; CHECK-NEXT: lui a3, 13899; CHECK-NEXT: add a3, a0, a33900; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3901; CHECK-NEXT: .LBB76_1: # %vector.body3902; CHECK-NEXT: # =>This Inner Loop Header: Depth=13903; CHECK-NEXT: vle32.v v8, (a0)3904; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3905; CHECK-NEXT: vremu.vx v8, v8, a1, v0.t3906; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3907; CHECK-NEXT: vse32.v v8, (a0)3908; CHECK-NEXT: addi a0, a0, 163909; CHECK-NEXT: bne a0, a3, .LBB76_13910; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3911; CHECK-NEXT: ret3912entry:3913 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03914 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3915 br label %vector.body3916 3917vector.body: ; preds = %vector.body, %entry3918 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3919 %0 = getelementptr inbounds i32, ptr %a, i64 %index3920 %wide.load = load <4 x i32>, ptr %0, align 43921 %1 = call <4 x i32> @llvm.vp.urem.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3922 store <4 x i32> %1, ptr %0, align 43923 %index.next = add nuw i64 %index, 43924 %2 = icmp eq i64 %index.next, 10243925 br i1 %2, label %for.cond.cleanup, label %vector.body3926 3927for.cond.cleanup: ; preds = %vector.body3928 ret void3929}3930 3931define void @sink_splat_vp_srem(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3932; CHECK-LABEL: sink_splat_vp_srem:3933; CHECK: # %bb.0: # %entry3934; CHECK-NEXT: lui a3, 13935; CHECK-NEXT: add a3, a0, a33936; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3937; CHECK-NEXT: .LBB77_1: # %vector.body3938; CHECK-NEXT: # =>This Inner Loop Header: Depth=13939; CHECK-NEXT: vle32.v v8, (a0)3940; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3941; CHECK-NEXT: vrem.vx v8, v8, a1, v0.t3942; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3943; CHECK-NEXT: vse32.v v8, (a0)3944; CHECK-NEXT: addi a0, a0, 163945; CHECK-NEXT: bne a0, a3, .LBB77_13946; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3947; CHECK-NEXT: ret3948entry:3949 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03950 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3951 br label %vector.body3952 3953vector.body: ; preds = %vector.body, %entry3954 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3955 %0 = getelementptr inbounds i32, ptr %a, i64 %index3956 %wide.load = load <4 x i32>, ptr %0, align 43957 %1 = call <4 x i32> @llvm.vp.srem.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)3958 store <4 x i32> %1, ptr %0, align 43959 %index.next = add nuw i64 %index, 43960 %2 = icmp eq i64 %index.next, 10243961 br i1 %2, label %for.cond.cleanup, label %vector.body3962 3963for.cond.cleanup: ; preds = %vector.body3964 ret void3965}3966 3967; Check that we don't sink a splat operand that has no chance of being folded.3968 3969define void @sink_splat_vp_srem_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {3970; CHECK-LABEL: sink_splat_vp_srem_commute:3971; CHECK: # %bb.0: # %entry3972; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3973; CHECK-NEXT: vmv.v.x v8, a13974; CHECK-NEXT: lui a1, 13975; CHECK-NEXT: add a1, a0, a13976; CHECK-NEXT: .LBB78_1: # %vector.body3977; CHECK-NEXT: # =>This Inner Loop Header: Depth=13978; CHECK-NEXT: vle32.v v9, (a0)3979; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma3980; CHECK-NEXT: vrem.vv v9, v8, v9, v0.t3981; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma3982; CHECK-NEXT: vse32.v v9, (a0)3983; CHECK-NEXT: addi a0, a0, 163984; CHECK-NEXT: bne a0, a1, .LBB78_13985; CHECK-NEXT: # %bb.2: # %for.cond.cleanup3986; CHECK-NEXT: ret3987entry:3988 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 03989 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer3990 br label %vector.body3991 3992vector.body: ; preds = %vector.body, %entry3993 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]3994 %0 = getelementptr inbounds i32, ptr %a, i64 %index3995 %wide.load = load <4 x i32>, ptr %0, align 43996 %1 = call <4 x i32> @llvm.vp.srem.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)3997 store <4 x i32> %1, ptr %0, align 43998 %index.next = add nuw i64 %index, 43999 %2 = icmp eq i64 %index.next, 10244000 br i1 %2, label %for.cond.cleanup, label %vector.body4001 4002for.cond.cleanup: ; preds = %vector.body4003 ret void4004}4005 4006define void @sink_splat_vp_fma(ptr noalias nocapture %a, ptr nocapture readonly %b, float %x, <4 x i1> %m, i32 zeroext %vl) {4007; CHECK-LABEL: sink_splat_vp_fma:4008; CHECK: # %bb.0: # %entry4009; CHECK-NEXT: lui a3, 14010; CHECK-NEXT: add a3, a1, a34011; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4012; CHECK-NEXT: .LBB79_1: # %vector.body4013; CHECK-NEXT: # =>This Inner Loop Header: Depth=14014; CHECK-NEXT: vle32.v v8, (a0)4015; CHECK-NEXT: vle32.v v9, (a1)4016; CHECK-NEXT: addi a1, a1, 164017; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma4018; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t4019; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4020; CHECK-NEXT: vse32.v v8, (a0)4021; CHECK-NEXT: addi a0, a0, 164022; CHECK-NEXT: bne a1, a3, .LBB79_14023; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4024; CHECK-NEXT: ret4025entry:4026 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 04027 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer4028 br label %vector.body4029 4030vector.body: ; preds = %vector.body, %entry4031 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4032 %0 = getelementptr inbounds float, ptr %a, i64 %index4033 %wide.load = load <4 x float>, ptr %0, align 44034 %1 = getelementptr inbounds float, ptr %b, i64 %index4035 %wide.load12 = load <4 x float>, ptr %1, align 44036 %2 = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x float> %wide.load12, <4 x i1> %m, i32 %vl)4037 store <4 x float> %2, ptr %0, align 44038 %index.next = add nuw i64 %index, 44039 %3 = icmp eq i64 %index.next, 10244040 br i1 %3, label %for.cond.cleanup, label %vector.body4041 4042for.cond.cleanup: ; preds = %vector.body4043 ret void4044}4045 4046define void @sink_splat_vp_fma_commute(ptr noalias nocapture %a, ptr nocapture readonly %b, float %x, <4 x i1> %m, i32 zeroext %vl) {4047; CHECK-LABEL: sink_splat_vp_fma_commute:4048; CHECK: # %bb.0: # %entry4049; CHECK-NEXT: lui a3, 14050; CHECK-NEXT: add a3, a1, a34051; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4052; CHECK-NEXT: .LBB80_1: # %vector.body4053; CHECK-NEXT: # =>This Inner Loop Header: Depth=14054; CHECK-NEXT: vle32.v v8, (a0)4055; CHECK-NEXT: vle32.v v9, (a1)4056; CHECK-NEXT: addi a1, a1, 164057; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma4058; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t4059; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4060; CHECK-NEXT: vse32.v v8, (a0)4061; CHECK-NEXT: addi a0, a0, 164062; CHECK-NEXT: bne a1, a3, .LBB80_14063; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4064; CHECK-NEXT: ret4065entry:4066 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 04067 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer4068 br label %vector.body4069 4070vector.body: ; preds = %vector.body, %entry4071 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4072 %0 = getelementptr inbounds float, ptr %a, i64 %index4073 %wide.load = load <4 x float>, ptr %0, align 44074 %1 = getelementptr inbounds float, ptr %b, i64 %index4075 %wide.load12 = load <4 x float>, ptr %1, align 44076 %2 = call <4 x float> @llvm.vp.fma.v4f32(<4 x float> %broadcast.splat, <4 x float> %wide.load, <4 x float> %wide.load12, <4 x i1> %m, i32 %vl)4077 store <4 x float> %2, ptr %0, align 44078 %index.next = add nuw i64 %index, 44079 %3 = icmp eq i64 %index.next, 10244080 br i1 %3, label %for.cond.cleanup, label %vector.body4081 4082for.cond.cleanup: ; preds = %vector.body4083 ret void4084}4085 4086define void @sink_splat_mul_lmul2(ptr nocapture %a, i64 signext %x) {4087; CHECK-LABEL: sink_splat_mul_lmul2:4088; CHECK: # %bb.0: # %entry4089; CHECK-NEXT: lui a2, 24090; CHECK-NEXT: add a2, a0, a24091; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4092; CHECK-NEXT: .LBB81_1: # %vector.body4093; CHECK-NEXT: # =>This Inner Loop Header: Depth=14094; CHECK-NEXT: vle64.v v8, (a0)4095; CHECK-NEXT: vmul.vx v8, v8, a14096; CHECK-NEXT: vse64.v v8, (a0)4097; CHECK-NEXT: addi a0, a0, 324098; CHECK-NEXT: bne a0, a2, .LBB81_14099; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4100; CHECK-NEXT: ret4101entry:4102 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04103 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4104 br label %vector.body4105 4106vector.body: ; preds = %vector.body, %entry4107 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4108 %0 = getelementptr inbounds i64, ptr %a, i64 %index4109 %wide.load = load <4 x i64>, ptr %0, align 84110 %1 = mul <4 x i64> %wide.load, %broadcast.splat4111 store <4 x i64> %1, ptr %0, align 84112 %index.next = add nuw i64 %index, 44113 %2 = icmp eq i64 %index.next, 10244114 br i1 %2, label %for.cond.cleanup, label %vector.body4115 4116for.cond.cleanup: ; preds = %vector.body4117 ret void4118}4119 4120define void @sink_splat_add_lmul2(ptr nocapture %a, i64 signext %x) {4121; CHECK-LABEL: sink_splat_add_lmul2:4122; CHECK: # %bb.0: # %entry4123; CHECK-NEXT: lui a2, 24124; CHECK-NEXT: add a2, a0, a24125; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4126; CHECK-NEXT: .LBB82_1: # %vector.body4127; CHECK-NEXT: # =>This Inner Loop Header: Depth=14128; CHECK-NEXT: vle64.v v8, (a0)4129; CHECK-NEXT: vadd.vx v8, v8, a14130; CHECK-NEXT: vse64.v v8, (a0)4131; CHECK-NEXT: addi a0, a0, 324132; CHECK-NEXT: bne a0, a2, .LBB82_14133; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4134; CHECK-NEXT: ret4135entry:4136 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04137 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4138 br label %vector.body4139 4140vector.body: ; preds = %vector.body, %entry4141 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4142 %0 = getelementptr inbounds i64, ptr %a, i64 %index4143 %wide.load = load <4 x i64>, ptr %0, align 84144 %1 = add <4 x i64> %wide.load, %broadcast.splat4145 store <4 x i64> %1, ptr %0, align 84146 %index.next = add nuw i64 %index, 44147 %2 = icmp eq i64 %index.next, 10244148 br i1 %2, label %for.cond.cleanup, label %vector.body4149 4150for.cond.cleanup: ; preds = %vector.body4151 ret void4152}4153 4154define void @sink_splat_sub_lmul2(ptr nocapture %a, i64 signext %x) {4155; CHECK-LABEL: sink_splat_sub_lmul2:4156; CHECK: # %bb.0: # %entry4157; CHECK-NEXT: lui a2, 24158; CHECK-NEXT: add a2, a0, a24159; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4160; CHECK-NEXT: .LBB83_1: # %vector.body4161; CHECK-NEXT: # =>This Inner Loop Header: Depth=14162; CHECK-NEXT: vle64.v v8, (a0)4163; CHECK-NEXT: vsub.vx v8, v8, a14164; CHECK-NEXT: vse64.v v8, (a0)4165; CHECK-NEXT: addi a0, a0, 324166; CHECK-NEXT: bne a0, a2, .LBB83_14167; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4168; CHECK-NEXT: ret4169entry:4170 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04171 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4172 br label %vector.body4173 4174vector.body: ; preds = %vector.body, %entry4175 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4176 %0 = getelementptr inbounds i64, ptr %a, i64 %index4177 %wide.load = load <4 x i64>, ptr %0, align 84178 %1 = sub <4 x i64> %wide.load, %broadcast.splat4179 store <4 x i64> %1, ptr %0, align 84180 %index.next = add nuw i64 %index, 44181 %2 = icmp eq i64 %index.next, 10244182 br i1 %2, label %for.cond.cleanup, label %vector.body4183 4184for.cond.cleanup: ; preds = %vector.body4185 ret void4186}4187 4188define void @sink_splat_rsub_lmul2(ptr nocapture %a, i64 signext %x) {4189; CHECK-LABEL: sink_splat_rsub_lmul2:4190; CHECK: # %bb.0: # %entry4191; CHECK-NEXT: lui a2, 24192; CHECK-NEXT: add a2, a0, a24193; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4194; CHECK-NEXT: .LBB84_1: # %vector.body4195; CHECK-NEXT: # =>This Inner Loop Header: Depth=14196; CHECK-NEXT: vle64.v v8, (a0)4197; CHECK-NEXT: vrsub.vx v8, v8, a14198; CHECK-NEXT: vse64.v v8, (a0)4199; CHECK-NEXT: addi a0, a0, 324200; CHECK-NEXT: bne a0, a2, .LBB84_14201; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4202; CHECK-NEXT: ret4203entry:4204 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04205 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4206 br label %vector.body4207 4208vector.body: ; preds = %vector.body, %entry4209 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4210 %0 = getelementptr inbounds i64, ptr %a, i64 %index4211 %wide.load = load <4 x i64>, ptr %0, align 84212 %1 = sub <4 x i64> %broadcast.splat, %wide.load4213 store <4 x i64> %1, ptr %0, align 84214 %index.next = add nuw i64 %index, 44215 %2 = icmp eq i64 %index.next, 10244216 br i1 %2, label %for.cond.cleanup, label %vector.body4217 4218for.cond.cleanup: ; preds = %vector.body4219 ret void4220}4221 4222define void @sink_splat_and_lmul2(ptr nocapture %a, i64 signext %x) {4223; CHECK-LABEL: sink_splat_and_lmul2:4224; CHECK: # %bb.0: # %entry4225; CHECK-NEXT: lui a2, 24226; CHECK-NEXT: add a2, a0, a24227; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4228; CHECK-NEXT: .LBB85_1: # %vector.body4229; CHECK-NEXT: # =>This Inner Loop Header: Depth=14230; CHECK-NEXT: vle64.v v8, (a0)4231; CHECK-NEXT: vand.vx v8, v8, a14232; CHECK-NEXT: vse64.v v8, (a0)4233; CHECK-NEXT: addi a0, a0, 324234; CHECK-NEXT: bne a0, a2, .LBB85_14235; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4236; CHECK-NEXT: ret4237entry:4238 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04239 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4240 br label %vector.body4241 4242vector.body: ; preds = %vector.body, %entry4243 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4244 %0 = getelementptr inbounds i64, ptr %a, i64 %index4245 %wide.load = load <4 x i64>, ptr %0, align 84246 %1 = and <4 x i64> %wide.load, %broadcast.splat4247 store <4 x i64> %1, ptr %0, align 84248 %index.next = add nuw i64 %index, 44249 %2 = icmp eq i64 %index.next, 10244250 br i1 %2, label %for.cond.cleanup, label %vector.body4251 4252for.cond.cleanup: ; preds = %vector.body4253 ret void4254}4255 4256define void @sink_splat_or_lmul2(ptr nocapture %a, i64 signext %x) {4257; CHECK-LABEL: sink_splat_or_lmul2:4258; CHECK: # %bb.0: # %entry4259; CHECK-NEXT: lui a2, 24260; CHECK-NEXT: add a2, a0, a24261; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4262; CHECK-NEXT: .LBB86_1: # %vector.body4263; CHECK-NEXT: # =>This Inner Loop Header: Depth=14264; CHECK-NEXT: vle64.v v8, (a0)4265; CHECK-NEXT: vor.vx v8, v8, a14266; CHECK-NEXT: vse64.v v8, (a0)4267; CHECK-NEXT: addi a0, a0, 324268; CHECK-NEXT: bne a0, a2, .LBB86_14269; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4270; CHECK-NEXT: ret4271entry:4272 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04273 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4274 br label %vector.body4275 4276vector.body: ; preds = %vector.body, %entry4277 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4278 %0 = getelementptr inbounds i64, ptr %a, i64 %index4279 %wide.load = load <4 x i64>, ptr %0, align 84280 %1 = or <4 x i64> %wide.load, %broadcast.splat4281 store <4 x i64> %1, ptr %0, align 84282 %index.next = add nuw i64 %index, 44283 %2 = icmp eq i64 %index.next, 10244284 br i1 %2, label %for.cond.cleanup, label %vector.body4285 4286for.cond.cleanup: ; preds = %vector.body4287 ret void4288}4289 4290define void @sink_splat_xor_lmul2(ptr nocapture %a, i64 signext %x) {4291; CHECK-LABEL: sink_splat_xor_lmul2:4292; CHECK: # %bb.0: # %entry4293; CHECK-NEXT: lui a2, 24294; CHECK-NEXT: add a2, a0, a24295; CHECK-NEXT: vsetivli zero, 4, e64, m2, ta, ma4296; CHECK-NEXT: .LBB87_1: # %vector.body4297; CHECK-NEXT: # =>This Inner Loop Header: Depth=14298; CHECK-NEXT: vle64.v v8, (a0)4299; CHECK-NEXT: vxor.vx v8, v8, a14300; CHECK-NEXT: vse64.v v8, (a0)4301; CHECK-NEXT: addi a0, a0, 324302; CHECK-NEXT: bne a0, a2, .LBB87_14303; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4304; CHECK-NEXT: ret4305entry:4306 %broadcast.splatinsert = insertelement <4 x i64> poison, i64 %x, i64 04307 %broadcast.splat = shufflevector <4 x i64> %broadcast.splatinsert, <4 x i64> poison, <4 x i32> zeroinitializer4308 br label %vector.body4309 4310vector.body: ; preds = %vector.body, %entry4311 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4312 %0 = getelementptr inbounds i64, ptr %a, i64 %index4313 %wide.load = load <4 x i64>, ptr %0, align 84314 %1 = xor <4 x i64> %wide.load, %broadcast.splat4315 store <4 x i64> %1, ptr %0, align 84316 %index.next = add nuw i64 %index, 44317 %2 = icmp eq i64 %index.next, 10244318 br i1 %2, label %for.cond.cleanup, label %vector.body4319 4320for.cond.cleanup: ; preds = %vector.body4321 ret void4322}4323 4324define void @sink_splat_mul_lmul8(ptr nocapture %a, i32 signext %x) {4325; CHECK-LABEL: sink_splat_mul_lmul8:4326; CHECK: # %bb.0: # %entry4327; CHECK-NEXT: lui a2, 14328; CHECK-NEXT: add a2, a0, a24329; CHECK-NEXT: li a3, 324330; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4331; CHECK-NEXT: .LBB88_1: # %vector.body4332; CHECK-NEXT: # =>This Inner Loop Header: Depth=14333; CHECK-NEXT: vle32.v v8, (a0)4334; CHECK-NEXT: vmul.vx v8, v8, a14335; CHECK-NEXT: vse32.v v8, (a0)4336; CHECK-NEXT: addi a0, a0, 164337; CHECK-NEXT: bne a0, a2, .LBB88_14338; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4339; CHECK-NEXT: ret4340entry:4341 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04342 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4343 br label %vector.body4344 4345vector.body: ; preds = %vector.body, %entry4346 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4347 %0 = getelementptr inbounds i32, ptr %a, i64 %index4348 %wide.load = load <32 x i32>, ptr %0, align 44349 %1 = mul <32 x i32> %wide.load, %broadcast.splat4350 store <32 x i32> %1, ptr %0, align 44351 %index.next = add nuw i64 %index, 44352 %2 = icmp eq i64 %index.next, 10244353 br i1 %2, label %for.cond.cleanup, label %vector.body4354 4355for.cond.cleanup: ; preds = %vector.body4356 ret void4357}4358 4359define void @sink_splat_add_lmul8(ptr nocapture %a, i32 signext %x) {4360; CHECK-LABEL: sink_splat_add_lmul8:4361; CHECK: # %bb.0: # %entry4362; CHECK-NEXT: lui a2, 14363; CHECK-NEXT: add a2, a0, a24364; CHECK-NEXT: li a3, 324365; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4366; CHECK-NEXT: .LBB89_1: # %vector.body4367; CHECK-NEXT: # =>This Inner Loop Header: Depth=14368; CHECK-NEXT: vle32.v v8, (a0)4369; CHECK-NEXT: vadd.vx v8, v8, a14370; CHECK-NEXT: vse32.v v8, (a0)4371; CHECK-NEXT: addi a0, a0, 164372; CHECK-NEXT: bne a0, a2, .LBB89_14373; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4374; CHECK-NEXT: ret4375entry:4376 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04377 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4378 br label %vector.body4379 4380vector.body: ; preds = %vector.body, %entry4381 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4382 %0 = getelementptr inbounds i32, ptr %a, i64 %index4383 %wide.load = load <32 x i32>, ptr %0, align 44384 %1 = add <32 x i32> %wide.load, %broadcast.splat4385 store <32 x i32> %1, ptr %0, align 44386 %index.next = add nuw i64 %index, 44387 %2 = icmp eq i64 %index.next, 10244388 br i1 %2, label %for.cond.cleanup, label %vector.body4389 4390for.cond.cleanup: ; preds = %vector.body4391 ret void4392}4393 4394define void @sink_splat_sub_lmul8(ptr nocapture %a, i32 signext %x) {4395; CHECK-LABEL: sink_splat_sub_lmul8:4396; CHECK: # %bb.0: # %entry4397; CHECK-NEXT: lui a2, 14398; CHECK-NEXT: add a2, a0, a24399; CHECK-NEXT: li a3, 324400; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4401; CHECK-NEXT: .LBB90_1: # %vector.body4402; CHECK-NEXT: # =>This Inner Loop Header: Depth=14403; CHECK-NEXT: vle32.v v8, (a0)4404; CHECK-NEXT: vsub.vx v8, v8, a14405; CHECK-NEXT: vse32.v v8, (a0)4406; CHECK-NEXT: addi a0, a0, 164407; CHECK-NEXT: bne a0, a2, .LBB90_14408; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4409; CHECK-NEXT: ret4410entry:4411 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04412 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4413 br label %vector.body4414 4415vector.body: ; preds = %vector.body, %entry4416 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4417 %0 = getelementptr inbounds i32, ptr %a, i64 %index4418 %wide.load = load <32 x i32>, ptr %0, align 44419 %1 = sub <32 x i32> %wide.load, %broadcast.splat4420 store <32 x i32> %1, ptr %0, align 44421 %index.next = add nuw i64 %index, 44422 %2 = icmp eq i64 %index.next, 10244423 br i1 %2, label %for.cond.cleanup, label %vector.body4424 4425for.cond.cleanup: ; preds = %vector.body4426 ret void4427}4428 4429define void @sink_splat_rsub_lmul8(ptr nocapture %a, i32 signext %x) {4430; CHECK-LABEL: sink_splat_rsub_lmul8:4431; CHECK: # %bb.0: # %entry4432; CHECK-NEXT: lui a2, 14433; CHECK-NEXT: add a2, a0, a24434; CHECK-NEXT: li a3, 324435; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4436; CHECK-NEXT: .LBB91_1: # %vector.body4437; CHECK-NEXT: # =>This Inner Loop Header: Depth=14438; CHECK-NEXT: vle32.v v8, (a0)4439; CHECK-NEXT: vrsub.vx v8, v8, a14440; CHECK-NEXT: vse32.v v8, (a0)4441; CHECK-NEXT: addi a0, a0, 164442; CHECK-NEXT: bne a0, a2, .LBB91_14443; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4444; CHECK-NEXT: ret4445entry:4446 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04447 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4448 br label %vector.body4449 4450vector.body: ; preds = %vector.body, %entry4451 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4452 %0 = getelementptr inbounds i32, ptr %a, i64 %index4453 %wide.load = load <32 x i32>, ptr %0, align 44454 %1 = sub <32 x i32> %broadcast.splat, %wide.load4455 store <32 x i32> %1, ptr %0, align 44456 %index.next = add nuw i64 %index, 44457 %2 = icmp eq i64 %index.next, 10244458 br i1 %2, label %for.cond.cleanup, label %vector.body4459 4460for.cond.cleanup: ; preds = %vector.body4461 ret void4462}4463 4464define void @sink_splat_and_lmul8(ptr nocapture %a, i32 signext %x) {4465; CHECK-LABEL: sink_splat_and_lmul8:4466; CHECK: # %bb.0: # %entry4467; CHECK-NEXT: lui a2, 14468; CHECK-NEXT: add a2, a0, a24469; CHECK-NEXT: li a3, 324470; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4471; CHECK-NEXT: .LBB92_1: # %vector.body4472; CHECK-NEXT: # =>This Inner Loop Header: Depth=14473; CHECK-NEXT: vle32.v v8, (a0)4474; CHECK-NEXT: vand.vx v8, v8, a14475; CHECK-NEXT: vse32.v v8, (a0)4476; CHECK-NEXT: addi a0, a0, 164477; CHECK-NEXT: bne a0, a2, .LBB92_14478; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4479; CHECK-NEXT: ret4480entry:4481 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04482 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4483 br label %vector.body4484 4485vector.body: ; preds = %vector.body, %entry4486 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4487 %0 = getelementptr inbounds i32, ptr %a, i64 %index4488 %wide.load = load <32 x i32>, ptr %0, align 44489 %1 = and <32 x i32> %wide.load, %broadcast.splat4490 store <32 x i32> %1, ptr %0, align 44491 %index.next = add nuw i64 %index, 44492 %2 = icmp eq i64 %index.next, 10244493 br i1 %2, label %for.cond.cleanup, label %vector.body4494 4495for.cond.cleanup: ; preds = %vector.body4496 ret void4497}4498 4499define void @sink_splat_or_lmul8(ptr nocapture %a, i32 signext %x) {4500; CHECK-LABEL: sink_splat_or_lmul8:4501; CHECK: # %bb.0: # %entry4502; CHECK-NEXT: lui a2, 14503; CHECK-NEXT: add a2, a0, a24504; CHECK-NEXT: li a3, 324505; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4506; CHECK-NEXT: .LBB93_1: # %vector.body4507; CHECK-NEXT: # =>This Inner Loop Header: Depth=14508; CHECK-NEXT: vle32.v v8, (a0)4509; CHECK-NEXT: vor.vx v8, v8, a14510; CHECK-NEXT: vse32.v v8, (a0)4511; CHECK-NEXT: addi a0, a0, 164512; CHECK-NEXT: bne a0, a2, .LBB93_14513; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4514; CHECK-NEXT: ret4515entry:4516 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04517 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4518 br label %vector.body4519 4520vector.body: ; preds = %vector.body, %entry4521 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4522 %0 = getelementptr inbounds i32, ptr %a, i64 %index4523 %wide.load = load <32 x i32>, ptr %0, align 44524 %1 = or <32 x i32> %wide.load, %broadcast.splat4525 store <32 x i32> %1, ptr %0, align 44526 %index.next = add nuw i64 %index, 44527 %2 = icmp eq i64 %index.next, 10244528 br i1 %2, label %for.cond.cleanup, label %vector.body4529 4530for.cond.cleanup: ; preds = %vector.body4531 ret void4532}4533 4534define void @sink_splat_xor_lmul8(ptr nocapture %a, i32 signext %x) {4535; CHECK-LABEL: sink_splat_xor_lmul8:4536; CHECK: # %bb.0: # %entry4537; CHECK-NEXT: lui a2, 14538; CHECK-NEXT: add a2, a0, a24539; CHECK-NEXT: li a3, 324540; CHECK-NEXT: vsetvli zero, a3, e32, m8, ta, ma4541; CHECK-NEXT: .LBB94_1: # %vector.body4542; CHECK-NEXT: # =>This Inner Loop Header: Depth=14543; CHECK-NEXT: vle32.v v8, (a0)4544; CHECK-NEXT: vxor.vx v8, v8, a14545; CHECK-NEXT: vse32.v v8, (a0)4546; CHECK-NEXT: addi a0, a0, 164547; CHECK-NEXT: bne a0, a2, .LBB94_14548; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4549; CHECK-NEXT: ret4550entry:4551 %broadcast.splatinsert = insertelement <32 x i32> poison, i32 %x, i32 04552 %broadcast.splat = shufflevector <32 x i32> %broadcast.splatinsert, <32 x i32> poison, <32 x i32> zeroinitializer4553 br label %vector.body4554 4555vector.body: ; preds = %vector.body, %entry4556 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4557 %0 = getelementptr inbounds i32, ptr %a, i64 %index4558 %wide.load = load <32 x i32>, ptr %0, align 44559 %1 = xor <32 x i32> %wide.load, %broadcast.splat4560 store <32 x i32> %1, ptr %0, align 44561 %index.next = add nuw i64 %index, 44562 %2 = icmp eq i64 %index.next, 10244563 br i1 %2, label %for.cond.cleanup, label %vector.body4564 4565for.cond.cleanup: ; preds = %vector.body4566 ret void4567}4568 4569define void @sink_splat_mul_lmulmf2(ptr nocapture %a, i32 signext %x) {4570; CHECK-LABEL: sink_splat_mul_lmulmf2:4571; CHECK: # %bb.0: # %entry4572; CHECK-NEXT: lui a2, 24573; CHECK-NEXT: add a2, a0, a24574; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4575; CHECK-NEXT: .LBB95_1: # %vector.body4576; CHECK-NEXT: # =>This Inner Loop Header: Depth=14577; CHECK-NEXT: vle32.v v8, (a0)4578; CHECK-NEXT: vmul.vx v8, v8, a14579; CHECK-NEXT: vse32.v v8, (a0)4580; CHECK-NEXT: addi a0, a0, 324581; CHECK-NEXT: bne a0, a2, .LBB95_14582; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4583; CHECK-NEXT: ret4584entry:4585 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04586 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4587 br label %vector.body4588 4589vector.body: ; preds = %vector.body, %entry4590 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4591 %0 = getelementptr inbounds i64, ptr %a, i64 %index4592 %wide.load = load <2 x i32>, ptr %0, align 84593 %1 = mul <2 x i32> %wide.load, %broadcast.splat4594 store <2 x i32> %1, ptr %0, align 84595 %index.next = add nuw i64 %index, 44596 %2 = icmp eq i64 %index.next, 10244597 br i1 %2, label %for.cond.cleanup, label %vector.body4598 4599for.cond.cleanup: ; preds = %vector.body4600 ret void4601}4602 4603define void @sink_splat_add_lmulmf2(ptr nocapture %a, i32 signext %x) {4604; CHECK-LABEL: sink_splat_add_lmulmf2:4605; CHECK: # %bb.0: # %entry4606; CHECK-NEXT: lui a2, 24607; CHECK-NEXT: add a2, a0, a24608; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4609; CHECK-NEXT: .LBB96_1: # %vector.body4610; CHECK-NEXT: # =>This Inner Loop Header: Depth=14611; CHECK-NEXT: vle32.v v8, (a0)4612; CHECK-NEXT: vadd.vx v8, v8, a14613; CHECK-NEXT: vse32.v v8, (a0)4614; CHECK-NEXT: addi a0, a0, 324615; CHECK-NEXT: bne a0, a2, .LBB96_14616; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4617; CHECK-NEXT: ret4618entry:4619 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04620 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4621 br label %vector.body4622 4623vector.body: ; preds = %vector.body, %entry4624 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4625 %0 = getelementptr inbounds i64, ptr %a, i64 %index4626 %wide.load = load <2 x i32>, ptr %0, align 84627 %1 = add <2 x i32> %wide.load, %broadcast.splat4628 store <2 x i32> %1, ptr %0, align 84629 %index.next = add nuw i64 %index, 44630 %2 = icmp eq i64 %index.next, 10244631 br i1 %2, label %for.cond.cleanup, label %vector.body4632 4633for.cond.cleanup: ; preds = %vector.body4634 ret void4635}4636 4637define void @sink_splat_sub_lmulmf2(ptr nocapture %a, i32 signext %x) {4638; CHECK-LABEL: sink_splat_sub_lmulmf2:4639; CHECK: # %bb.0: # %entry4640; CHECK-NEXT: lui a2, 24641; CHECK-NEXT: add a2, a0, a24642; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4643; CHECK-NEXT: .LBB97_1: # %vector.body4644; CHECK-NEXT: # =>This Inner Loop Header: Depth=14645; CHECK-NEXT: vle32.v v8, (a0)4646; CHECK-NEXT: vsub.vx v8, v8, a14647; CHECK-NEXT: vse32.v v8, (a0)4648; CHECK-NEXT: addi a0, a0, 324649; CHECK-NEXT: bne a0, a2, .LBB97_14650; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4651; CHECK-NEXT: ret4652entry:4653 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04654 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4655 br label %vector.body4656 4657vector.body: ; preds = %vector.body, %entry4658 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4659 %0 = getelementptr inbounds i64, ptr %a, i64 %index4660 %wide.load = load <2 x i32>, ptr %0, align 84661 %1 = sub <2 x i32> %wide.load, %broadcast.splat4662 store <2 x i32> %1, ptr %0, align 84663 %index.next = add nuw i64 %index, 44664 %2 = icmp eq i64 %index.next, 10244665 br i1 %2, label %for.cond.cleanup, label %vector.body4666 4667for.cond.cleanup: ; preds = %vector.body4668 ret void4669}4670 4671define void @sink_splat_rsub_lmulmf2(ptr nocapture %a, i32 signext %x) {4672; CHECK-LABEL: sink_splat_rsub_lmulmf2:4673; CHECK: # %bb.0: # %entry4674; CHECK-NEXT: lui a2, 24675; CHECK-NEXT: add a2, a0, a24676; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4677; CHECK-NEXT: .LBB98_1: # %vector.body4678; CHECK-NEXT: # =>This Inner Loop Header: Depth=14679; CHECK-NEXT: vle32.v v8, (a0)4680; CHECK-NEXT: vrsub.vx v8, v8, a14681; CHECK-NEXT: vse32.v v8, (a0)4682; CHECK-NEXT: addi a0, a0, 324683; CHECK-NEXT: bne a0, a2, .LBB98_14684; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4685; CHECK-NEXT: ret4686entry:4687 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04688 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4689 br label %vector.body4690 4691vector.body: ; preds = %vector.body, %entry4692 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4693 %0 = getelementptr inbounds i64, ptr %a, i64 %index4694 %wide.load = load <2 x i32>, ptr %0, align 84695 %1 = sub <2 x i32> %broadcast.splat, %wide.load4696 store <2 x i32> %1, ptr %0, align 84697 %index.next = add nuw i64 %index, 44698 %2 = icmp eq i64 %index.next, 10244699 br i1 %2, label %for.cond.cleanup, label %vector.body4700 4701for.cond.cleanup: ; preds = %vector.body4702 ret void4703}4704 4705define void @sink_splat_and_lmulmf2(ptr nocapture %a, i32 signext %x) {4706; CHECK-LABEL: sink_splat_and_lmulmf2:4707; CHECK: # %bb.0: # %entry4708; CHECK-NEXT: lui a2, 24709; CHECK-NEXT: add a2, a0, a24710; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4711; CHECK-NEXT: .LBB99_1: # %vector.body4712; CHECK-NEXT: # =>This Inner Loop Header: Depth=14713; CHECK-NEXT: vle32.v v8, (a0)4714; CHECK-NEXT: vand.vx v8, v8, a14715; CHECK-NEXT: vse32.v v8, (a0)4716; CHECK-NEXT: addi a0, a0, 324717; CHECK-NEXT: bne a0, a2, .LBB99_14718; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4719; CHECK-NEXT: ret4720entry:4721 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04722 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4723 br label %vector.body4724 4725vector.body: ; preds = %vector.body, %entry4726 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4727 %0 = getelementptr inbounds i64, ptr %a, i64 %index4728 %wide.load = load <2 x i32>, ptr %0, align 84729 %1 = and <2 x i32> %wide.load, %broadcast.splat4730 store <2 x i32> %1, ptr %0, align 84731 %index.next = add nuw i64 %index, 44732 %2 = icmp eq i64 %index.next, 10244733 br i1 %2, label %for.cond.cleanup, label %vector.body4734 4735for.cond.cleanup: ; preds = %vector.body4736 ret void4737}4738 4739define void @sink_splat_or_lmulmf2(ptr nocapture %a, i32 signext %x) {4740; CHECK-LABEL: sink_splat_or_lmulmf2:4741; CHECK: # %bb.0: # %entry4742; CHECK-NEXT: lui a2, 24743; CHECK-NEXT: add a2, a0, a24744; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4745; CHECK-NEXT: .LBB100_1: # %vector.body4746; CHECK-NEXT: # =>This Inner Loop Header: Depth=14747; CHECK-NEXT: vle32.v v8, (a0)4748; CHECK-NEXT: vor.vx v8, v8, a14749; CHECK-NEXT: vse32.v v8, (a0)4750; CHECK-NEXT: addi a0, a0, 324751; CHECK-NEXT: bne a0, a2, .LBB100_14752; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4753; CHECK-NEXT: ret4754entry:4755 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04756 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4757 br label %vector.body4758 4759vector.body: ; preds = %vector.body, %entry4760 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4761 %0 = getelementptr inbounds i64, ptr %a, i64 %index4762 %wide.load = load <2 x i32>, ptr %0, align 84763 %1 = or <2 x i32> %wide.load, %broadcast.splat4764 store <2 x i32> %1, ptr %0, align 84765 %index.next = add nuw i64 %index, 44766 %2 = icmp eq i64 %index.next, 10244767 br i1 %2, label %for.cond.cleanup, label %vector.body4768 4769for.cond.cleanup: ; preds = %vector.body4770 ret void4771}4772 4773define void @sink_splat_xor_lmulmf2(ptr nocapture %a, i32 signext %x) {4774; CHECK-LABEL: sink_splat_xor_lmulmf2:4775; CHECK: # %bb.0: # %entry4776; CHECK-NEXT: lui a2, 24777; CHECK-NEXT: add a2, a0, a24778; CHECK-NEXT: vsetivli zero, 2, e32, mf2, ta, ma4779; CHECK-NEXT: .LBB101_1: # %vector.body4780; CHECK-NEXT: # =>This Inner Loop Header: Depth=14781; CHECK-NEXT: vle32.v v8, (a0)4782; CHECK-NEXT: vxor.vx v8, v8, a14783; CHECK-NEXT: vse32.v v8, (a0)4784; CHECK-NEXT: addi a0, a0, 324785; CHECK-NEXT: bne a0, a2, .LBB101_14786; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4787; CHECK-NEXT: ret4788entry:4789 %broadcast.splatinsert = insertelement <2 x i32> poison, i32 %x, i64 04790 %broadcast.splat = shufflevector <2 x i32> %broadcast.splatinsert, <2 x i32> poison, <2 x i32> zeroinitializer4791 br label %vector.body4792 4793vector.body: ; preds = %vector.body, %entry4794 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4795 %0 = getelementptr inbounds i64, ptr %a, i64 %index4796 %wide.load = load <2 x i32>, ptr %0, align 84797 %1 = xor <2 x i32> %wide.load, %broadcast.splat4798 store <2 x i32> %1, ptr %0, align 84799 %index.next = add nuw i64 %index, 44800 %2 = icmp eq i64 %index.next, 10244801 br i1 %2, label %for.cond.cleanup, label %vector.body4802 4803for.cond.cleanup: ; preds = %vector.body4804 ret void4805}4806 4807define void @sink_splat_vp_icmp(ptr nocapture %x, i32 signext %y, <4 x i1> %m, i32 zeroext %vl) {4808; CHECK-LABEL: sink_splat_vp_icmp:4809; CHECK: # %bb.0: # %entry4810; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4811; CHECK-NEXT: vmv1r.v v8, v04812; CHECK-NEXT: lui a3, 14813; CHECK-NEXT: add a3, a0, a34814; CHECK-NEXT: vmv.v.i v9, 04815; CHECK-NEXT: .LBB102_1: # %vector.body4816; CHECK-NEXT: # =>This Inner Loop Header: Depth=14817; CHECK-NEXT: vle32.v v10, (a0)4818; CHECK-NEXT: vmv1r.v v0, v84819; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma4820; CHECK-NEXT: vmseq.vx v0, v10, a1, v0.t4821; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4822; CHECK-NEXT: vse32.v v9, (a0), v0.t4823; CHECK-NEXT: addi a0, a0, 164824; CHECK-NEXT: bne a0, a3, .LBB102_14825; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4826; CHECK-NEXT: ret4827entry:4828 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %y, i32 04829 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer4830 br label %vector.body4831 4832vector.body: ; preds = %vector.body, %entry4833 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4834 %0 = getelementptr inbounds i32, ptr %x, i64 %index4835 %wide.load = load <4 x i32>, ptr %0, align 44836 %1 = call <4 x i1> @llvm.vp.icmp.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, metadata !"eq", <4 x i1> %m, i32 %vl)4837 call void @llvm.masked.store.v4i32.p0(<4 x i32> zeroinitializer, ptr %0, i32 4, <4 x i1> %1)4838 %index.next = add nuw i64 %index, 44839 %2 = icmp eq i64 %index.next, 10244840 br i1 %2, label %for.cond.cleanup, label %vector.body4841 4842for.cond.cleanup: ; preds = %vector.body4843 ret void4844}4845 4846define void @sink_splat_vp_fcmp(ptr nocapture %x, float %y, <4 x i1> %m, i32 zeroext %vl) {4847; CHECK-LABEL: sink_splat_vp_fcmp:4848; CHECK: # %bb.0: # %entry4849; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4850; CHECK-NEXT: vmv1r.v v8, v04851; CHECK-NEXT: lui a2, 14852; CHECK-NEXT: add a2, a0, a24853; CHECK-NEXT: vmv.v.i v9, 04854; CHECK-NEXT: .LBB103_1: # %vector.body4855; CHECK-NEXT: # =>This Inner Loop Header: Depth=14856; CHECK-NEXT: vle32.v v10, (a0)4857; CHECK-NEXT: vmv1r.v v0, v84858; CHECK-NEXT: vsetvli zero, a1, e32, m1, ta, ma4859; CHECK-NEXT: vmfeq.vf v0, v10, fa0, v0.t4860; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4861; CHECK-NEXT: vse32.v v9, (a0), v0.t4862; CHECK-NEXT: addi a0, a0, 164863; CHECK-NEXT: bne a0, a2, .LBB103_14864; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4865; CHECK-NEXT: ret4866entry:4867 %broadcast.splatinsert = insertelement <4 x float> poison, float %y, i32 04868 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer4869 br label %vector.body4870 4871vector.body: ; preds = %vector.body, %entry4872 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4873 %0 = getelementptr inbounds float, ptr %x, i64 %index4874 %wide.load = load <4 x float>, ptr %0, align 44875 %1 = call <4 x i1> @llvm.vp.fcmp.v4f32(<4 x float> %wide.load, <4 x float> %broadcast.splat, metadata !"oeq", <4 x i1> %m, i32 %vl)4876 call void @llvm.masked.store.v4f32.p0(<4 x float> zeroinitializer, ptr %0, i32 4, <4 x i1> %1)4877 %index.next = add nuw i64 %index, 44878 %2 = icmp eq i64 %index.next, 10244879 br i1 %2, label %for.cond.cleanup, label %vector.body4880 4881for.cond.cleanup: ; preds = %vector.body4882 ret void4883}4884 4885define void @sink_splat_vp_min(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {4886; CHECK-LABEL: sink_splat_vp_min:4887; CHECK: # %bb.0: # %entry4888; CHECK-NEXT: lui a3, 14889; CHECK-NEXT: add a3, a0, a34890; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4891; CHECK-NEXT: .LBB104_1: # %vector.body4892; CHECK-NEXT: # =>This Inner Loop Header: Depth=14893; CHECK-NEXT: vle32.v v8, (a0)4894; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma4895; CHECK-NEXT: vmin.vx v8, v8, a1, v0.t4896; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4897; CHECK-NEXT: vse32.v v8, (a0)4898; CHECK-NEXT: addi a0, a0, 164899; CHECK-NEXT: bne a0, a3, .LBB104_14900; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4901; CHECK-NEXT: ret4902entry:4903 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 04904 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer4905 br label %vector.body4906 4907vector.body: ; preds = %vector.body, %entry4908 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4909 %0 = getelementptr inbounds i32, ptr %a, i64 %index4910 %wide.load = load <4 x i32>, ptr %0, align 44911 %1 = call <4 x i32> @llvm.vp.smin.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)4912 store <4 x i32> %1, ptr %0, align 44913 %index.next = add nuw i64 %index, 44914 %2 = icmp eq i64 %index.next, 10244915 br i1 %2, label %for.cond.cleanup, label %vector.body4916 4917for.cond.cleanup: ; preds = %vector.body4918 ret void4919}4920 4921define void @sink_splat_vp_min_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {4922; CHECK-LABEL: sink_splat_vp_min_commute:4923; CHECK: # %bb.0: # %entry4924; CHECK-NEXT: lui a3, 14925; CHECK-NEXT: add a3, a0, a34926; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4927; CHECK-NEXT: .LBB105_1: # %vector.body4928; CHECK-NEXT: # =>This Inner Loop Header: Depth=14929; CHECK-NEXT: vle32.v v8, (a0)4930; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma4931; CHECK-NEXT: vmin.vx v8, v8, a1, v0.t4932; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4933; CHECK-NEXT: vse32.v v8, (a0)4934; CHECK-NEXT: addi a0, a0, 164935; CHECK-NEXT: bne a0, a3, .LBB105_14936; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4937; CHECK-NEXT: ret4938entry:4939 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 04940 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer4941 br label %vector.body4942 4943vector.body: ; preds = %vector.body, %entry4944 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4945 %0 = getelementptr inbounds i32, ptr %a, i64 %index4946 %wide.load = load <4 x i32>, ptr %0, align 44947 %1 = call <4 x i32> @llvm.vp.smin.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)4948 store <4 x i32> %1, ptr %0, align 44949 %index.next = add nuw i64 %index, 44950 %2 = icmp eq i64 %index.next, 10244951 br i1 %2, label %for.cond.cleanup, label %vector.body4952 4953for.cond.cleanup: ; preds = %vector.body4954 ret void4955}4956 4957define void @sink_splat_vp_max(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {4958; CHECK-LABEL: sink_splat_vp_max:4959; CHECK: # %bb.0: # %entry4960; CHECK-NEXT: lui a3, 14961; CHECK-NEXT: add a3, a0, a34962; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4963; CHECK-NEXT: .LBB106_1: # %vector.body4964; CHECK-NEXT: # =>This Inner Loop Header: Depth=14965; CHECK-NEXT: vle32.v v8, (a0)4966; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma4967; CHECK-NEXT: vmax.vx v8, v8, a1, v0.t4968; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4969; CHECK-NEXT: vse32.v v8, (a0)4970; CHECK-NEXT: addi a0, a0, 164971; CHECK-NEXT: bne a0, a3, .LBB106_14972; CHECK-NEXT: # %bb.2: # %for.cond.cleanup4973; CHECK-NEXT: ret4974entry:4975 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 04976 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer4977 br label %vector.body4978 4979vector.body: ; preds = %vector.body, %entry4980 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]4981 %0 = getelementptr inbounds i32, ptr %a, i64 %index4982 %wide.load = load <4 x i32>, ptr %0, align 44983 %1 = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)4984 store <4 x i32> %1, ptr %0, align 44985 %index.next = add nuw i64 %index, 44986 %2 = icmp eq i64 %index.next, 10244987 br i1 %2, label %for.cond.cleanup, label %vector.body4988 4989for.cond.cleanup: ; preds = %vector.body4990 ret void4991}4992 4993define void @sink_splat_vp_max_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {4994; CHECK-LABEL: sink_splat_vp_max_commute:4995; CHECK: # %bb.0: # %entry4996; CHECK-NEXT: lui a3, 14997; CHECK-NEXT: add a3, a0, a34998; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma4999; CHECK-NEXT: .LBB107_1: # %vector.body5000; CHECK-NEXT: # =>This Inner Loop Header: Depth=15001; CHECK-NEXT: vle32.v v8, (a0)5002; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5003; CHECK-NEXT: vmax.vx v8, v8, a1, v0.t5004; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5005; CHECK-NEXT: vse32.v v8, (a0)5006; CHECK-NEXT: addi a0, a0, 165007; CHECK-NEXT: bne a0, a3, .LBB107_15008; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5009; CHECK-NEXT: ret5010entry:5011 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05012 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5013 br label %vector.body5014 5015vector.body: ; preds = %vector.body, %entry5016 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5017 %0 = getelementptr inbounds i32, ptr %a, i64 %index5018 %wide.load = load <4 x i32>, ptr %0, align 45019 %1 = call <4 x i32> @llvm.vp.smax.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)5020 store <4 x i32> %1, ptr %0, align 45021 %index.next = add nuw i64 %index, 45022 %2 = icmp eq i64 %index.next, 10245023 br i1 %2, label %for.cond.cleanup, label %vector.body5024 5025for.cond.cleanup: ; preds = %vector.body5026 ret void5027}5028 5029define void @sink_splat_vp_umin_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5030; CHECK-LABEL: sink_splat_vp_umin_commute:5031; CHECK: # %bb.0: # %entry5032; CHECK-NEXT: lui a3, 15033; CHECK-NEXT: add a3, a0, a35034; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5035; CHECK-NEXT: .LBB108_1: # %vector.body5036; CHECK-NEXT: # =>This Inner Loop Header: Depth=15037; CHECK-NEXT: vle32.v v8, (a0)5038; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5039; CHECK-NEXT: vminu.vx v8, v8, a1, v0.t5040; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5041; CHECK-NEXT: vse32.v v8, (a0)5042; CHECK-NEXT: addi a0, a0, 165043; CHECK-NEXT: bne a0, a3, .LBB108_15044; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5045; CHECK-NEXT: ret5046entry:5047 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05048 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5049 br label %vector.body5050 5051vector.body: ; preds = %vector.body, %entry5052 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5053 %0 = getelementptr inbounds i32, ptr %a, i64 %index5054 %wide.load = load <4 x i32>, ptr %0, align 45055 %1 = call <4 x i32> @llvm.vp.umin.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)5056 store <4 x i32> %1, ptr %0, align 45057 %index.next = add nuw i64 %index, 45058 %2 = icmp eq i64 %index.next, 10245059 br i1 %2, label %for.cond.cleanup, label %vector.body5060 5061for.cond.cleanup: ; preds = %vector.body5062 ret void5063}5064 5065define void @sink_splat_vp_umax(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5066; CHECK-LABEL: sink_splat_vp_umax:5067; CHECK: # %bb.0: # %entry5068; CHECK-NEXT: lui a3, 15069; CHECK-NEXT: add a3, a0, a35070; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5071; CHECK-NEXT: .LBB109_1: # %vector.body5072; CHECK-NEXT: # =>This Inner Loop Header: Depth=15073; CHECK-NEXT: vle32.v v8, (a0)5074; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5075; CHECK-NEXT: vmaxu.vx v8, v8, a1, v0.t5076; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5077; CHECK-NEXT: vse32.v v8, (a0)5078; CHECK-NEXT: addi a0, a0, 165079; CHECK-NEXT: bne a0, a3, .LBB109_15080; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5081; CHECK-NEXT: ret5082entry:5083 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05084 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5085 br label %vector.body5086 5087vector.body: ; preds = %vector.body, %entry5088 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5089 %0 = getelementptr inbounds i32, ptr %a, i64 %index5090 %wide.load = load <4 x i32>, ptr %0, align 45091 %1 = call <4 x i32> @llvm.vp.umax.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)5092 store <4 x i32> %1, ptr %0, align 45093 %index.next = add nuw i64 %index, 45094 %2 = icmp eq i64 %index.next, 10245095 br i1 %2, label %for.cond.cleanup, label %vector.body5096 5097for.cond.cleanup: ; preds = %vector.body5098 ret void5099}5100 5101define void @sink_splat_vp_umax_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5102; CHECK-LABEL: sink_splat_vp_umax_commute:5103; CHECK: # %bb.0: # %entry5104; CHECK-NEXT: lui a3, 15105; CHECK-NEXT: add a3, a0, a35106; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5107; CHECK-NEXT: .LBB110_1: # %vector.body5108; CHECK-NEXT: # =>This Inner Loop Header: Depth=15109; CHECK-NEXT: vle32.v v8, (a0)5110; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5111; CHECK-NEXT: vmaxu.vx v8, v8, a1, v0.t5112; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5113; CHECK-NEXT: vse32.v v8, (a0)5114; CHECK-NEXT: addi a0, a0, 165115; CHECK-NEXT: bne a0, a3, .LBB110_15116; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5117; CHECK-NEXT: ret5118entry:5119 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05120 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5121 br label %vector.body5122 5123vector.body: ; preds = %vector.body, %entry5124 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5125 %0 = getelementptr inbounds i32, ptr %a, i64 %index5126 %wide.load = load <4 x i32>, ptr %0, align 45127 %1 = call <4 x i32> @llvm.vp.umax.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)5128 store <4 x i32> %1, ptr %0, align 45129 %index.next = add nuw i64 %index, 45130 %2 = icmp eq i64 %index.next, 10245131 br i1 %2, label %for.cond.cleanup, label %vector.body5132 5133for.cond.cleanup: ; preds = %vector.body5134 ret void5135}5136 5137define void @sink_splat_vp_sadd_sat(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5138; CHECK-LABEL: sink_splat_vp_sadd_sat:5139; CHECK: # %bb.0: # %entry5140; CHECK-NEXT: lui a3, 15141; CHECK-NEXT: add a3, a0, a35142; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5143; CHECK-NEXT: .LBB111_1: # %vector.body5144; CHECK-NEXT: # =>This Inner Loop Header: Depth=15145; CHECK-NEXT: vle32.v v8, (a0)5146; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5147; CHECK-NEXT: vsadd.vx v8, v8, a1, v0.t5148; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5149; CHECK-NEXT: vse32.v v8, (a0)5150; CHECK-NEXT: addi a0, a0, 165151; CHECK-NEXT: bne a0, a3, .LBB111_15152; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5153; CHECK-NEXT: ret5154entry:5155 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05156 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5157 br label %vector.body5158 5159vector.body: ; preds = %vector.body, %entry5160 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5161 %0 = getelementptr inbounds i32, ptr %a, i64 %index5162 %wide.load = load <4 x i32>, ptr %0, align 45163 %1 = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)5164 store <4 x i32> %1, ptr %0, align 45165 %index.next = add nuw i64 %index, 45166 %2 = icmp eq i64 %index.next, 10245167 br i1 %2, label %for.cond.cleanup, label %vector.body5168 5169for.cond.cleanup: ; preds = %vector.body5170 ret void5171}5172 5173define void @sink_splat_vp_sadd_sat_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5174; CHECK-LABEL: sink_splat_vp_sadd_sat_commute:5175; CHECK: # %bb.0: # %entry5176; CHECK-NEXT: lui a3, 15177; CHECK-NEXT: add a3, a0, a35178; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5179; CHECK-NEXT: .LBB112_1: # %vector.body5180; CHECK-NEXT: # =>This Inner Loop Header: Depth=15181; CHECK-NEXT: vle32.v v8, (a0)5182; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5183; CHECK-NEXT: vsadd.vx v8, v8, a1, v0.t5184; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5185; CHECK-NEXT: vse32.v v8, (a0)5186; CHECK-NEXT: addi a0, a0, 165187; CHECK-NEXT: bne a0, a3, .LBB112_15188; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5189; CHECK-NEXT: ret5190entry:5191 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05192 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5193 br label %vector.body5194 5195vector.body: ; preds = %vector.body, %entry5196 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5197 %0 = getelementptr inbounds i32, ptr %a, i64 %index5198 %wide.load = load <4 x i32>, ptr %0, align 45199 %1 = call <4 x i32> @llvm.vp.sadd.sat.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)5200 store <4 x i32> %1, ptr %0, align 45201 %index.next = add nuw i64 %index, 45202 %2 = icmp eq i64 %index.next, 10245203 br i1 %2, label %for.cond.cleanup, label %vector.body5204 5205for.cond.cleanup: ; preds = %vector.body5206 ret void5207}5208 5209define void @sink_splat_vp_ssub_sat(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5210; CHECK-LABEL: sink_splat_vp_ssub_sat:5211; CHECK: # %bb.0: # %entry5212; CHECK-NEXT: li a3, 10245213; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5214; CHECK-NEXT: .LBB113_1: # %vector.body5215; CHECK-NEXT: # =>This Inner Loop Header: Depth=15216; CHECK-NEXT: vle32.v v8, (a0)5217; CHECK-NEXT: addi a3, a3, 45218; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5219; CHECK-NEXT: vssub.vx v8, v8, a1, v0.t5220; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5221; CHECK-NEXT: vse32.v v8, (a0)5222; CHECK-NEXT: addi a0, a0, -165223; CHECK-NEXT: bnez a3, .LBB113_15224; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5225; CHECK-NEXT: ret5226entry:5227 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05228 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5229 br label %vector.body5230 5231vector.body: ; preds = %vector.body, %entry5232 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5233 %0 = getelementptr inbounds i32, ptr %a, i64 %index5234 %wide.load = load <4 x i32>, ptr %0, align 45235 %1 = call <4 x i32> @llvm.vp.ssub.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)5236 store <4 x i32> %1, ptr %0, align 45237 %index.next = sub nuw i64 %index, 45238 %2 = icmp eq i64 %index.next, 10245239 br i1 %2, label %for.cond.cleanup, label %vector.body5240 5241for.cond.cleanup: ; preds = %vector.body5242 ret void5243}5244 5245define void @sink_splat_vp_uadd_sat(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5246; CHECK-LABEL: sink_splat_vp_uadd_sat:5247; CHECK: # %bb.0: # %entry5248; CHECK-NEXT: lui a3, 15249; CHECK-NEXT: add a3, a0, a35250; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5251; CHECK-NEXT: .LBB114_1: # %vector.body5252; CHECK-NEXT: # =>This Inner Loop Header: Depth=15253; CHECK-NEXT: vle32.v v8, (a0)5254; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5255; CHECK-NEXT: vsaddu.vx v8, v8, a1, v0.t5256; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5257; CHECK-NEXT: vse32.v v8, (a0)5258; CHECK-NEXT: addi a0, a0, 165259; CHECK-NEXT: bne a0, a3, .LBB114_15260; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5261; CHECK-NEXT: ret5262entry:5263 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05264 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5265 br label %vector.body5266 5267vector.body: ; preds = %vector.body, %entry5268 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5269 %0 = getelementptr inbounds i32, ptr %a, i64 %index5270 %wide.load = load <4 x i32>, ptr %0, align 45271 %1 = call <4 x i32> @llvm.vp.uadd.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)5272 store <4 x i32> %1, ptr %0, align 45273 %index.next = add nuw i64 %index, 45274 %2 = icmp eq i64 %index.next, 10245275 br i1 %2, label %for.cond.cleanup, label %vector.body5276 5277for.cond.cleanup: ; preds = %vector.body5278 ret void5279}5280 5281define void @sink_splat_vp_uadd_sat_commute(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5282; CHECK-LABEL: sink_splat_vp_uadd_sat_commute:5283; CHECK: # %bb.0: # %entry5284; CHECK-NEXT: lui a3, 15285; CHECK-NEXT: add a3, a0, a35286; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5287; CHECK-NEXT: .LBB115_1: # %vector.body5288; CHECK-NEXT: # =>This Inner Loop Header: Depth=15289; CHECK-NEXT: vle32.v v8, (a0)5290; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5291; CHECK-NEXT: vsaddu.vx v8, v8, a1, v0.t5292; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5293; CHECK-NEXT: vse32.v v8, (a0)5294; CHECK-NEXT: addi a0, a0, 165295; CHECK-NEXT: bne a0, a3, .LBB115_15296; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5297; CHECK-NEXT: ret5298entry:5299 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05300 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5301 br label %vector.body5302 5303vector.body: ; preds = %vector.body, %entry5304 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5305 %0 = getelementptr inbounds i32, ptr %a, i64 %index5306 %wide.load = load <4 x i32>, ptr %0, align 45307 %1 = call <4 x i32> @llvm.vp.uadd.sat.v4i32(<4 x i32> %broadcast.splat, <4 x i32> %wide.load, <4 x i1> %m, i32 %vl)5308 store <4 x i32> %1, ptr %0, align 45309 %index.next = add nuw i64 %index, 45310 %2 = icmp eq i64 %index.next, 10245311 br i1 %2, label %for.cond.cleanup, label %vector.body5312 5313for.cond.cleanup: ; preds = %vector.body5314 ret void5315}5316 5317define void @sink_splat_vp_usub_sat(ptr nocapture %a, i32 signext %x, <4 x i1> %m, i32 zeroext %vl) {5318; CHECK-LABEL: sink_splat_vp_usub_sat:5319; CHECK: # %bb.0: # %entry5320; CHECK-NEXT: li a3, 10245321; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5322; CHECK-NEXT: .LBB116_1: # %vector.body5323; CHECK-NEXT: # =>This Inner Loop Header: Depth=15324; CHECK-NEXT: vle32.v v8, (a0)5325; CHECK-NEXT: addi a3, a3, 45326; CHECK-NEXT: vsetvli zero, a2, e32, m1, ta, ma5327; CHECK-NEXT: vssubu.vx v8, v8, a1, v0.t5328; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5329; CHECK-NEXT: vse32.v v8, (a0)5330; CHECK-NEXT: addi a0, a0, -165331; CHECK-NEXT: bnez a3, .LBB116_15332; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5333; CHECK-NEXT: ret5334entry:5335 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05336 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5337 br label %vector.body5338 5339vector.body: ; preds = %vector.body, %entry5340 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5341 %0 = getelementptr inbounds i32, ptr %a, i64 %index5342 %wide.load = load <4 x i32>, ptr %0, align 45343 %1 = call <4 x i32> @llvm.vp.usub.sat.v4i32(<4 x i32> %wide.load, <4 x i32> %broadcast.splat, <4 x i1> %m, i32 %vl)5344 store <4 x i32> %1, ptr %0, align 45345 %index.next = sub nuw i64 %index, 45346 %2 = icmp eq i64 %index.next, 10245347 br i1 %2, label %for.cond.cleanup, label %vector.body5348 5349for.cond.cleanup: ; preds = %vector.body5350 ret void5351}5352 5353define void @sink_splat_select_op1(ptr nocapture %a, i32 signext %x) {5354; CHECK-LABEL: sink_splat_select_op1:5355; CHECK: # %bb.0: # %entry5356; CHECK-NEXT: lui a3, 15357; CHECK-NEXT: li a2, 425358; CHECK-NEXT: add a3, a0, a35359; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5360; CHECK-NEXT: vmv.v.x v8, a15361; CHECK-NEXT: .LBB117_1: # %vector.body5362; CHECK-NEXT: # =>This Inner Loop Header: Depth=15363; CHECK-NEXT: vle32.v v9, (a0)5364; CHECK-NEXT: vmseq.vx v0, v9, a25365; CHECK-NEXT: vse32.v v8, (a0), v0.t5366; CHECK-NEXT: addi a0, a0, 165367; CHECK-NEXT: bne a0, a3, .LBB117_15368; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5369; CHECK-NEXT: ret5370entry:5371 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05372 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5373 br label %vector.body5374 5375vector.body: ; preds = %vector.body, %entry5376 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5377 %0 = getelementptr inbounds i32, ptr %a, i64 %index5378 %load = load <4 x i32>, ptr %0, align 45379 %cond = icmp eq <4 x i32> %load, splat (i32 42)5380 %1 = select <4 x i1> %cond, <4 x i32> %broadcast.splat, <4 x i32> %load5381 store <4 x i32> %1, ptr %0, align 45382 %index.next = add nuw i64 %index, 45383 %2 = icmp eq i64 %index.next, 10245384 br i1 %2, label %for.cond.cleanup, label %vector.body5385 5386for.cond.cleanup: ; preds = %vector.body5387 ret void5388}5389 5390define void @sink_splat_select_op2(ptr nocapture %a, i32 signext %x) {5391; CHECK-LABEL: sink_splat_select_op2:5392; CHECK: # %bb.0: # %entry5393; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5394; CHECK-NEXT: vmv.v.x v8, a15395; CHECK-NEXT: lui a1, 15396; CHECK-NEXT: add a1, a0, a15397; CHECK-NEXT: li a2, 425398; CHECK-NEXT: .LBB118_1: # %vector.body5399; CHECK-NEXT: # =>This Inner Loop Header: Depth=15400; CHECK-NEXT: vle32.v v9, (a0)5401; CHECK-NEXT: vmsne.vx v0, v9, a25402; CHECK-NEXT: vse32.v v8, (a0), v0.t5403; CHECK-NEXT: addi a0, a0, 165404; CHECK-NEXT: bne a0, a1, .LBB118_15405; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5406; CHECK-NEXT: ret5407entry:5408 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05409 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5410 br label %vector.body5411 5412vector.body: ; preds = %vector.body, %entry5413 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5414 %0 = getelementptr inbounds i32, ptr %a, i64 %index5415 %load = load <4 x i32>, ptr %0, align 45416 %cond = icmp eq <4 x i32> %load, splat (i32 42)5417 %1 = select <4 x i1> %cond, <4 x i32> %load, <4 x i32> %broadcast.splat5418 store <4 x i32> %1, ptr %0, align 45419 %index.next = add nuw i64 %index, 45420 %2 = icmp eq i64 %index.next, 10245421 br i1 %2, label %for.cond.cleanup, label %vector.body5422 5423for.cond.cleanup: ; preds = %vector.body5424 ret void5425}5426 5427define void @sink_splat_vp_select_op1(ptr %a, i32 %x, i32 %vl) {5428; CHECK-LABEL: sink_splat_vp_select_op1:5429; CHECK: # %bb.0: # %entry5430; CHECK-NEXT: lui a4, 15431; CHECK-NEXT: li a3, 425432; CHECK-NEXT: slli a5, a2, 325433; CHECK-NEXT: add a2, a0, a45434; CHECK-NEXT: srli a4, a5, 325435; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5436; CHECK-NEXT: .LBB119_1: # %vector.body5437; CHECK-NEXT: # =>This Inner Loop Header: Depth=15438; CHECK-NEXT: vle32.v v8, (a0)5439; CHECK-NEXT: vmseq.vx v0, v8, a35440; CHECK-NEXT: vsetvli zero, a4, e32, m1, ta, ma5441; CHECK-NEXT: vmerge.vxm v8, v8, a1, v05442; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5443; CHECK-NEXT: vse32.v v8, (a0)5444; CHECK-NEXT: addi a0, a0, 165445; CHECK-NEXT: bne a0, a2, .LBB119_15446; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5447; CHECK-NEXT: ret5448entry:5449 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05450 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5451 br label %vector.body5452 5453vector.body:5454 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5455 %0 = getelementptr inbounds i32, ptr %a, i64 %index5456 %load = load <4 x i32>, ptr %0, align 45457 %cond = icmp eq <4 x i32> %load, splat (i32 42)5458 %1 = call <4 x i32> @llvm.vp.select(<4 x i1> %cond, <4 x i32> %broadcast.splat, <4 x i32> %load, i32 %vl)5459 store <4 x i32> %1, ptr %0, align 45460 %index.next = add nuw i64 %index, 45461 %2 = icmp eq i64 %index.next, 10245462 br i1 %2, label %for.cond.cleanup, label %vector.body5463 5464for.cond.cleanup:5465 ret void5466}5467 5468define void @sink_splat_vp_select_op2(ptr %a, i32 %x, i32 %vl) {5469; CHECK-LABEL: sink_splat_vp_select_op2:5470; CHECK: # %bb.0: # %entry5471; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5472; CHECK-NEXT: vmv.v.x v8, a15473; CHECK-NEXT: lui a3, 15474; CHECK-NEXT: li a1, 425475; CHECK-NEXT: slli a4, a2, 325476; CHECK-NEXT: add a2, a0, a35477; CHECK-NEXT: srli a3, a4, 325478; CHECK-NEXT: .LBB120_1: # %vector.body5479; CHECK-NEXT: # =>This Inner Loop Header: Depth=15480; CHECK-NEXT: vle32.v v9, (a0)5481; CHECK-NEXT: vmseq.vx v0, v9, a15482; CHECK-NEXT: vsetvli zero, a3, e32, m1, ta, ma5483; CHECK-NEXT: vmerge.vvm v9, v8, v9, v05484; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5485; CHECK-NEXT: vse32.v v9, (a0)5486; CHECK-NEXT: addi a0, a0, 165487; CHECK-NEXT: bne a0, a2, .LBB120_15488; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5489; CHECK-NEXT: ret5490entry:5491 %broadcast.splatinsert = insertelement <4 x i32> poison, i32 %x, i32 05492 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> poison, <4 x i32> zeroinitializer5493 br label %vector.body5494 5495vector.body:5496 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5497 %0 = getelementptr inbounds i32, ptr %a, i64 %index5498 %load = load <4 x i32>, ptr %0, align 45499 %cond = icmp eq <4 x i32> %load, splat (i32 42)5500 %1 = call <4 x i32> @llvm.vp.select(<4 x i1> %cond, <4 x i32> %load, <4 x i32> %broadcast.splat, i32 %vl)5501 store <4 x i32> %1, ptr %0, align 45502 %index.next = add nuw i64 %index, 45503 %2 = icmp eq i64 %index.next, 10245504 br i1 %2, label %for.cond.cleanup, label %vector.body5505 5506for.cond.cleanup:5507 ret void5508}5509 5510define void @sink_splat_fmuladd(ptr %a, ptr %b, float %x) {5511; CHECK-LABEL: sink_splat_fmuladd:5512; CHECK: # %bb.0: # %entry5513; CHECK-NEXT: lui a2, 15514; CHECK-NEXT: add a2, a1, a25515; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5516; CHECK-NEXT: .LBB121_1: # %vector.body5517; CHECK-NEXT: # =>This Inner Loop Header: Depth=15518; CHECK-NEXT: vle32.v v8, (a0)5519; CHECK-NEXT: vle32.v v9, (a1)5520; CHECK-NEXT: addi a1, a1, 165521; CHECK-NEXT: vfmacc.vf v9, fa0, v85522; CHECK-NEXT: vse32.v v9, (a0)5523; CHECK-NEXT: addi a0, a0, 165524; CHECK-NEXT: bne a1, a2, .LBB121_15525; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5526; CHECK-NEXT: ret5527entry:5528 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 05529 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer5530 br label %vector.body5531 5532vector.body:5533 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5534 %0 = getelementptr inbounds float, ptr %a, i64 %index5535 %wide.load = load <4 x float>, ptr %0, align 45536 %1 = getelementptr inbounds float, ptr %b, i64 %index5537 %wide.load12 = load <4 x float>, ptr %1, align 45538 %2 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x float> %wide.load12)5539 store <4 x float> %2, ptr %0, align 45540 %index.next = add nuw i64 %index, 45541 %3 = icmp eq i64 %index.next, 10245542 br i1 %3, label %for.cond.cleanup, label %vector.body5543 5544for.cond.cleanup:5545 ret void5546}5547 5548define void @sink_splat_fmuladd_commute(ptr %a, ptr %b, float %x) {5549; CHECK-LABEL: sink_splat_fmuladd_commute:5550; CHECK: # %bb.0: # %entry5551; CHECK-NEXT: lui a2, 15552; CHECK-NEXT: add a2, a1, a25553; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5554; CHECK-NEXT: .LBB122_1: # %vector.body5555; CHECK-NEXT: # =>This Inner Loop Header: Depth=15556; CHECK-NEXT: vle32.v v8, (a0)5557; CHECK-NEXT: vle32.v v9, (a1)5558; CHECK-NEXT: addi a1, a1, 165559; CHECK-NEXT: vfmacc.vf v9, fa0, v85560; CHECK-NEXT: vse32.v v9, (a0)5561; CHECK-NEXT: addi a0, a0, 165562; CHECK-NEXT: bne a1, a2, .LBB122_15563; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5564; CHECK-NEXT: ret5565entry:5566 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 05567 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer5568 br label %vector.body5569 5570vector.body:5571 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5572 %0 = getelementptr inbounds float, ptr %a, i64 %index5573 %wide.load = load <4 x float>, ptr %0, align 45574 %1 = getelementptr inbounds float, ptr %b, i64 %index5575 %wide.load12 = load <4 x float>, ptr %1, align 45576 %2 = call <4 x float> @llvm.fmuladd.v4f32(<4 x float> %broadcast.splat, <4 x float> %wide.load, <4 x float> %wide.load12)5577 store <4 x float> %2, ptr %0, align 45578 %index.next = add nuw i64 %index, 45579 %3 = icmp eq i64 %index.next, 10245580 br i1 %3, label %for.cond.cleanup, label %vector.body5581 5582for.cond.cleanup:5583 ret void5584}5585 5586define void @sink_splat_vp_fmuladd(ptr %a, ptr %b, float %x, <4 x i1> %m, i32 %vl) {5587; CHECK-LABEL: sink_splat_vp_fmuladd:5588; CHECK: # %bb.0: # %entry5589; CHECK-NEXT: lui a3, 15590; CHECK-NEXT: slli a4, a2, 325591; CHECK-NEXT: add a2, a1, a35592; CHECK-NEXT: srli a3, a4, 325593; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5594; CHECK-NEXT: .LBB123_1: # %vector.body5595; CHECK-NEXT: # =>This Inner Loop Header: Depth=15596; CHECK-NEXT: vle32.v v8, (a0)5597; CHECK-NEXT: vle32.v v9, (a1)5598; CHECK-NEXT: addi a1, a1, 165599; CHECK-NEXT: vsetvli zero, a3, e32, m1, ta, ma5600; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t5601; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5602; CHECK-NEXT: vse32.v v8, (a0)5603; CHECK-NEXT: addi a0, a0, 165604; CHECK-NEXT: bne a1, a2, .LBB123_15605; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5606; CHECK-NEXT: ret5607entry:5608 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 05609 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer5610 br label %vector.body5611 5612vector.body:5613 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5614 %0 = getelementptr inbounds float, ptr %a, i64 %index5615 %wide.load = load <4 x float>, ptr %0, align 45616 %1 = getelementptr inbounds float, ptr %b, i64 %index5617 %wide.load12 = load <4 x float>, ptr %1, align 45618 %2 = call <4 x float> @llvm.vp.fmuladd.v4f32(<4 x float> %wide.load, <4 x float> %broadcast.splat, <4 x float> %wide.load12, <4 x i1> %m, i32 %vl)5619 store <4 x float> %2, ptr %0, align 45620 %index.next = add nuw i64 %index, 45621 %3 = icmp eq i64 %index.next, 10245622 br i1 %3, label %for.cond.cleanup, label %vector.body5623 5624for.cond.cleanup:5625 ret void5626}5627 5628define void @sink_splat_vp_fmuladd_commute(ptr %a, ptr %b, float %x, <4 x i1> %m, i32 %vl) {5629; CHECK-LABEL: sink_splat_vp_fmuladd_commute:5630; CHECK: # %bb.0: # %entry5631; CHECK-NEXT: lui a3, 15632; CHECK-NEXT: slli a4, a2, 325633; CHECK-NEXT: add a2, a1, a35634; CHECK-NEXT: srli a3, a4, 325635; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5636; CHECK-NEXT: .LBB124_1: # %vector.body5637; CHECK-NEXT: # =>This Inner Loop Header: Depth=15638; CHECK-NEXT: vle32.v v8, (a0)5639; CHECK-NEXT: vle32.v v9, (a1)5640; CHECK-NEXT: addi a1, a1, 165641; CHECK-NEXT: vsetvli zero, a3, e32, m1, ta, ma5642; CHECK-NEXT: vfmadd.vf v8, fa0, v9, v0.t5643; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5644; CHECK-NEXT: vse32.v v8, (a0)5645; CHECK-NEXT: addi a0, a0, 165646; CHECK-NEXT: bne a1, a2, .LBB124_15647; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5648; CHECK-NEXT: ret5649entry:5650 %broadcast.splatinsert = insertelement <4 x float> poison, float %x, i32 05651 %broadcast.splat = shufflevector <4 x float> %broadcast.splatinsert, <4 x float> poison, <4 x i32> zeroinitializer5652 br label %vector.body5653 5654vector.body:5655 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5656 %0 = getelementptr inbounds float, ptr %a, i64 %index5657 %wide.load = load <4 x float>, ptr %0, align 45658 %1 = getelementptr inbounds float, ptr %b, i64 %index5659 %wide.load12 = load <4 x float>, ptr %1, align 45660 %2 = call <4 x float> @llvm.vp.fmuladd.v4f32(<4 x float> %broadcast.splat, <4 x float> %wide.load, <4 x float> %wide.load12, <4 x i1> %m, i32 %vl)5661 store <4 x float> %2, ptr %0, align 45662 %index.next = add nuw i64 %index, 45663 %3 = icmp eq i64 %index.next, 10245664 br i1 %3, label %for.cond.cleanup, label %vector.body5665 5666for.cond.cleanup:5667 ret void5668}5669 5670define void @sink_splat_vfwadd_vf(ptr nocapture %a, ptr nocapture %b, float %f) {5671; CHECK-LABEL: sink_splat_vfwadd_vf:5672; CHECK: # %bb.0: # %entry5673; CHECK-NEXT: li a1, 05674; CHECK-NEXT: li a2, 10205675; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma5676; CHECK-NEXT: .LBB125_1: # %vector.body5677; CHECK-NEXT: # =>This Inner Loop Header: Depth=15678; CHECK-NEXT: vl1re32.v v10, (a0)5679; CHECK-NEXT: addi a1, a1, 45680; CHECK-NEXT: addi a2, a2, -45681; CHECK-NEXT: vfwadd.vf v8, v10, fa05682; CHECK-NEXT: vs2r.v v8, (a0)5683; CHECK-NEXT: addi a0, a0, 165684; CHECK-NEXT: j .LBB125_15685entry:5686 %f.ext = fpext float %f to double5687 %broadcast.splatinsert = insertelement <vscale x 2 x double> poison, double %f.ext, i32 05688 %broadcast.splat = shufflevector <vscale x 2 x double> %broadcast.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer5689 br label %vector.body5690 5691vector.body: ; preds = %vector.body, %entry5692 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5693 %0 = getelementptr float, ptr %a, i64 %index5694 %wide.load = load <vscale x 2 x float>, ptr %05695 %ext = fpext <vscale x 2 x float> %wide.load to <vscale x 2 x double>5696 %1 = fadd <vscale x 2 x double> %ext, %broadcast.splat5697 %2 = getelementptr double, ptr %b, i64 %index5698 store <vscale x 2 x double> %1, ptr %05699 %index.next = add i64 %index, 45700 %3 = icmp eq i64 %index.next, 10245701 br i1 32, label %for.cond.cleanup, label %vector.body5702 5703for.cond.cleanup: ; preds = %vector.body5704 ret void5705}5706 5707define void @sink_splat_vfwadd_wf(ptr nocapture %a, ptr nocapture %b, float %f) {5708; CHECK-LABEL: sink_splat_vfwadd_wf:5709; CHECK: # %bb.0: # %entry5710; CHECK-NEXT: li a1, 05711; CHECK-NEXT: li a2, 10205712; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma5713; CHECK-NEXT: .LBB126_1: # %vector.body5714; CHECK-NEXT: # =>This Inner Loop Header: Depth=15715; CHECK-NEXT: vl2re64.v v8, (a0)5716; CHECK-NEXT: addi a1, a1, 45717; CHECK-NEXT: addi a2, a2, -45718; CHECK-NEXT: vfwadd.wf v8, v8, fa05719; CHECK-NEXT: vs2r.v v8, (a0)5720; CHECK-NEXT: addi a0, a0, 325721; CHECK-NEXT: j .LBB126_15722entry:5723 %f.ext = fpext float %f to double5724 %broadcast.splatinsert = insertelement <vscale x 2 x double> poison, double %f.ext, i32 05725 %broadcast.splat = shufflevector <vscale x 2 x double> %broadcast.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer5726 br label %vector.body5727 5728vector.body: ; preds = %vector.body, %entry5729 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5730 %0 = getelementptr double, ptr %a, i64 %index5731 %wide.load = load <vscale x 2 x double>, ptr %05732 %1 = fadd <vscale x 2 x double> %wide.load, %broadcast.splat5733 %2 = getelementptr double, ptr %b, i64 %index5734 store <vscale x 2 x double> %1, ptr %05735 %index.next = add i64 %index, 45736 %3 = icmp eq i64 %index.next, 10245737 br i1 32, label %for.cond.cleanup, label %vector.body5738 5739for.cond.cleanup: ; preds = %vector.body5740 ret void5741}5742 5743define void @sink_splat_vfwmul_vf(ptr nocapture %a, ptr nocapture %b, float %f) {5744; CHECK-LABEL: sink_splat_vfwmul_vf:5745; CHECK: # %bb.0: # %entry5746; CHECK-NEXT: li a1, 05747; CHECK-NEXT: li a2, 10205748; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma5749; CHECK-NEXT: .LBB127_1: # %vector.body5750; CHECK-NEXT: # =>This Inner Loop Header: Depth=15751; CHECK-NEXT: vl1re32.v v10, (a0)5752; CHECK-NEXT: addi a1, a1, 45753; CHECK-NEXT: addi a2, a2, -45754; CHECK-NEXT: vfwmul.vf v8, v10, fa05755; CHECK-NEXT: vs2r.v v8, (a0)5756; CHECK-NEXT: addi a0, a0, 165757; CHECK-NEXT: j .LBB127_15758entry:5759 %f.ext = fpext float %f to double5760 %broadcast.splatinsert = insertelement <vscale x 2 x double> poison, double %f.ext, i32 05761 %broadcast.splat = shufflevector <vscale x 2 x double> %broadcast.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer5762 br label %vector.body5763 5764vector.body: ; preds = %vector.body, %entry5765 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5766 %0 = getelementptr float, ptr %a, i64 %index5767 %wide.load = load <vscale x 2 x float>, ptr %05768 %ext = fpext <vscale x 2 x float> %wide.load to <vscale x 2 x double>5769 %1 = fmul <vscale x 2 x double> %ext, %broadcast.splat5770 %2 = getelementptr double, ptr %b, i64 %index5771 store <vscale x 2 x double> %1, ptr %05772 %index.next = add i64 %index, 45773 %3 = icmp eq i64 %index.next, 10245774 br i1 32, label %for.cond.cleanup, label %vector.body5775 5776for.cond.cleanup: ; preds = %vector.body5777 ret void5778}5779 5780; Even though there's no vfwmul.wf we'll sink the fcvt.d.s. Make sure5781; early-machinelicm undos the sink after isel.5782define void @sink_splat_vfwmul_wf(ptr nocapture %a, ptr nocapture %b, float %f) {5783; CHECK-LABEL: sink_splat_vfwmul_wf:5784; CHECK: # %bb.0: # %entry5785; CHECK-NEXT: li a1, 05786; CHECK-NEXT: li a2, 10205787; CHECK-NEXT: fcvt.d.s fa5, fa05788; CHECK-NEXT: vsetvli a3, zero, e64, m2, ta, ma5789; CHECK-NEXT: .LBB128_1: # %vector.body5790; CHECK-NEXT: # =>This Inner Loop Header: Depth=15791; CHECK-NEXT: vl2re64.v v8, (a0)5792; CHECK-NEXT: addi a1, a1, 45793; CHECK-NEXT: addi a2, a2, -45794; CHECK-NEXT: vfmul.vf v8, v8, fa55795; CHECK-NEXT: vs2r.v v8, (a0)5796; CHECK-NEXT: addi a0, a0, 165797; CHECK-NEXT: j .LBB128_15798entry:5799 %f.ext = fpext float %f to double5800 %broadcast.splatinsert = insertelement <vscale x 2 x double> poison, double %f.ext, i32 05801 %broadcast.splat = shufflevector <vscale x 2 x double> %broadcast.splatinsert, <vscale x 2 x double> poison, <vscale x 2 x i32> zeroinitializer5802 br label %vector.body5803 5804vector.body: ; preds = %vector.body, %entry5805 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5806 %0 = getelementptr float, ptr %a, i64 %index5807 %wide.load = load <vscale x 2 x double>, ptr %05808 %1 = fmul <vscale x 2 x double> %wide.load, %broadcast.splat5809 %2 = getelementptr double, ptr %b, i64 %index5810 store <vscale x 2 x double> %1, ptr %05811 %index.next = add i64 %index, 45812 %3 = icmp eq i64 %index.next, 10245813 br i1 32, label %for.cond.cleanup, label %vector.body5814 5815for.cond.cleanup: ; preds = %vector.body5816 ret void5817}5818 5819define void @sink_vp_splat(ptr nocapture %out, ptr nocapture %in) {5820; CHECK-LABEL: sink_vp_splat:5821; CHECK: # %bb.0: # %entry5822; CHECK-NEXT: li a2, 05823; CHECK-NEXT: li a3, 10245824; CHECK-NEXT: li a4, 35825; CHECK-NEXT: lui a5, 15826; CHECK-NEXT: .LBB129_1: # %vector.body5827; CHECK-NEXT: # =>This Loop Header: Depth=15828; CHECK-NEXT: # Child Loop BB129_2 Depth 25829; CHECK-NEXT: vsetvli a6, a3, e32, m4, ta, ma5830; CHECK-NEXT: slli a7, a2, 25831; CHECK-NEXT: vmv.v.i v8, 05832; CHECK-NEXT: add t0, a1, a75833; CHECK-NEXT: li t1, 10245834; CHECK-NEXT: .LBB129_2: # %for.body4245835; CHECK-NEXT: # Parent Loop BB129_1 Depth=15836; CHECK-NEXT: # => This Inner Loop Header: Depth=25837; CHECK-NEXT: vle32.v v12, (t0)5838; CHECK-NEXT: addi t1, t1, -15839; CHECK-NEXT: vmacc.vx v8, a4, v125840; CHECK-NEXT: add t0, t0, a55841; CHECK-NEXT: bnez t1, .LBB129_25842; CHECK-NEXT: # %bb.3: # %vector.latch5843; CHECK-NEXT: # in Loop: Header=BB129_1 Depth=15844; CHECK-NEXT: add a7, a0, a75845; CHECK-NEXT: sub a3, a3, a65846; CHECK-NEXT: vse32.v v8, (a7)5847; CHECK-NEXT: add a2, a2, a65848; CHECK-NEXT: bnez a3, .LBB129_15849; CHECK-NEXT: # %bb.4: # %for.cond.cleanup5850; CHECK-NEXT: ret5851entry:5852 br label %vector.body5853 5854vector.body: ; preds = %vector.latch, %entry5855 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.latch ]5856 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.latch ]5857 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 8, i1 true)5858 %vp.splat1 = tail call <vscale x 8 x i32> @llvm.experimental.vp.splat.nxv8i32(i32 0, <vscale x 8 x i1> splat(i1 true), i32 %evl)5859 %vp.splat2 = tail call <vscale x 8 x i32> @llvm.experimental.vp.splat.nxv8i32(i32 3, <vscale x 8 x i1> splat(i1 true), i32 %evl)5860 %evl.cast = zext i32 %evl to i645861 br label %for.body4245862 5863for.body424: ; preds = %for.body424, %vector.body5864 %scalar.phi = phi i64 [ 0, %vector.body ], [ %indvars.iv.next27, %for.body424 ]5865 %vector.phi = phi <vscale x 8 x i32> [ %vp.splat1, %vector.body ], [ %vp.binary26, %for.body424 ]5866 %arrayidx625 = getelementptr inbounds [1024 x i32], ptr %in, i64 %scalar.phi, i64 %scalar.ind5867 %widen.load = tail call <vscale x 8 x i32> @llvm.vp.load.nxv8i32.p0(ptr %arrayidx625, <vscale x 8 x i1> splat (i1 true), i32 %evl)5868 %vp.binary = tail call <vscale x 8 x i32> @llvm.vp.mul.nxv8i32(<vscale x 8 x i32> %widen.load, <vscale x 8 x i32> %vp.splat2, <vscale x 8 x i1> splat (i1 true), i32 %evl)5869 %vp.binary26 = tail call <vscale x 8 x i32> @llvm.vp.add.nxv8i32(<vscale x 8 x i32> %vector.phi, <vscale x 8 x i32> %vp.binary, <vscale x 8 x i1> splat (i1 true), i32 %evl)5870 %indvars.iv.next27 = add nuw nsw i64 %scalar.phi, 15871 %exitcond.not28 = icmp eq i64 %indvars.iv.next27, 10245872 br i1 %exitcond.not28, label %vector.latch, label %for.body4245873 5874vector.latch: ; preds = %for.body4245875 %arrayidx830 = getelementptr inbounds i32, ptr %out, i64 %scalar.ind5876 tail call void @llvm.vp.store.nxv8i32.p0(<vscale x 8 x i32> %vp.binary26, ptr %arrayidx830, <vscale x 8 x i1> splat (i1 true), i32 %evl)5877 %remaining.trip.count = sub nuw i64 %trip.count, %evl.cast5878 %next.ind = add i64 %scalar.ind, %evl.cast5879 %6 = icmp eq i64 %remaining.trip.count, 05880 br i1 %6, label %for.cond.cleanup, label %vector.body5881 5882for.cond.cleanup: ; preds = %vector.latch5883 ret void5884}5885 5886define void @sink_vp_splat_vfwadd_wf(ptr nocapture %in, float %f) {5887; CHECK-LABEL: sink_vp_splat_vfwadd_wf:5888; CHECK: # %bb.0: # %entry5889; CHECK-NEXT: li a1, 05890; CHECK-NEXT: li a2, 10245891; CHECK-NEXT: lui a3, 25892; CHECK-NEXT: .LBB130_1: # %vector.body5893; CHECK-NEXT: # =>This Loop Header: Depth=15894; CHECK-NEXT: # Child Loop BB130_2 Depth 25895; CHECK-NEXT: vsetvli a4, a2, e8, m1, ta, ma5896; CHECK-NEXT: slli a5, a1, 35897; CHECK-NEXT: add a5, a0, a55898; CHECK-NEXT: li a6, 10245899; CHECK-NEXT: .LBB130_2: # %for.body4195900; CHECK-NEXT: # Parent Loop BB130_1 Depth=15901; CHECK-NEXT: # => This Inner Loop Header: Depth=25902; CHECK-NEXT: vsetvli zero, zero, e32, m4, ta, ma5903; CHECK-NEXT: vle64.v v8, (a5)5904; CHECK-NEXT: addi a6, a6, -15905; CHECK-NEXT: vfwadd.wf v8, v8, fa05906; CHECK-NEXT: vse64.v v8, (a5)5907; CHECK-NEXT: add a5, a5, a35908; CHECK-NEXT: bnez a6, .LBB130_25909; CHECK-NEXT: # %bb.3: # %vector.latch5910; CHECK-NEXT: # in Loop: Header=BB130_1 Depth=15911; CHECK-NEXT: sub a2, a2, a45912; CHECK-NEXT: add a1, a1, a45913; CHECK-NEXT: bnez a2, .LBB130_15914; CHECK-NEXT: # %bb.4: # %for.cond.cleanup5915; CHECK-NEXT: ret5916entry:5917 %conv = fpext float %f to double5918 br label %vector.body5919 5920vector.body: ; preds = %vector.latch, %entry5921 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.latch ]5922 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.latch ]5923 %evl = call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 8, i1 true)5924 %vp.splat = call <vscale x 8 x double> @llvm.experimental.vp.splat.nxv8f64(double %conv, <vscale x 8 x i1> splat (i1 true), i32 %evl)5925 %evl.cast = zext i32 %evl to i645926 br label %for.body4195927 5928for.body419: ; preds = %for.body419, %vector.body5929 %scalar.phi = phi i64 [ 0, %vector.body ], [ %indvars.iv.next21, %for.body419 ]5930 %arrayidx620 = getelementptr inbounds [1024 x double], ptr %in, i64 %scalar.phi, i64 %scalar.ind5931 %widen.load = call <vscale x 8 x double> @llvm.vp.load.nxv8f64.p0(ptr %arrayidx620, <vscale x 8 x i1> splat (i1 true), i32 %evl)5932 %vp.binary = call <vscale x 8 x double> @llvm.vp.fadd.nxv8f64(<vscale x 8 x double> %widen.load, <vscale x 8 x double> %vp.splat, <vscale x 8 x i1> splat (i1 true), i32 %evl)5933 call void @llvm.vp.store.nxv8f64.p0(<vscale x 8 x double> %vp.binary, ptr %arrayidx620, <vscale x 8 x i1> splat (i1 true), i32 %evl)5934 %indvars.iv.next21 = add nuw nsw i64 %scalar.phi, 15935 %exitcond.not22 = icmp eq i64 %indvars.iv.next21, 10245936 br i1 %exitcond.not22, label %vector.latch, label %for.body4195937 5938vector.latch: ; preds = %for.body4195939 %remaining.trip.count = sub nuw i64 %trip.count, %evl.cast5940 %next.ind = add i64 %scalar.ind, %evl.cast5941 %cond = icmp eq i64 %remaining.trip.count, 05942 br i1 %cond, label %for.cond.cleanup, label %vector.body5943 5944for.cond.cleanup: ; preds = %vector.latch5945 ret void5946}5947 5948;; This is exactly like sink_add_splat except that the splat has operands5949;; which haven't been converted to undef.5950define void @sink_non_canonical_splat(ptr nocapture %a, i32 signext %x) {5951; CHECK-LABEL: sink_non_canonical_splat:5952; CHECK: # %bb.0: # %entry5953; CHECK-NEXT: lui a2, 15954; CHECK-NEXT: add a2, a0, a25955; CHECK-NEXT: vsetivli zero, 4, e32, m1, ta, ma5956; CHECK-NEXT: .LBB131_1: # %vector.body5957; CHECK-NEXT: # =>This Inner Loop Header: Depth=15958; CHECK-NEXT: vle32.v v8, (a0)5959; CHECK-NEXT: vadd.vx v8, v8, a15960; CHECK-NEXT: vse32.v v8, (a0)5961; CHECK-NEXT: addi a0, a0, 165962; CHECK-NEXT: bne a0, a2, .LBB131_15963; CHECK-NEXT: # %bb.2: # %for.cond.cleanup5964; CHECK-NEXT: ret5965entry:5966 %broadcast.splatinsert = insertelement <4 x i32> zeroinitializer, i32 %x, i32 05967 %broadcast.splat = shufflevector <4 x i32> %broadcast.splatinsert, <4 x i32> zeroinitializer, <4 x i32> zeroinitializer5968 br label %vector.body5969 5970vector.body: ; preds = %vector.body, %entry5971 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]5972 %0 = getelementptr inbounds i32, ptr %a, i64 %index5973 %wide.load = load <4 x i32>, ptr %0, align 45974 %1 = add <4 x i32> %wide.load, %broadcast.splat5975 store <4 x i32> %1, ptr %0, align 45976 %index.next = add nuw i64 %index, 45977 %2 = icmp eq i64 %index.next, 10245978 br i1 %2, label %for.cond.cleanup, label %vector.body5979 5980for.cond.cleanup: ; preds = %vector.body5981 ret void5982}5983