194 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py2; RUN: llc < %s -mtriple=aarch64-none-linux-gnu -mattr=+sve | FileCheck %s3 4define i64 @select_or_reduce_v2i1(ptr nocapture noundef readonly %src) {5; CHECK-LABEL: select_or_reduce_v2i1:6; CHECK: // %bb.0: // %entry7; CHECK-NEXT: mov x8, xzr8; CHECK-NEXT: .LBB0_1: // %vector.body9; CHECK-NEXT: // =>This Inner Loop Header: Depth=110; CHECK-NEXT: ldr q0, [x0, x8]11; CHECK-NEXT: cmeq v0.2d, v0.2d, #012; CHECK-NEXT: umaxv s0, v0.4s13; CHECK-NEXT: fmov w9, s014; CHECK-NEXT: tbnz w9, #0, .LBB0_315; CHECK-NEXT: // %bb.2: // %vector.body16; CHECK-NEXT: // in Loop: Header=BB0_1 Depth=117; CHECK-NEXT: cmp x8, #1618; CHECK-NEXT: add x8, x8, #1619; CHECK-NEXT: b.ne .LBB0_120; CHECK-NEXT: .LBB0_3: // %middle.split21; CHECK-NEXT: and x0, x9, #0x122; CHECK-NEXT: ret23entry:24 br label %vector.body25 26vector.body:27 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]28 %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index29 %wide.load = load <2 x ptr>, ptr %arrayidx, align 830 %cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)31 %index.next = add nuw i64 %index, 232 %or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)33 %iv.cmp = icmp eq i64 %index.next, 434 %exit.cond = or i1 %or.reduc, %iv.cmp35 br i1 %exit.cond, label %middle.split, label %vector.body36 37middle.split:38 %sel = select i1 %or.reduc, i64 1, i64 039 ret i64 %sel40}41 42define i64 @br_or_reduce_v2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {43; CHECK-LABEL: br_or_reduce_v2i1:44; CHECK: // %bb.0: // %entry45; CHECK-NEXT: mov x8, xzr46; CHECK-NEXT: .LBB1_1: // %vector.body47; CHECK-NEXT: // =>This Inner Loop Header: Depth=148; CHECK-NEXT: ldr q0, [x0, x8]49; CHECK-NEXT: cmeq v0.2d, v0.2d, #050; CHECK-NEXT: umaxv s0, v0.4s51; CHECK-NEXT: fmov w9, s052; CHECK-NEXT: tbnz w9, #0, .LBB1_353; CHECK-NEXT: // %bb.2: // %vector.body54; CHECK-NEXT: // in Loop: Header=BB1_1 Depth=155; CHECK-NEXT: cmp x8, #1656; CHECK-NEXT: add x8, x8, #1657; CHECK-NEXT: b.ne .LBB1_158; CHECK-NEXT: .LBB1_3: // %middle.split59; CHECK-NEXT: tbz w9, #0, .LBB1_560; CHECK-NEXT: // %bb.4: // %found61; CHECK-NEXT: mov w8, #56 // =0x3862; CHECK-NEXT: mov w0, #1 // =0x163; CHECK-NEXT: str x8, [x1]64; CHECK-NEXT: ret65; CHECK-NEXT: .LBB1_5:66; CHECK-NEXT: mov x0, xzr67; CHECK-NEXT: ret68entry:69 br label %vector.body70 71vector.body:72 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]73 %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index74 %wide.load = load <2 x ptr>, ptr %arrayidx, align 875 %cond = icmp eq <2 x ptr> %wide.load, splat(ptr zeroinitializer)76 %index.next = add nuw i64 %index, 277 %or.reduc = tail call i1 @llvm.vector.reduce.or.v2i1(<2 x i1> %cond)78 %iv.cmp = icmp eq i64 %index.next, 479 %exit.cond = or i1 %or.reduc, %iv.cmp80 br i1 %exit.cond, label %middle.split, label %vector.body81 82middle.split:83 br i1 %or.reduc, label %found, label %notfound84 85found:86 store i64 56, ptr %p, align 887 ret i64 188 89notfound:90 ret i64 091}92 93define i64 @select_or_reduce_nxv2i1(ptr nocapture noundef readonly %src) {94; CHECK-LABEL: select_or_reduce_nxv2i1:95; CHECK: // %bb.0: // %entry96; CHECK-NEXT: cntd x897; CHECK-NEXT: ptrue p0.d98; CHECK-NEXT: mov x9, xzr99; CHECK-NEXT: neg x10, x8100; CHECK-NEXT: add x10, x10, #4101; CHECK-NEXT: .LBB2_1: // %vector.body102; CHECK-NEXT: // =>This Inner Loop Header: Depth=1103; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0, x9, lsl #3]104; CHECK-NEXT: cmpeq p1.d, p0/z, z0.d, #0105; CHECK-NEXT: b.ne .LBB2_3106; CHECK-NEXT: // %bb.2: // %vector.body107; CHECK-NEXT: // in Loop: Header=BB2_1 Depth=1108; CHECK-NEXT: cmp x10, x9109; CHECK-NEXT: add x9, x9, x8110; CHECK-NEXT: b.ne .LBB2_1111; CHECK-NEXT: .LBB2_3: // %middle.split112; CHECK-NEXT: ptest p0, p1.b113; CHECK-NEXT: cset w0, ne114; CHECK-NEXT: ret115entry:116 %vscale = tail call i64 @llvm.vscale.i64()117 %vf = shl nuw nsw i64 %vscale, 1118 br label %vector.body119 120vector.body:121 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]122 %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index123 %wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8124 %cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)125 %index.next = add nuw i64 %index, %vf126 %or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)127 %iv.cmp = icmp eq i64 %index.next, 4128 %exit.cond = or i1 %or.reduc, %iv.cmp129 br i1 %exit.cond, label %middle.split, label %vector.body130 131middle.split:132 %sel = select i1 %or.reduc, i64 1, i64 0133 ret i64 %sel134}135 136define i64 @br_or_reduce_nxv2i1(ptr nocapture noundef readonly %src, ptr noundef readnone %p) {137; CHECK-LABEL: br_or_reduce_nxv2i1:138; CHECK: // %bb.0: // %entry139; CHECK-NEXT: cntd x8140; CHECK-NEXT: ptrue p0.d141; CHECK-NEXT: mov x9, xzr142; CHECK-NEXT: neg x10, x8143; CHECK-NEXT: add x10, x10, #4144; CHECK-NEXT: .LBB3_1: // %vector.body145; CHECK-NEXT: // =>This Inner Loop Header: Depth=1146; CHECK-NEXT: ld1d { z0.d }, p0/z, [x0, x9, lsl #3]147; CHECK-NEXT: cmpeq p1.d, p0/z, z0.d, #0148; CHECK-NEXT: b.ne .LBB3_3149; CHECK-NEXT: // %bb.2: // %vector.body150; CHECK-NEXT: // in Loop: Header=BB3_1 Depth=1151; CHECK-NEXT: cmp x10, x9152; CHECK-NEXT: add x9, x9, x8153; CHECK-NEXT: b.ne .LBB3_1154; CHECK-NEXT: .LBB3_3: // %middle.split155; CHECK-NEXT: ptest p0, p1.b156; CHECK-NEXT: b.eq .LBB3_5157; CHECK-NEXT: // %bb.4: // %found158; CHECK-NEXT: mov w8, #56 // =0x38159; CHECK-NEXT: mov w0, #1 // =0x1160; CHECK-NEXT: str x8, [x1]161; CHECK-NEXT: ret162; CHECK-NEXT: .LBB3_5:163; CHECK-NEXT: mov x0, xzr164; CHECK-NEXT: ret165entry:166 %vscale = tail call i64 @llvm.vscale.i64()167 %vf = shl nuw nsw i64 %vscale, 1168 br label %vector.body169 170vector.body:171 %index = phi i64 [ 0, %entry ], [ %index.next, %vector.body ]172 %arrayidx = getelementptr inbounds ptr, ptr %src, i64 %index173 %wide.load = load <vscale x 2 x ptr>, ptr %arrayidx, align 8174 %cond = icmp eq <vscale x 2 x ptr> %wide.load, splat(ptr zeroinitializer)175 %index.next = add nuw i64 %index, %vf176 %or.reduc = tail call i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1> %cond)177 %iv.cmp = icmp eq i64 %index.next, 4178 %exit.cond = or i1 %or.reduc, %iv.cmp179 br i1 %exit.cond, label %middle.split, label %vector.body180 181middle.split:182 br i1 %or.reduc, label %found, label %notfound183 184found:185 store i64 56, ptr %p, align 8186 ret i64 1187 188notfound:189 ret i64 0190}191 192declare i1 @llvm.vector.reduce.or.v2i1(<2 x i1>)193declare i1 @llvm.vector.reduce.or.nxv2i1(<vscale x 2 x i1>)194