brintos

brintos / llvm-project-archived public Read only

0
0
Text · 6.5 KiB · f5df5ea Raw
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