498 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 42; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s3 4define float @reduce_fadd(ptr %f) {5; CHECK-LABEL: reduce_fadd:6; CHECK: # %bb.0: # %entry7; CHECK-NEXT: csrr a2, vlenb8; CHECK-NEXT: vsetvli a1, zero, e32, m1, ta, ma9; CHECK-NEXT: vmv.s.x v8, zero10; CHECK-NEXT: srli a1, a2, 111; CHECK-NEXT: slli a2, a2, 112; CHECK-NEXT: li a3, 102413; CHECK-NEXT: .LBB0_1: # %vector.body14; CHECK-NEXT: # =>This Inner Loop Header: Depth=115; CHECK-NEXT: vl2re32.v v10, (a0)16; CHECK-NEXT: sub a3, a3, a117; CHECK-NEXT: vsetvli a4, zero, e32, m2, ta, ma18; CHECK-NEXT: vfredosum.vs v8, v10, v819; CHECK-NEXT: add a0, a0, a220; CHECK-NEXT: bnez a3, .LBB0_121; CHECK-NEXT: # %bb.2: # %exit22; CHECK-NEXT: vfmv.f.s fa0, v823; CHECK-NEXT: ret24entry:25 %vscale = tail call i64 @llvm.vscale.i64()26 %vecsize = shl nuw nsw i64 %vscale, 227 br label %vector.body28 29vector.body:30 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]31 %vec.phi = phi float [ 0.000000e+00, %entry ], [ %acc, %vector.body ]32 %gep = getelementptr inbounds float, ptr %f, i64 %index33 %wide.load = load <vscale x 4 x float>, ptr %gep, align 434 %acc = tail call float @llvm.vector.reduce.fadd.nxv4f32(float %vec.phi, <vscale x 4 x float> %wide.load)35 %index.next = add nuw i64 %index, %vecsize36 %done = icmp eq i64 %index.next, 102437 br i1 %done, label %exit, label %vector.body38 39exit:40 ret float %acc41}42 43define i32 @vp_reduce_add(ptr %a) {44; CHECK-LABEL: vp_reduce_add:45; CHECK: # %bb.0: # %entry46; CHECK-NEXT: li a1, 047; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma48; CHECK-NEXT: vmv.s.x v8, zero49; CHECK-NEXT: li a2, 102450; CHECK-NEXT: .LBB1_1: # %vector.body51; CHECK-NEXT: # =>This Inner Loop Header: Depth=152; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma53; CHECK-NEXT: slli a4, a1, 254; CHECK-NEXT: add a4, a0, a455; CHECK-NEXT: vle32.v v10, (a4)56; CHECK-NEXT: sub a2, a2, a357; CHECK-NEXT: vredsum.vs v8, v10, v858; CHECK-NEXT: add a1, a1, a359; CHECK-NEXT: bnez a2, .LBB1_160; CHECK-NEXT: # %bb.2: # %for.cond.cleanup61; CHECK-NEXT: vmv.x.s a0, v862; CHECK-NEXT: ret63entry:64 br label %vector.body65 66vector.body: ; preds = %vector.body, %entry67 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]68 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]69 %red.phi = phi i32 [ 0, %entry ], [ %red, %vector.body ]70 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)71 %evl2 = zext i32 %evl to i6472 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind73 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)74 %red = tail call i32 @llvm.vp.reduce.add.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)75 %remaining.trip.count = sub nuw i64 %trip.count, %evl276 %next.ind = add i64 %scalar.ind, %evl277 %m = icmp eq i64 %remaining.trip.count, 078 br i1 %m, label %for.cond.cleanup, label %vector.body79 80for.cond.cleanup: ; preds = %vector.body81 ret i32 %red82}83 84define i32 @vp_reduce_and(ptr %a) {85; CHECK-LABEL: vp_reduce_and:86; CHECK: # %bb.0: # %entry87; CHECK-NEXT: li a1, 088; CHECK-NEXT: lui a2, 52428889; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma90; CHECK-NEXT: vmv.s.x v8, a291; CHECK-NEXT: li a2, 102492; CHECK-NEXT: .LBB2_1: # %vector.body93; CHECK-NEXT: # =>This Inner Loop Header: Depth=194; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma95; CHECK-NEXT: slli a4, a1, 296; CHECK-NEXT: add a4, a0, a497; CHECK-NEXT: vle32.v v10, (a4)98; CHECK-NEXT: sub a2, a2, a399; CHECK-NEXT: vredand.vs v8, v10, v8100; CHECK-NEXT: add a1, a1, a3101; CHECK-NEXT: bnez a2, .LBB2_1102; CHECK-NEXT: # %bb.2: # %for.cond.cleanup103; CHECK-NEXT: vmv.x.s a0, v8104; CHECK-NEXT: ret105entry:106 br label %vector.body107 108vector.body: ; preds = %vector.body, %entry109 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]110 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]111 %red.phi = phi i32 [ -2147483648, %entry ], [ %red, %vector.body ]112 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)113 %evl2 = zext i32 %evl to i64114 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind115 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)116 %red = tail call i32 @llvm.vp.reduce.and.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)117 %remaining.trip.count = sub nuw i64 %trip.count, %evl2118 %next.ind = add i64 %scalar.ind, %evl2119 %m = icmp eq i64 %remaining.trip.count, 0120 br i1 %m, label %for.cond.cleanup, label %vector.body121 122for.cond.cleanup: ; preds = %vector.body123 ret i32 %red124}125 126define i32 @vp_reduce_or(ptr %a) {127; CHECK-LABEL: vp_reduce_or:128; CHECK: # %bb.0: # %entry129; CHECK-NEXT: li a1, 0130; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma131; CHECK-NEXT: vmv.s.x v8, zero132; CHECK-NEXT: li a2, 1024133; CHECK-NEXT: .LBB3_1: # %vector.body134; CHECK-NEXT: # =>This Inner Loop Header: Depth=1135; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma136; CHECK-NEXT: slli a4, a1, 2137; CHECK-NEXT: add a4, a0, a4138; CHECK-NEXT: vle32.v v10, (a4)139; CHECK-NEXT: sub a2, a2, a3140; CHECK-NEXT: vredor.vs v8, v10, v8141; CHECK-NEXT: add a1, a1, a3142; CHECK-NEXT: bnez a2, .LBB3_1143; CHECK-NEXT: # %bb.2: # %for.cond.cleanup144; CHECK-NEXT: vmv.x.s a0, v8145; CHECK-NEXT: ret146entry:147 br label %vector.body148 149vector.body: ; preds = %vector.body, %entry150 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]151 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]152 %red.phi = phi i32 [ 0, %entry ], [ %red, %vector.body ]153 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)154 %evl2 = zext i32 %evl to i64155 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind156 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)157 %red = tail call i32 @llvm.vp.reduce.or.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)158 %remaining.trip.count = sub nuw i64 %trip.count, %evl2159 %next.ind = add i64 %scalar.ind, %evl2160 %m = icmp eq i64 %remaining.trip.count, 0161 br i1 %m, label %for.cond.cleanup, label %vector.body162 163for.cond.cleanup: ; preds = %vector.body164 ret i32 %red165}166 167define i32 @vp_reduce_xor(ptr %a) {168; CHECK-LABEL: vp_reduce_xor:169; CHECK: # %bb.0: # %entry170; CHECK-NEXT: li a1, 0171; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma172; CHECK-NEXT: vmv.s.x v8, zero173; CHECK-NEXT: li a2, 1024174; CHECK-NEXT: .LBB4_1: # %vector.body175; CHECK-NEXT: # =>This Inner Loop Header: Depth=1176; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma177; CHECK-NEXT: slli a4, a1, 2178; CHECK-NEXT: add a4, a0, a4179; CHECK-NEXT: vle32.v v10, (a4)180; CHECK-NEXT: sub a2, a2, a3181; CHECK-NEXT: vredxor.vs v8, v10, v8182; CHECK-NEXT: add a1, a1, a3183; CHECK-NEXT: bnez a2, .LBB4_1184; CHECK-NEXT: # %bb.2: # %for.cond.cleanup185; CHECK-NEXT: vmv.x.s a0, v8186; CHECK-NEXT: ret187entry:188 br label %vector.body189 190vector.body: ; preds = %vector.body, %entry191 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]192 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]193 %red.phi = phi i32 [ 0, %entry ], [ %red, %vector.body ]194 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)195 %evl2 = zext i32 %evl to i64196 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind197 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)198 %red = tail call i32 @llvm.vp.reduce.xor.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)199 %remaining.trip.count = sub nuw i64 %trip.count, %evl2200 %next.ind = add i64 %scalar.ind, %evl2201 %m = icmp eq i64 %remaining.trip.count, 0202 br i1 %m, label %for.cond.cleanup, label %vector.body203 204for.cond.cleanup: ; preds = %vector.body205 ret i32 %red206}207 208define i32 @vp_reduce_smax(ptr %a) {209; CHECK-LABEL: vp_reduce_smax:210; CHECK: # %bb.0: # %entry211; CHECK-NEXT: li a1, 0212; CHECK-NEXT: lui a2, 524288213; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma214; CHECK-NEXT: vmv.s.x v8, a2215; CHECK-NEXT: li a2, 1024216; CHECK-NEXT: .LBB5_1: # %vector.body217; CHECK-NEXT: # =>This Inner Loop Header: Depth=1218; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma219; CHECK-NEXT: slli a4, a1, 2220; CHECK-NEXT: add a4, a0, a4221; CHECK-NEXT: vle32.v v10, (a4)222; CHECK-NEXT: sub a2, a2, a3223; CHECK-NEXT: vredmax.vs v8, v10, v8224; CHECK-NEXT: add a1, a1, a3225; CHECK-NEXT: bnez a2, .LBB5_1226; CHECK-NEXT: # %bb.2: # %for.cond.cleanup227; CHECK-NEXT: vmv.x.s a0, v8228; CHECK-NEXT: ret229entry:230 br label %vector.body231 232vector.body: ; preds = %vector.body, %entry233 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]234 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]235 %red.phi = phi i32 [ -2147483648, %entry ], [ %red, %vector.body ]236 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)237 %evl2 = zext i32 %evl to i64238 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind239 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)240 %red = tail call i32 @llvm.vp.reduce.smax.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)241 %remaining.trip.count = sub nuw i64 %trip.count, %evl2242 %next.ind = add i64 %scalar.ind, %evl2243 %m = icmp eq i64 %remaining.trip.count, 0244 br i1 %m, label %for.cond.cleanup, label %vector.body245 246for.cond.cleanup: ; preds = %vector.body247 ret i32 %red248}249 250define i32 @vp_reduce_smin(ptr %a) {251; CHECK-LABEL: vp_reduce_smin:252; CHECK: # %bb.0: # %entry253; CHECK-NEXT: li a1, 0254; CHECK-NEXT: lui a2, 524288255; CHECK-NEXT: addi a2, a2, -1256; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma257; CHECK-NEXT: vmv.s.x v8, a2258; CHECK-NEXT: li a2, 1024259; CHECK-NEXT: .LBB6_1: # %vector.body260; CHECK-NEXT: # =>This Inner Loop Header: Depth=1261; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma262; CHECK-NEXT: slli a4, a1, 2263; CHECK-NEXT: add a4, a0, a4264; CHECK-NEXT: vle32.v v10, (a4)265; CHECK-NEXT: sub a2, a2, a3266; CHECK-NEXT: vredmin.vs v8, v10, v8267; CHECK-NEXT: add a1, a1, a3268; CHECK-NEXT: bnez a2, .LBB6_1269; CHECK-NEXT: # %bb.2: # %for.cond.cleanup270; CHECK-NEXT: vmv.x.s a0, v8271; CHECK-NEXT: ret272entry:273 br label %vector.body274 275vector.body: ; preds = %vector.body, %entry276 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]277 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]278 %red.phi = phi i32 [ 2147483647, %entry ], [ %red, %vector.body ]279 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)280 %evl2 = zext i32 %evl to i64281 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind282 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)283 %red = tail call i32 @llvm.vp.reduce.smin.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)284 %remaining.trip.count = sub nuw i64 %trip.count, %evl2285 %next.ind = add i64 %scalar.ind, %evl2286 %m = icmp eq i64 %remaining.trip.count, 0287 br i1 %m, label %for.cond.cleanup, label %vector.body288 289for.cond.cleanup: ; preds = %vector.body290 ret i32 %red291}292 293define i32 @vp_reduce_umax(ptr %a) {294; CHECK-LABEL: vp_reduce_umax:295; CHECK: # %bb.0: # %entry296; CHECK-NEXT: li a1, 0297; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma298; CHECK-NEXT: vmv.s.x v8, zero299; CHECK-NEXT: li a2, 1024300; CHECK-NEXT: .LBB7_1: # %vector.body301; CHECK-NEXT: # =>This Inner Loop Header: Depth=1302; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma303; CHECK-NEXT: slli a4, a1, 2304; CHECK-NEXT: add a4, a0, a4305; CHECK-NEXT: vle32.v v10, (a4)306; CHECK-NEXT: sub a2, a2, a3307; CHECK-NEXT: vredmaxu.vs v8, v10, v8308; CHECK-NEXT: add a1, a1, a3309; CHECK-NEXT: bnez a2, .LBB7_1310; CHECK-NEXT: # %bb.2: # %for.cond.cleanup311; CHECK-NEXT: vmv.x.s a0, v8312; CHECK-NEXT: ret313entry:314 br label %vector.body315 316vector.body: ; preds = %vector.body, %entry317 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]318 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]319 %red.phi = phi i32 [ 0, %entry ], [ %red, %vector.body ]320 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)321 %evl2 = zext i32 %evl to i64322 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind323 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)324 %red = tail call i32 @llvm.vp.reduce.umax.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)325 %remaining.trip.count = sub nuw i64 %trip.count, %evl2326 %next.ind = add i64 %scalar.ind, %evl2327 %m = icmp eq i64 %remaining.trip.count, 0328 br i1 %m, label %for.cond.cleanup, label %vector.body329 330for.cond.cleanup: ; preds = %vector.body331 ret i32 %red332}333 334define i32 @vp_reduce_umin(ptr %a) {335; CHECK-LABEL: vp_reduce_umin:336; CHECK: # %bb.0: # %entry337; CHECK-NEXT: li a1, 0338; CHECK-NEXT: lui a2, 524288339; CHECK-NEXT: vsetvli a3, zero, e32, m1, ta, ma340; CHECK-NEXT: vmv.s.x v8, a2341; CHECK-NEXT: li a2, 1024342; CHECK-NEXT: .LBB8_1: # %vector.body343; CHECK-NEXT: # =>This Inner Loop Header: Depth=1344; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma345; CHECK-NEXT: slli a4, a1, 2346; CHECK-NEXT: add a4, a0, a4347; CHECK-NEXT: vle32.v v10, (a4)348; CHECK-NEXT: sub a2, a2, a3349; CHECK-NEXT: vredminu.vs v8, v10, v8350; CHECK-NEXT: add a1, a1, a3351; CHECK-NEXT: bnez a2, .LBB8_1352; CHECK-NEXT: # %bb.2: # %for.cond.cleanup353; CHECK-NEXT: vmv.x.s a0, v8354; CHECK-NEXT: ret355entry:356 br label %vector.body357 358vector.body: ; preds = %vector.body, %entry359 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]360 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]361 %red.phi = phi i32 [ -2147483648, %entry ], [ %red, %vector.body ]362 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)363 %evl2 = zext i32 %evl to i64364 %arrayidx6 = getelementptr inbounds i32, ptr %a, i64 %scalar.ind365 %wide.load = tail call <vscale x 4 x i32> @llvm.vp.load.nxv4i32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)366 %red = tail call i32 @llvm.vp.reduce.umin.nxv4i32(i32 %red.phi, <vscale x 4 x i32> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)367 %remaining.trip.count = sub nuw i64 %trip.count, %evl2368 %next.ind = add i64 %scalar.ind, %evl2369 %m = icmp eq i64 %remaining.trip.count, 0370 br i1 %m, label %for.cond.cleanup, label %vector.body371 372for.cond.cleanup: ; preds = %vector.body373 ret i32 %red374}375 376define float @vp_reduce_fadd(ptr %a) {377; CHECK-LABEL: vp_reduce_fadd:378; CHECK: # %bb.0: # %entry379; CHECK-NEXT: li a1, 0380; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma381; CHECK-NEXT: vmv.s.x v8, zero382; CHECK-NEXT: li a2, 1024383; CHECK-NEXT: .LBB9_1: # %vector.body384; CHECK-NEXT: # =>This Inner Loop Header: Depth=1385; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma386; CHECK-NEXT: slli a4, a1, 2387; CHECK-NEXT: add a4, a0, a4388; CHECK-NEXT: vle32.v v10, (a4)389; CHECK-NEXT: sub a2, a2, a3390; CHECK-NEXT: vfredosum.vs v8, v10, v8391; CHECK-NEXT: add a1, a1, a3392; CHECK-NEXT: bnez a2, .LBB9_1393; CHECK-NEXT: # %bb.2: # %for.cond.cleanup394; CHECK-NEXT: vfmv.f.s fa0, v8395; CHECK-NEXT: ret396entry:397 br label %vector.body398 399vector.body: ; preds = %vector.body, %entry400 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]401 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]402 %red.phi = phi float [ 0.000000e+00, %entry ], [ %red, %vector.body ]403 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)404 %evl2 = zext i32 %evl to i64405 %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %scalar.ind406 %wide.load = tail call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)407 %red = tail call float @llvm.vp.reduce.fadd.nxv4f32(float %red.phi, <vscale x 4 x float> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)408 %remaining.trip.count = sub nuw i64 %trip.count, %evl2409 %next.ind = add i64 %scalar.ind, %evl2410 %m = icmp eq i64 %remaining.trip.count, 0411 br i1 %m, label %for.cond.cleanup, label %vector.body412 413for.cond.cleanup: ; preds = %vector.body414 ret float %red415}416 417define float @vp_reduce_fmax(ptr %a) {418; CHECK-LABEL: vp_reduce_fmax:419; CHECK: # %bb.0: # %entry420; CHECK-NEXT: li a1, 0421; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma422; CHECK-NEXT: vmv.s.x v8, zero423; CHECK-NEXT: li a2, 1024424; CHECK-NEXT: .LBB10_1: # %vector.body425; CHECK-NEXT: # =>This Inner Loop Header: Depth=1426; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma427; CHECK-NEXT: slli a4, a1, 2428; CHECK-NEXT: add a4, a0, a4429; CHECK-NEXT: vle32.v v10, (a4)430; CHECK-NEXT: sub a2, a2, a3431; CHECK-NEXT: vfredmax.vs v8, v10, v8432; CHECK-NEXT: add a1, a1, a3433; CHECK-NEXT: bnez a2, .LBB10_1434; CHECK-NEXT: # %bb.2: # %for.cond.cleanup435; CHECK-NEXT: vfmv.f.s fa0, v8436; CHECK-NEXT: ret437entry:438 br label %vector.body439 440vector.body: ; preds = %vector.body, %entry441 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]442 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]443 %red.phi = phi float [ 0.000000e+00, %entry ], [ %red, %vector.body ]444 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)445 %evl2 = zext i32 %evl to i64446 %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %scalar.ind447 %wide.load = tail call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)448 %red = tail call float @llvm.vp.reduce.fmax.nxv4f32(float %red.phi, <vscale x 4 x float> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)449 %remaining.trip.count = sub nuw i64 %trip.count, %evl2450 %next.ind = add i64 %scalar.ind, %evl2451 %m = icmp eq i64 %remaining.trip.count, 0452 br i1 %m, label %for.cond.cleanup, label %vector.body453 454for.cond.cleanup: ; preds = %vector.body455 ret float %red456}457 458define float @vp_reduce_fmin(ptr %a) {459; CHECK-LABEL: vp_reduce_fmin:460; CHECK: # %bb.0: # %entry461; CHECK-NEXT: li a1, 0462; CHECK-NEXT: vsetvli a2, zero, e32, m1, ta, ma463; CHECK-NEXT: vmv.s.x v8, zero464; CHECK-NEXT: li a2, 1024465; CHECK-NEXT: .LBB11_1: # %vector.body466; CHECK-NEXT: # =>This Inner Loop Header: Depth=1467; CHECK-NEXT: vsetvli a3, a2, e32, m2, ta, ma468; CHECK-NEXT: slli a4, a1, 2469; CHECK-NEXT: add a4, a0, a4470; CHECK-NEXT: vle32.v v10, (a4)471; CHECK-NEXT: sub a2, a2, a3472; CHECK-NEXT: vfredmin.vs v8, v10, v8473; CHECK-NEXT: add a1, a1, a3474; CHECK-NEXT: bnez a2, .LBB11_1475; CHECK-NEXT: # %bb.2: # %for.cond.cleanup476; CHECK-NEXT: vfmv.f.s fa0, v8477; CHECK-NEXT: ret478entry:479 br label %vector.body480 481vector.body: ; preds = %vector.body, %entry482 %trip.count = phi i64 [ 1024, %entry ], [ %remaining.trip.count, %vector.body ]483 %scalar.ind = phi i64 [ 0, %entry ], [ %next.ind, %vector.body ]484 %red.phi = phi float [ 0.000000e+00, %entry ], [ %red, %vector.body ]485 %evl = tail call i32 @llvm.experimental.get.vector.length.i64(i64 %trip.count, i32 4, i1 true)486 %evl2 = zext i32 %evl to i64487 %arrayidx6 = getelementptr inbounds float, ptr %a, i64 %scalar.ind488 %wide.load = tail call <vscale x 4 x float> @llvm.vp.load.nxv4f32.p0(ptr %arrayidx6, <vscale x 4 x i1> splat (i1 true), i32 %evl)489 %red = tail call float @llvm.vp.reduce.fmin.nxv4f32(float %red.phi, <vscale x 4 x float> %wide.load, <vscale x 4 x i1> splat (i1 true), i32 %evl)490 %remaining.trip.count = sub nuw i64 %trip.count, %evl2491 %next.ind = add i64 %scalar.ind, %evl2492 %m = icmp eq i64 %remaining.trip.count, 0493 br i1 %m, label %for.cond.cleanup, label %vector.body494 495for.cond.cleanup: ; preds = %vector.body496 ret float %red497}498