brintos

brintos / llvm-project-archived public Read only

0
0
Text · 7.9 KiB · 7c34475 Raw
178 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_llc_test_checks.py UTC_ARGS: --version 52; RUN: llc -mtriple=riscv64 -mattr=+v < %s | FileCheck %s3 4; Testing VFIRST patterns related to llvm/test/Transforms/LoopIdiom/RISCV/byte-compare-index.ll5 6define i32 @compare_bytes_simple(ptr %a, ptr %b, i32 signext %len, i32 signext %n) {7; CHECK-LABEL: compare_bytes_simple:8; CHECK:       # %bb.0: # %entry9; CHECK-NEXT:    addiw a5, a2, 110; CHECK-NEXT:    bltu a3, a5, .LBB0_711; CHECK-NEXT:  # %bb.1: # %mismatch_mem_check12; CHECK-NEXT:    slli a2, a5, 3213; CHECK-NEXT:    slli a4, a3, 3214; CHECK-NEXT:    srli a2, a2, 3215; CHECK-NEXT:    srli a4, a4, 3216; CHECK-NEXT:    add a6, a0, a217; CHECK-NEXT:    add a7, a0, a418; CHECK-NEXT:    srli a6, a6, 1219; CHECK-NEXT:    srli a7, a7, 1220; CHECK-NEXT:    bne a6, a7, .LBB0_721; CHECK-NEXT:  # %bb.2: # %mismatch_mem_check22; CHECK-NEXT:    add a6, a1, a223; CHECK-NEXT:    add a7, a1, a424; CHECK-NEXT:    srli a6, a6, 1225; CHECK-NEXT:    srli a7, a7, 1226; CHECK-NEXT:    bne a6, a7, .LBB0_727; CHECK-NEXT:  .LBB0_3: # %mismatch_vec_loop28; CHECK-NEXT:    # =>This Inner Loop Header: Depth=129; CHECK-NEXT:    sub a5, a4, a230; CHECK-NEXT:    add a6, a0, a231; CHECK-NEXT:    add a7, a1, a232; CHECK-NEXT:    vsetvli a5, a5, e8, m2, ta, ma33; CHECK-NEXT:    vle8.v v8, (a6)34; CHECK-NEXT:    vle8.v v10, (a7)35; CHECK-NEXT:    vmsne.vv v12, v8, v1036; CHECK-NEXT:    vfirst.m a7, v1237; CHECK-NEXT:    mv a6, a538; CHECK-NEXT:    bltz a7, .LBB0_539; CHECK-NEXT:  # %bb.4: # %mismatch_vec_loop40; CHECK-NEXT:    # in Loop: Header=BB0_3 Depth=141; CHECK-NEXT:    mv a6, a742; CHECK-NEXT:  .LBB0_5: # %mismatch_vec_loop43; CHECK-NEXT:    # in Loop: Header=BB0_3 Depth=144; CHECK-NEXT:    sext.w a7, a645; CHECK-NEXT:    bne a7, a5, .LBB0_1146; CHECK-NEXT:  # %bb.6: # %mismatch_vec_loop_inc47; CHECK-NEXT:    # in Loop: Header=BB0_3 Depth=148; CHECK-NEXT:    add a2, a2, a549; CHECK-NEXT:    bne a2, a4, .LBB0_350; CHECK-NEXT:    j .LBB0_951; CHECK-NEXT:  .LBB0_7: # %mismatch_loop52; CHECK-NEXT:    # =>This Inner Loop Header: Depth=153; CHECK-NEXT:    slli a2, a5, 3254; CHECK-NEXT:    srli a2, a2, 3255; CHECK-NEXT:    add a4, a0, a256; CHECK-NEXT:    add a2, a1, a257; CHECK-NEXT:    lbu a4, 0(a4)58; CHECK-NEXT:    lbu a2, 0(a2)59; CHECK-NEXT:    bne a4, a2, .LBB0_1060; CHECK-NEXT:  # %bb.8: # %mismatch_loop_inc61; CHECK-NEXT:    # in Loop: Header=BB0_7 Depth=162; CHECK-NEXT:    addiw a5, a5, 163; CHECK-NEXT:    bne a3, a5, .LBB0_764; CHECK-NEXT:  .LBB0_9: # %while.end65; CHECK-NEXT:    mv a0, a366; CHECK-NEXT:    ret67; CHECK-NEXT:  .LBB0_10:68; CHECK-NEXT:    mv a0, a569; CHECK-NEXT:    ret70; CHECK-NEXT:  .LBB0_11: # %mismatch_vec_loop_found71; CHECK-NEXT:    slli a6, a6, 3272; CHECK-NEXT:    srli a3, a6, 3273; CHECK-NEXT:    add a0, a2, a374; CHECK-NEXT:    ret75entry:76  %0 = add i32 %len, 177  br label %mismatch_min_it_check78 79mismatch_min_it_check:                            ; preds = %entry80  %1 = zext i32 %0 to i6481  %2 = zext i32 %n to i6482  %3 = icmp ule i32 %0, %n83  br i1 %3, label %mismatch_mem_check, label %mismatch_loop_pre84 85mismatch_mem_check:                               ; preds = %mismatch_min_it_check86  %4 = getelementptr i8, ptr %a, i64 %187  %5 = getelementptr i8, ptr %b, i64 %188  %6 = ptrtoint ptr %5 to i6489  %7 = ptrtoint ptr %4 to i6490  %8 = getelementptr i8, ptr %a, i64 %291  %9 = getelementptr i8, ptr %b, i64 %292  %10 = ptrtoint ptr %8 to i6493  %11 = ptrtoint ptr %9 to i6494  %12 = lshr i64 %7, 1295  %13 = lshr i64 %10, 1296  %14 = lshr i64 %6, 1297  %15 = lshr i64 %11, 1298  %16 = icmp ne i64 %12, %1399  %17 = icmp ne i64 %14, %15100  %18 = or i1 %16, %17101  br i1 %18, label %mismatch_loop_pre, label %mismatch_vec_loop_preheader102 103mismatch_vec_loop_preheader:                      ; preds = %mismatch_mem_check104  br label %mismatch_vec_loop105 106mismatch_vec_loop:                                ; preds = %mismatch_vec_loop_inc, %mismatch_vec_loop_preheader107  %mismatch_vector_index = phi i64 [ %1, %mismatch_vec_loop_preheader ], [ %25, %mismatch_vec_loop_inc ]108  %avl = sub nuw nsw i64 %2, %mismatch_vector_index109  %19 = call i32 @llvm.experimental.get.vector.length.i64(i64 %avl, i32 16, i1 true)110  %20 = getelementptr inbounds i8, ptr %a, i64 %mismatch_vector_index111  %lhs.load = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr %20, <vscale x 16 x i1> shufflevector (<vscale x 16 x i1> insertelement (<vscale x 16 x i1> poison, i1 true, i64 0), <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer), i32 %19)112  %21 = getelementptr inbounds i8, ptr %b, i64 %mismatch_vector_index113  %rhs.load = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr %21, <vscale x 16 x i1> shufflevector (<vscale x 16 x i1> insertelement (<vscale x 16 x i1> poison, i1 true, i64 0), <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer), i32 %19)114  %mismatch.cmp = icmp ne <vscale x 16 x i8> %lhs.load, %rhs.load115  %22 = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> %mismatch.cmp, i1 false, <vscale x 16 x i1> shufflevector (<vscale x 16 x i1> insertelement (<vscale x 16 x i1> poison, i1 true, i64 0), <vscale x 16 x i1> poison, <vscale x 16 x i32> zeroinitializer), i32 %19)116  %23 = icmp ne i32 %22, %19117  br i1 %23, label %mismatch_vec_loop_found, label %mismatch_vec_loop_inc118 119mismatch_vec_loop_inc:                            ; preds = %mismatch_vec_loop120  %24 = zext i32 %19 to i64121  %25 = add nuw nsw i64 %mismatch_vector_index, %24122  %26 = icmp ne i64 %25, %2123  br i1 %26, label %mismatch_vec_loop, label %mismatch_end124 125mismatch_vec_loop_found:                          ; preds = %mismatch_vec_loop126  %ctz = phi i32 [ %22, %mismatch_vec_loop ]127  %mismatch_vector_index1 = phi i64 [ %mismatch_vector_index, %mismatch_vec_loop ]128  %27 = zext i32 %ctz to i64129  %28 = add nuw nsw i64 %mismatch_vector_index1, %27130  %29 = trunc i64 %28 to i32131  br label %mismatch_end132 133mismatch_loop_pre:                                ; preds = %mismatch_mem_check, %mismatch_min_it_check134  br label %mismatch_loop135 136mismatch_loop:                                    ; preds = %mismatch_loop_inc, %mismatch_loop_pre137  %mismatch_index = phi i32 [ %0, %mismatch_loop_pre ], [ %36, %mismatch_loop_inc ]138  %30 = zext i32 %mismatch_index to i64139  %31 = getelementptr inbounds i8, ptr %a, i64 %30140  %32 = load i8, ptr %31, align 1141  %33 = getelementptr inbounds i8, ptr %b, i64 %30142  %34 = load i8, ptr %33, align 1143  %35 = icmp eq i8 %32, %34144  br i1 %35, label %mismatch_loop_inc, label %mismatch_end145 146mismatch_loop_inc:                                ; preds = %mismatch_loop147  %36 = add i32 %mismatch_index, 1148  %37 = icmp eq i32 %36, %n149  br i1 %37, label %mismatch_end, label %mismatch_loop150 151mismatch_end:                                     ; preds = %mismatch_loop_inc, %mismatch_loop, %mismatch_vec_loop_found, %mismatch_vec_loop_inc152  %mismatch_result = phi i32 [ %n, %mismatch_loop_inc ], [ %mismatch_index, %mismatch_loop ], [ %n, %mismatch_vec_loop_inc ], [ %29, %mismatch_vec_loop_found ]153  br i1 true, label %byte.compare, label %while.cond154 155while.cond:                                       ; preds = %mismatch_end, %while.body156  %len.addr = phi i32 [ %len, %mismatch_end ], [ %mismatch_result, %while.body ]157  %inc = add i32 %len.addr, 1158  %cmp.not = icmp eq i32 %mismatch_result, %n159  br i1 %cmp.not, label %while.end, label %while.body160 161while.body:                                       ; preds = %while.cond162  %idxprom = zext i32 %mismatch_result to i64163  %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom164  %38 = load i8, ptr %arrayidx, align 1165  %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom166  %39 = load i8, ptr %arrayidx2, align 1167  %cmp.not2 = icmp eq i8 %38, %39168  br i1 %cmp.not2, label %while.cond, label %while.end169 170byte.compare:                                     ; preds = %mismatch_end171  br label %while.end172 173while.end:                                        ; preds = %byte.compare, %while.body, %while.cond174  %inc.lcssa = phi i32 [ %mismatch_result, %while.body ], [ %mismatch_result, %while.cond ], [ %mismatch_result, %byte.compare ]175  ret i32 %inc.lcssa176}177 178