199 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc < %s -mtriple=riscv32 -mattr=+v | FileCheck %s --check-prefixes=CHECK,RV323; RUN: llc < %s -mtriple=riscv64 -mattr=+v | FileCheck %s --check-prefixes=CHECK,RV644 5define dso_local void @test_store1(ptr nocapture noundef writeonly %dst, ptr nocapture noundef readonly %src, i32 noundef signext %c, i32 noundef signext %n) {6; RV32-LABEL: test_store1:7; RV32: # %bb.0: # %entry8; RV32-NEXT: blez a3, .LBB0_69; RV32-NEXT: # %bb.1: # %for.body.preheader10; RV32-NEXT: li a4, 811; RV32-NEXT: bltu a3, a4, .LBB0_712; RV32-NEXT: # %bb.2: # %for.body.preheader13; RV32-NEXT: sub a4, a0, a114; RV32-NEXT: sltu a5, a0, a115; RV32-NEXT: neg a5, a516; RV32-NEXT: sltiu a4, a4, 3217; RV32-NEXT: seqz a5, a518; RV32-NEXT: and a4, a5, a419; RV32-NEXT: bnez a4, .LBB0_720; RV32-NEXT: # %bb.3: # %vector.ph21; RV32-NEXT: lui a5, 52428822; RV32-NEXT: addi a5, a5, -823; RV32-NEXT: and a5, a3, a524; RV32-NEXT: li a7, 025; RV32-NEXT: li a6, 026; RV32-NEXT: .LBB0_4: # %vector.body27; RV32-NEXT: # =>This Inner Loop Header: Depth=128; RV32-NEXT: slli t0, a7, 229; RV32-NEXT: addi t1, a7, 830; RV32-NEXT: add t0, a1, t031; RV32-NEXT: vsetivli zero, 8, e32, m2, ta, ma32; RV32-NEXT: vle32.v v8, (t0)33; RV32-NEXT: sltu a7, t1, a734; RV32-NEXT: xor t0, t1, a535; RV32-NEXT: add a6, a6, a736; RV32-NEXT: vmslt.vx v12, v8, a237; RV32-NEXT: vcompress.vm v10, v8, v1238; RV32-NEXT: vcpop.m a7, v1239; RV32-NEXT: vsetvli zero, a7, e32, m2, ta, ma40; RV32-NEXT: vse32.v v10, (a0)41; RV32-NEXT: slli a7, a7, 242; RV32-NEXT: or t0, t0, a643; RV32-NEXT: add a0, a0, a744; RV32-NEXT: mv a7, t145; RV32-NEXT: bnez t0, .LBB0_446; RV32-NEXT: # %bb.5: # %middle.block47; RV32-NEXT: bne a5, a3, .LBB0_948; RV32-NEXT: .LBB0_6: # %for.cond.cleanup49; RV32-NEXT: ret50; RV32-NEXT: .LBB0_7:51; RV32-NEXT: li a5, 052; RV32-NEXT: li a4, 053; RV32-NEXT: j .LBB0_954; RV32-NEXT: .LBB0_8: # %for.inc55; RV32-NEXT: # in Loop: Header=BB0_9 Depth=156; RV32-NEXT: addi a5, a5, 157; RV32-NEXT: seqz a6, a558; RV32-NEXT: add a4, a4, a659; RV32-NEXT: xor a6, a5, a360; RV32-NEXT: or a6, a6, a461; RV32-NEXT: beqz a6, .LBB0_662; RV32-NEXT: .LBB0_9: # %for.body63; RV32-NEXT: # =>This Inner Loop Header: Depth=164; RV32-NEXT: slli a6, a5, 265; RV32-NEXT: add a6, a1, a666; RV32-NEXT: lw a6, 0(a6)67; RV32-NEXT: bge a6, a2, .LBB0_868; RV32-NEXT: # %bb.10: # %if.then69; RV32-NEXT: # in Loop: Header=BB0_9 Depth=170; RV32-NEXT: addi a7, a0, 471; RV32-NEXT: sw a6, 0(a0)72; RV32-NEXT: mv a0, a773; RV32-NEXT: j .LBB0_874;75; RV64-LABEL: test_store1:76; RV64: # %bb.0: # %entry77; RV64-NEXT: blez a3, .LBB0_678; RV64-NEXT: # %bb.1: # %for.body.preheader79; RV64-NEXT: li a5, 880; RV64-NEXT: li a4, 081; RV64-NEXT: bltu a3, a5, .LBB0_782; RV64-NEXT: # %bb.2: # %for.body.preheader83; RV64-NEXT: sub a5, a0, a184; RV64-NEXT: li a6, 3185; RV64-NEXT: bgeu a6, a5, .LBB0_786; RV64-NEXT: # %bb.3: # %vector.ph87; RV64-NEXT: lui a4, 52428888; RV64-NEXT: addiw a4, a4, -889; RV64-NEXT: and a4, a3, a490; RV64-NEXT: slli a5, a4, 291; RV64-NEXT: add a5, a5, a192; RV64-NEXT: mv a6, a193; RV64-NEXT: .LBB0_4: # %vector.body94; RV64-NEXT: # =>This Inner Loop Header: Depth=195; RV64-NEXT: vsetivli zero, 8, e32, m2, ta, ma96; RV64-NEXT: vle32.v v8, (a6)97; RV64-NEXT: addi a6, a6, 3298; RV64-NEXT: vmslt.vx v12, v8, a299; RV64-NEXT: vcompress.vm v10, v8, v12100; RV64-NEXT: vcpop.m a7, v12101; RV64-NEXT: vsetvli zero, a7, e32, m2, ta, ma102; RV64-NEXT: vse32.v v10, (a0)103; RV64-NEXT: slli a7, a7, 2104; RV64-NEXT: add a0, a0, a7105; RV64-NEXT: bne a6, a5, .LBB0_4106; RV64-NEXT: # %bb.5: # %middle.block107; RV64-NEXT: bne a4, a3, .LBB0_7108; RV64-NEXT: .LBB0_6: # %for.cond.cleanup109; RV64-NEXT: ret110; RV64-NEXT: .LBB0_7: # %for.body.preheader13111; RV64-NEXT: slli a4, a4, 2112; RV64-NEXT: slli a5, a3, 2113; RV64-NEXT: add a3, a1, a4114; RV64-NEXT: add a1, a1, a5115; RV64-NEXT: j .LBB0_9116; RV64-NEXT: .LBB0_8: # %for.inc117; RV64-NEXT: # in Loop: Header=BB0_9 Depth=1118; RV64-NEXT: addi a3, a3, 4119; RV64-NEXT: beq a3, a1, .LBB0_6120; RV64-NEXT: .LBB0_9: # %for.body121; RV64-NEXT: # =>This Inner Loop Header: Depth=1122; RV64-NEXT: lw a4, 0(a3)123; RV64-NEXT: bge a4, a2, .LBB0_8124; RV64-NEXT: # %bb.10: # %if.then125; RV64-NEXT: # in Loop: Header=BB0_9 Depth=1126; RV64-NEXT: addi a5, a0, 4127; RV64-NEXT: sw a4, 0(a0)128; RV64-NEXT: mv a0, a5129; RV64-NEXT: j .LBB0_8130entry:131 %cmp8 = icmp sgt i32 %n, 0132 br i1 %cmp8, label %for.body.preheader, label %for.cond.cleanup133 134for.body.preheader: ; preds = %entry135 %dst11 = ptrtoint ptr %dst to i64136 %src12 = ptrtoint ptr %src to i64137 %wide.trip.count = zext nneg i32 %n to i64138 %min.iters.check = icmp ult i32 %n, 8139 %0 = sub i64 %dst11, %src12140 %diff.check = icmp ult i64 %0, 32141 %or.cond = or i1 %min.iters.check, %diff.check142 br i1 %or.cond, label %for.body.preheader13, label %vector.ph143 144for.body.preheader13: ; preds = %middle.block, %for.body.preheader145 %indvars.iv.ph = phi i64 [ 0, %for.body.preheader ], [ %n.vec, %middle.block ]146 %dst.addr.09.ph = phi ptr [ %dst, %for.body.preheader ], [ %monotonic.add, %middle.block ]147 br label %for.body148 149vector.ph: ; preds = %for.body.preheader150 %n.vec = and i64 %wide.trip.count, 2147483640151 %broadcast.splatinsert = insertelement <8 x i32> poison, i32 %c, i64 0152 %broadcast.splat = shufflevector <8 x i32> %broadcast.splatinsert, <8 x i32> poison, <8 x i32> zeroinitializer153 br label %vector.body154 155vector.body: ; preds = %vector.body, %vector.ph156 %index = phi i64 [ 0, %vector.ph ], [ %index.next, %vector.body ]157 %monotonic.iv = phi ptr [ %dst, %vector.ph ], [ %monotonic.add, %vector.body ]158 %1 = getelementptr inbounds i32, ptr %src, i64 %index159 %wide.load = load <8 x i32>, ptr %1, align 4160 %2 = icmp slt <8 x i32> %wide.load, %broadcast.splat161 tail call void @llvm.masked.compressstore.v8i32(<8 x i32> %wide.load, ptr align 4 %monotonic.iv, <8 x i1> %2)162 %3 = bitcast <8 x i1> %2 to i8163 %4 = tail call range(i8 0, 9) i8 @llvm.ctpop.i8(i8 %3)164 %5 = shl nuw nsw i8 %4, 2165 %6 = zext nneg i8 %5 to i64166 %monotonic.add = getelementptr inbounds i8, ptr %monotonic.iv, i64 %6167 %index.next = add nuw i64 %index, 8168 %7 = icmp eq i64 %index.next, %n.vec169 br i1 %7, label %middle.block, label %vector.body170 171middle.block: ; preds = %vector.body172 %cmp.n = icmp eq i64 %n.vec, %wide.trip.count173 br i1 %cmp.n, label %for.cond.cleanup, label %for.body.preheader13174 175for.cond.cleanup: ; preds = %for.inc, %middle.block, %entry176 ret void177 178for.body: ; preds = %for.body.preheader13, %for.inc179 %indvars.iv = phi i64 [ %indvars.iv.next, %for.inc ], [ %indvars.iv.ph, %for.body.preheader13 ]180 %dst.addr.09 = phi ptr [ %dst.addr.1, %for.inc ], [ %dst.addr.09.ph, %for.body.preheader13 ]181 %arrayidx = getelementptr inbounds i32, ptr %src, i64 %indvars.iv182 %8 = load i32, ptr %arrayidx, align 4183 %cmp1 = icmp slt i32 %8, %c184 br i1 %cmp1, label %if.then, label %for.inc185 186if.then: ; preds = %for.body187 %incdec.ptr = getelementptr inbounds i8, ptr %dst.addr.09, i64 4188 store i32 %8, ptr %dst.addr.09, align 4189 br label %for.inc190 191for.inc: ; preds = %for.body, %if.then192 %dst.addr.1 = phi ptr [ %incdec.ptr, %if.then ], [ %dst.addr.09, %for.body ]193 %indvars.iv.next = add nuw nsw i64 %indvars.iv, 1194 %exitcond.not = icmp eq i64 %indvars.iv.next, %wide.trip.count195 br i1 %exitcond.not, label %for.cond.cleanup, label %for.body196}197;; NOTE: These prefixes are unused and the list is autogenerated. Do not add tests below this line:198; CHECK: {{.*}}199