18b55d342SMin-Yih Hsu; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 3 28b55d342SMin-Yih Hsu; RUN: opt -passes=loop-idiom-vectorize -mtriple=riscv64-unknown-linux-gnu -loop-idiom-vectorize-style=predicated -mattr=+v -S < %s | FileCheck %s 38b55d342SMin-Yih Hsu; RUN: opt -passes=loop-idiom-vectorize -mtriple=riscv64-unknown-linux-gnu -loop-idiom-vectorize-style=predicated -loop-idiom-vectorize-bytecmp-vf=64 -mattr=+v -S < %s | FileCheck %s --check-prefix=LMUL8 48b55d342SMin-Yih Hsu; RUN: opt -passes='loop(loop-idiom-vectorize),simplifycfg' -mtriple=riscv64-unknown-linux-gnu -loop-idiom-vectorize-style=predicated -mattr=+v -S < %s | FileCheck %s --check-prefix=LOOP-DEL 58b55d342SMin-Yih Hsu; RUN: opt -passes=loop-idiom-vectorize -mtriple=riscv64-unknown-linux-gnu -loop-idiom-vectorize-style=masked -mattr=+v -S < %s | FileCheck %s --check-prefix=MASKED 68b55d342SMin-Yih Hsu 78b55d342SMin-Yih Hsudefine i32 @compare_bytes_simple(ptr %a, ptr %b, i32 %len, i32 %n) { 88b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @compare_bytes_simple( 98b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { 108b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 118b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 128b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 138b55d342SMin-Yih Hsu; CHECK: mismatch_min_it_check: 148b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 158b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 168b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 178b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0:![0-9]+]] 188b55d342SMin-Yih Hsu; CHECK: mismatch_mem_check: 198b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 208b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 218b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 228b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 238b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 248b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 258b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 268b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 278b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 288b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 298b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 308b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 318b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 328b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 338b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 348b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1:![0-9]+]] 358b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_preheader: 368b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 378b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop: 388b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 398b55d342SMin-Yih Hsu; CHECK-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 408b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 418b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 42*56c091eaSPaul Walker; CHECK-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 438b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 44*56c091eaSPaul Walker; CHECK-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 45*56c091eaSPaul Walker; CHECK-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 46*56c091eaSPaul Walker; CHECK-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 478b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 488b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 498b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_inc: 508b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 518b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 528b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 538b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 548b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_found: 558b55d342SMin-Yih Hsu; CHECK-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 568b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 578b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 588b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 598b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 608b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_END]] 618b55d342SMin-Yih Hsu; CHECK: mismatch_loop_pre: 628b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_LOOP:%.*]] 638b55d342SMin-Yih Hsu; CHECK: mismatch_loop: 648b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 658b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 668b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 678b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 688b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 698b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 708b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 718b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 728b55d342SMin-Yih Hsu; CHECK: mismatch_loop_inc: 738b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX]], 1 748b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 758b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 768b55d342SMin-Yih Hsu; CHECK: mismatch_end: 778b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 788b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 798b55d342SMin-Yih Hsu; CHECK: while.cond: 808b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 818b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 828b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 838b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 848b55d342SMin-Yih Hsu; CHECK: while.body: 858b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 868b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 878b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 888b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 898b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 908b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 918b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 928b55d342SMin-Yih Hsu; CHECK: byte.compare: 938b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_END]] 948b55d342SMin-Yih Hsu; CHECK: while.end: 958b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 968b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[INC_LCSSA]] 978b55d342SMin-Yih Hsu; 988b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @compare_bytes_simple( 998b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { 1008b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 1018b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 1028b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 1038b55d342SMin-Yih Hsu; LMUL8: mismatch_min_it_check: 1048b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 1058b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 1068b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 1078b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0:![0-9]+]] 1088b55d342SMin-Yih Hsu; LMUL8: mismatch_mem_check: 1098b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 1108b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 1118b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 1128b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 1138b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 1148b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 1158b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 1168b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 1178b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 1188b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 1198b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 1208b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 1218b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 1228b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 1238b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 1248b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1:![0-9]+]] 1258b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_preheader: 1268b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 1278b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop: 1288b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 1298b55d342SMin-Yih Hsu; LMUL8-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 1308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 64, i1 true) 1318b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 132*56c091eaSPaul Walker; LMUL8-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP20]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 1338b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 134*56c091eaSPaul Walker; LMUL8-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP21]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 135*56c091eaSPaul Walker; LMUL8-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 64 x i1> @llvm.vp.icmp.nxv64i8(<vscale x 64 x i8> [[LHS_LOAD]], <vscale x 64 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 136*56c091eaSPaul Walker; LMUL8-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv64i1(<vscale x 64 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 1378b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 1388b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 1398b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_inc: 1408b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 1418b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 1428b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 1438b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 1448b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_found: 1458b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 1468b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 1478b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 1488b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 1498b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 1508b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_END]] 1518b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_pre: 1528b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_LOOP:%.*]] 1538b55d342SMin-Yih Hsu; LMUL8: mismatch_loop: 1548b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 1558b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 1568b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 1578b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 1588b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 1598b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 1608b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 1618b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 1628b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_inc: 1638b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX]], 1 1648b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 1658b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 1668b55d342SMin-Yih Hsu; LMUL8: mismatch_end: 1678b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 1688b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 1698b55d342SMin-Yih Hsu; LMUL8: while.cond: 1708b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 1718b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 1728b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 1738b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 1748b55d342SMin-Yih Hsu; LMUL8: while.body: 1758b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 1768b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 1778b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 1788b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 1798b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 1808b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 1818b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 1828b55d342SMin-Yih Hsu; LMUL8: byte.compare: 1838b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_END]] 1848b55d342SMin-Yih Hsu; LMUL8: while.end: 1858b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 1868b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[INC_LCSSA]] 1878b55d342SMin-Yih Hsu; 1888b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @compare_bytes_simple( 1898b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { 1908b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 1918b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 1928b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 1938b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 1948b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 1958b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0:![0-9]+]] 1968b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_mem_check: 1978b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 1988b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 1998b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 2008b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 2018b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 2028b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 2038b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 2048b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 2058b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 2068b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 2078b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 2088b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 2098b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 2108b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 2118b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 2128b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP:%.*]], !prof [[PROF1:![0-9]+]] 2138b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop: 2148b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ], [ [[TMP1]], [[MISMATCH_MEM_CHECK]] ] 2158b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 2168b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 2178b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 218*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 2198b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 220*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 221*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 222*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 2238b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 2248b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 2258b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_inc: 2268b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 2278b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 2288b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 2298b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[WHILE_END:%.*]] 2308b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_found: 2318b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 2328b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 2338b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 2348b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 2358b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 2368b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[WHILE_END]] 2378b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_pre: 2388b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[MISMATCH_LOOP:%.*]] 2398b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop: 2408b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 2418b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 2428b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 2438b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 2448b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 2458b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 2468b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 2478b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[WHILE_END]] 2488b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_inc: 2498b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX]], 1 2508b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 2518b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP36]], label [[WHILE_END]], label [[MISMATCH_LOOP]] 2528b55d342SMin-Yih Hsu; LOOP-DEL: while.end: 2538b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 2548b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[MISMATCH_RESULT]] 2558b55d342SMin-Yih Hsu; 2568b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @compare_bytes_simple( 2578b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0:[0-9]+]] { 2588b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 2598b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 2608b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 2618b55d342SMin-Yih Hsu; MASKED: mismatch_min_it_check: 2628b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 2638b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 2648b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 2658b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0:![0-9]+]] 2668b55d342SMin-Yih Hsu; MASKED: mismatch_mem_check: 2678b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 2688b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 2698b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i64 2708b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 2718b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 2728b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 2738b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP8]] to i64 2748b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP9]] to i64 2758b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP7]], 12 2768b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP13:%.*]] = lshr i64 [[TMP10]], 12 2778b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP14:%.*]] = lshr i64 [[TMP6]], 12 2788b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP11]], 12 2798b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP12]], [[TMP13]] 2808b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP14]], [[TMP15]] 2818b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 2828b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VEC_LOOP_PREHEADER:%.*]], !prof [[PROF1:![0-9]+]] 2838b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_preheader: 2848b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP19:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP1]], i64 [[TMP2]]) 2858b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP20:%.*]] = call i64 @llvm.vscale.i64() 2868b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP21:%.*]] = mul nuw nsw i64 [[TMP20]], 16 2878b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_VEC_LOOP:%.*]] 2888b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop: 2898b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP19]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP30:%.*]], [[MISMATCH_VEC_LOOP_INC:%.*]] ] 2908b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP29:%.*]], [[MISMATCH_VEC_LOOP_INC]] ] 2918b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP22:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VEC_INDEX]] 2928b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP23:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP22]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 2938b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP24:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VEC_INDEX]] 2948b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP25:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP24]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 2958b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP26:%.*]] = icmp ne <vscale x 16 x i8> [[TMP23]], [[TMP25]] 2968b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP27:%.*]] = select <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i1> [[TMP26]], <vscale x 16 x i1> zeroinitializer 2978b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP28:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP27]]) 2988b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP28]], label [[MISMATCH_VEC_LOOP_FOUND:%.*]], label [[MISMATCH_VEC_LOOP_INC]] 2998b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_inc: 3008b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP29]] = add nuw nsw i64 [[MISMATCH_VEC_INDEX]], [[TMP21]] 3018b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP30]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP29]], i64 [[TMP2]]) 3028b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP31:%.*]] = extractelement <vscale x 16 x i1> [[TMP30]], i64 0 3038b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP31]], label [[MISMATCH_VEC_LOOP]], label [[MISMATCH_END:%.*]] 3048b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_found: 3058b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP27]], [[MISMATCH_VEC_LOOP]] ] 3068b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LAST_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[MISMATCH_VEC_LOOP_PRED]], [[MISMATCH_VEC_LOOP]] ] 3078b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_INDEX:%.*]] = phi i64 [ [[MISMATCH_VEC_INDEX]], [[MISMATCH_VEC_LOOP]] ] 3088b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP32:%.*]] = and <vscale x 16 x i1> [[MISMATCH_VEC_LAST_LOOP_PRED]], [[MISMATCH_VEC_FOUND_PRED]] 3098b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP33:%.*]] = call i32 @llvm.experimental.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[TMP32]], i1 true) 3108b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP34:%.*]] = zext i32 [[TMP33]] to i64 3118b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP35:%.*]] = add nuw nsw i64 [[MISMATCH_VEC_FOUND_INDEX]], [[TMP34]] 3128b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP36:%.*]] = trunc i64 [[TMP35]] to i32 3138b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_END]] 3148b55d342SMin-Yih Hsu; MASKED: mismatch_loop_pre: 3158b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_LOOP:%.*]] 3168b55d342SMin-Yih Hsu; MASKED: mismatch_loop: 3178b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP43:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 3188b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP37:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 3198b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP38:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP37]] 3208b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP39:%.*]] = load i8, ptr [[TMP38]], align 1 3218b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP40:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP37]] 3228b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP41:%.*]] = load i8, ptr [[TMP40]], align 1 3238b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP42:%.*]] = icmp eq i8 [[TMP39]], [[TMP41]] 3248b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP42]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 3258b55d342SMin-Yih Hsu; MASKED: mismatch_loop_inc: 3268b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP43]] = add i32 [[MISMATCH_INDEX]], 1 3278b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP44:%.*]] = icmp eq i32 [[TMP43]], [[N]] 3288b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP44]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 3298b55d342SMin-Yih Hsu; MASKED: mismatch_end: 3308b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VEC_LOOP_INC]] ], [ [[TMP36]], [[MISMATCH_VEC_LOOP_FOUND]] ] 3318b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 3328b55d342SMin-Yih Hsu; MASKED: while.cond: 3338b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 3348b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 3358b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 3368b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 3378b55d342SMin-Yih Hsu; MASKED: while.body: 3388b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 3398b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 3408b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP45:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 3418b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 3428b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP46:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 3438b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP45]], [[TMP46]] 3448b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 3458b55d342SMin-Yih Hsu; MASKED: byte.compare: 3468b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_END]] 3478b55d342SMin-Yih Hsu; MASKED: while.end: 3488b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 3498b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[INC_LCSSA]] 3508b55d342SMin-Yih Hsu; 3518b55d342SMin-Yih Hsuentry: 3528b55d342SMin-Yih Hsu br label %while.cond 3538b55d342SMin-Yih Hsu 3548b55d342SMin-Yih Hsuwhile.cond: 3558b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %entry ], [ %inc, %while.body ] 3568b55d342SMin-Yih Hsu %inc = add i32 %len.addr, 1 3578b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 3588b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 3598b55d342SMin-Yih Hsu 3608b55d342SMin-Yih Hsuwhile.body: 3618b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 3628b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 3638b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 3648b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 3658b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 3668b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 3678b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.end 3688b55d342SMin-Yih Hsu 3698b55d342SMin-Yih Hsuwhile.end: 3708b55d342SMin-Yih Hsu %inc.lcssa = phi i32 [ %inc, %while.body ], [ %inc, %while.cond ] 3718b55d342SMin-Yih Hsu ret i32 %inc.lcssa 3728b55d342SMin-Yih Hsu} 3738b55d342SMin-Yih Hsu 3748b55d342SMin-Yih Hsudefine i32 @compare_bytes_signed_wrap(ptr %a, ptr %b, i32 %len, i32 %n) { 3758b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @compare_bytes_signed_wrap( 3768b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 3778b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 3788b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 3798b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 3808b55d342SMin-Yih Hsu; CHECK: mismatch_min_it_check: 3818b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 3828b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 3838b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 3848b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 3858b55d342SMin-Yih Hsu; CHECK: mismatch_mem_check: 3868b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 3878b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 3888b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 3898b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 3908b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 3918b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 3928b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 3938b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 3948b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 3958b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 3968b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 3978b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 3988b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 3998b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 4008b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 4018b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 4028b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_preheader: 4038b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 4048b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop: 4058b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 4068b55d342SMin-Yih Hsu; CHECK-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 4078b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 4088b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 409*56c091eaSPaul Walker; CHECK-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 4108b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 411*56c091eaSPaul Walker; CHECK-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 412*56c091eaSPaul Walker; CHECK-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 413*56c091eaSPaul Walker; CHECK-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 4148b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 4158b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 4168b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_inc: 4178b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 4188b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 4198b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 4208b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 4218b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_found: 4228b55d342SMin-Yih Hsu; CHECK-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 4238b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 4248b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 4258b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 4268b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 4278b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_END]] 4288b55d342SMin-Yih Hsu; CHECK: mismatch_loop_pre: 4298b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_LOOP:%.*]] 4308b55d342SMin-Yih Hsu; CHECK: mismatch_loop: 4318b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 4328b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 4338b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 4348b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 4358b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 4368b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 4378b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 4388b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 4398b55d342SMin-Yih Hsu; CHECK: mismatch_loop_inc: 4408b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP35]] = add nsw i32 [[MISMATCH_INDEX]], 1 4418b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 4428b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 4438b55d342SMin-Yih Hsu; CHECK: mismatch_end: 4448b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 4458b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 4468b55d342SMin-Yih Hsu; CHECK: while.cond: 4478b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 4488b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC:%.*]] = add nsw i32 [[LEN_ADDR]], 1 4498b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 4508b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 4518b55d342SMin-Yih Hsu; CHECK: while.body: 4528b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 4538b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 4548b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 4558b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 4568b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 4578b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 4588b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 4598b55d342SMin-Yih Hsu; CHECK: byte.compare: 4608b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_END]] 4618b55d342SMin-Yih Hsu; CHECK: while.end: 4628b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 4638b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[INC_LCSSA]] 4648b55d342SMin-Yih Hsu; 4658b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @compare_bytes_signed_wrap( 4668b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 4678b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 4688b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 4698b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 4708b55d342SMin-Yih Hsu; LMUL8: mismatch_min_it_check: 4718b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 4728b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 4738b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 4748b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 4758b55d342SMin-Yih Hsu; LMUL8: mismatch_mem_check: 4768b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 4778b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 4788b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 4798b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 4808b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 4818b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 4828b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 4838b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 4848b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 4858b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 4868b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 4878b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 4888b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 4898b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 4908b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 4918b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 4928b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_preheader: 4938b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 4948b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop: 4958b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 4968b55d342SMin-Yih Hsu; LMUL8-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 4978b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 64, i1 true) 4988b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 499*56c091eaSPaul Walker; LMUL8-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP20]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 5008b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 501*56c091eaSPaul Walker; LMUL8-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP21]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 502*56c091eaSPaul Walker; LMUL8-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 64 x i1> @llvm.vp.icmp.nxv64i8(<vscale x 64 x i8> [[LHS_LOAD]], <vscale x 64 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 503*56c091eaSPaul Walker; LMUL8-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv64i1(<vscale x 64 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 5048b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 5058b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 5068b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_inc: 5078b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 5088b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 5098b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 5108b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 5118b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_found: 5128b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 5138b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 5148b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 5158b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 5168b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 5178b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_END]] 5188b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_pre: 5198b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_LOOP:%.*]] 5208b55d342SMin-Yih Hsu; LMUL8: mismatch_loop: 5218b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 5228b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 5238b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 5248b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 5258b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 5268b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 5278b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 5288b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 5298b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_inc: 5308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP35]] = add nsw i32 [[MISMATCH_INDEX]], 1 5318b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 5328b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 5338b55d342SMin-Yih Hsu; LMUL8: mismatch_end: 5348b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 5358b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 5368b55d342SMin-Yih Hsu; LMUL8: while.cond: 5378b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 5388b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC:%.*]] = add nsw i32 [[LEN_ADDR]], 1 5398b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 5408b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 5418b55d342SMin-Yih Hsu; LMUL8: while.body: 5428b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 5438b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 5448b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 5458b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 5468b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 5478b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 5488b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 5498b55d342SMin-Yih Hsu; LMUL8: byte.compare: 5508b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_END]] 5518b55d342SMin-Yih Hsu; LMUL8: while.end: 5528b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 5538b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[INC_LCSSA]] 5548b55d342SMin-Yih Hsu; 5558b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @compare_bytes_signed_wrap( 5568b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 5578b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 5588b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 5598b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 5608b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 5618b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 5628b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 5638b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_mem_check: 5648b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 5658b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 5668b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 5678b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 5688b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 5698b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 5708b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 5718b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 5728b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 5738b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 5748b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 5758b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 5768b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 5778b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 5788b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 5798b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP:%.*]], !prof [[PROF1]] 5808b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop: 5818b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ], [ [[TMP1]], [[MISMATCH_MEM_CHECK]] ] 5828b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 5838b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 5848b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 585*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 5868b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 587*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 588*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 589*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 5908b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 5918b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 5928b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_inc: 5938b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 5948b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 5958b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 5968b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[WHILE_END:%.*]] 5978b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_found: 5988b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 5998b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 6008b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 6018b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 6028b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 6038b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[WHILE_END]] 6048b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_pre: 6058b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[MISMATCH_LOOP:%.*]] 6068b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop: 6078b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 6088b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 6098b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 6108b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 6118b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 6128b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 6138b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 6148b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[WHILE_END]] 6158b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_inc: 6168b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP35]] = add nsw i32 [[MISMATCH_INDEX]], 1 6178b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 6188b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP36]], label [[WHILE_END]], label [[MISMATCH_LOOP]] 6198b55d342SMin-Yih Hsu; LOOP-DEL: while.end: 6208b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 6218b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[MISMATCH_RESULT]] 6228b55d342SMin-Yih Hsu; 6238b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @compare_bytes_signed_wrap( 6248b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 6258b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 6268b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 6278b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 6288b55d342SMin-Yih Hsu; MASKED: mismatch_min_it_check: 6298b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 6308b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 6318b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 6328b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 6338b55d342SMin-Yih Hsu; MASKED: mismatch_mem_check: 6348b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 6358b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 6368b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i64 6378b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 6388b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 6398b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 6408b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP8]] to i64 6418b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP9]] to i64 6428b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP7]], 12 6438b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP13:%.*]] = lshr i64 [[TMP10]], 12 6448b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP14:%.*]] = lshr i64 [[TMP6]], 12 6458b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP11]], 12 6468b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP12]], [[TMP13]] 6478b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP14]], [[TMP15]] 6488b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 6498b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VEC_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 6508b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_preheader: 6518b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP19:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP1]], i64 [[TMP2]]) 6528b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP20:%.*]] = call i64 @llvm.vscale.i64() 6538b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP21:%.*]] = mul nuw nsw i64 [[TMP20]], 16 6548b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_VEC_LOOP:%.*]] 6558b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop: 6568b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP19]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP30:%.*]], [[MISMATCH_VEC_LOOP_INC:%.*]] ] 6578b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP29:%.*]], [[MISMATCH_VEC_LOOP_INC]] ] 6588b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP22:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VEC_INDEX]] 6598b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP23:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP22]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 6608b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP24:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VEC_INDEX]] 6618b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP25:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP24]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 6628b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP26:%.*]] = icmp ne <vscale x 16 x i8> [[TMP23]], [[TMP25]] 6638b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP27:%.*]] = select <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i1> [[TMP26]], <vscale x 16 x i1> zeroinitializer 6648b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP28:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP27]]) 6658b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP28]], label [[MISMATCH_VEC_LOOP_FOUND:%.*]], label [[MISMATCH_VEC_LOOP_INC]] 6668b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_inc: 6678b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP29]] = add nuw nsw i64 [[MISMATCH_VEC_INDEX]], [[TMP21]] 6688b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP30]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP29]], i64 [[TMP2]]) 6698b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP31:%.*]] = extractelement <vscale x 16 x i1> [[TMP30]], i64 0 6708b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP31]], label [[MISMATCH_VEC_LOOP]], label [[MISMATCH_END:%.*]] 6718b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_found: 6728b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP27]], [[MISMATCH_VEC_LOOP]] ] 6738b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LAST_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[MISMATCH_VEC_LOOP_PRED]], [[MISMATCH_VEC_LOOP]] ] 6748b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_INDEX:%.*]] = phi i64 [ [[MISMATCH_VEC_INDEX]], [[MISMATCH_VEC_LOOP]] ] 6758b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP32:%.*]] = and <vscale x 16 x i1> [[MISMATCH_VEC_LAST_LOOP_PRED]], [[MISMATCH_VEC_FOUND_PRED]] 6768b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP33:%.*]] = call i32 @llvm.experimental.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[TMP32]], i1 true) 6778b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP34:%.*]] = zext i32 [[TMP33]] to i64 6788b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP35:%.*]] = add nuw nsw i64 [[MISMATCH_VEC_FOUND_INDEX]], [[TMP34]] 6798b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP36:%.*]] = trunc i64 [[TMP35]] to i32 6808b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_END]] 6818b55d342SMin-Yih Hsu; MASKED: mismatch_loop_pre: 6828b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_LOOP:%.*]] 6838b55d342SMin-Yih Hsu; MASKED: mismatch_loop: 6848b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP43:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 6858b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP37:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 6868b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP38:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP37]] 6878b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP39:%.*]] = load i8, ptr [[TMP38]], align 1 6888b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP40:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP37]] 6898b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP41:%.*]] = load i8, ptr [[TMP40]], align 1 6908b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP42:%.*]] = icmp eq i8 [[TMP39]], [[TMP41]] 6918b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP42]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 6928b55d342SMin-Yih Hsu; MASKED: mismatch_loop_inc: 6938b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP43]] = add nsw i32 [[MISMATCH_INDEX]], 1 6948b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP44:%.*]] = icmp eq i32 [[TMP43]], [[N]] 6958b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP44]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 6968b55d342SMin-Yih Hsu; MASKED: mismatch_end: 6978b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VEC_LOOP_INC]] ], [ [[TMP36]], [[MISMATCH_VEC_LOOP_FOUND]] ] 6988b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 6998b55d342SMin-Yih Hsu; MASKED: while.cond: 7008b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 7018b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC:%.*]] = add nsw i32 [[LEN_ADDR]], 1 7028b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 7038b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 7048b55d342SMin-Yih Hsu; MASKED: while.body: 7058b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 7068b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 7078b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP45:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 7088b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 7098b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP46:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 7108b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP45]], [[TMP46]] 7118b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 7128b55d342SMin-Yih Hsu; MASKED: byte.compare: 7138b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_END]] 7148b55d342SMin-Yih Hsu; MASKED: while.end: 7158b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 7168b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[INC_LCSSA]] 7178b55d342SMin-Yih Hsu; 7188b55d342SMin-Yih Hsu; NO-TRANSFORM-LABEL: define i32 @compare_bytes_signed_wrap( 7198b55d342SMin-Yih Hsu; NO-TRANSFORM-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) { 7208b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: entry: 7218b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br label [[WHILE_COND:%.*]] 7228b55d342SMin-Yih Hsu; NO-TRANSFORM: while.cond: 7238b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 7248b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[INC]] = add nsw i32 [[LEN_ADDR]], 1 7258b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 7268b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 7278b55d342SMin-Yih Hsu; NO-TRANSFORM: while.body: 7288b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 7298b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 7308b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 7318b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 7328b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 7338b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 7348b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 7358b55d342SMin-Yih Hsu; NO-TRANSFORM: while.end: 7368b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 7378b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: ret i32 [[INC_LCSSA]] 7388b55d342SMin-Yih Hsuentry: 7398b55d342SMin-Yih Hsu br label %while.cond 7408b55d342SMin-Yih Hsu 7418b55d342SMin-Yih Hsuwhile.cond: 7428b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %entry ], [ %inc, %while.body ] 7438b55d342SMin-Yih Hsu %inc = add nsw i32 %len.addr, 1 7448b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 7458b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 7468b55d342SMin-Yih Hsu 7478b55d342SMin-Yih Hsuwhile.body: 7488b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 7498b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 7508b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 7518b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 7528b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 7538b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 7548b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.end 7558b55d342SMin-Yih Hsu 7568b55d342SMin-Yih Hsuwhile.end: 7578b55d342SMin-Yih Hsu %inc.lcssa = phi i32 [ %inc, %while.body ], [ %inc, %while.cond ] 7588b55d342SMin-Yih Hsu ret i32 %inc.lcssa 7598b55d342SMin-Yih Hsu} 7608b55d342SMin-Yih Hsu 7618b55d342SMin-Yih Hsu 7628b55d342SMin-Yih Hsudefine i32 @compare_bytes_simple_end_ne_found(ptr %a, ptr %b, ptr %c, ptr %d, i32 %len, i32 %n) { 7638b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @compare_bytes_simple_end_ne_found( 7648b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 7658b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 7668b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 7678b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 7688b55d342SMin-Yih Hsu; CHECK: mismatch_min_it_check: 7698b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 7708b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 7718b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 7728b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 7738b55d342SMin-Yih Hsu; CHECK: mismatch_mem_check: 7748b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 7758b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 7768b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 7778b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 7788b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 7798b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 7808b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 7818b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 7828b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 7838b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 7848b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 7858b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 7868b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 7878b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 7888b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 7898b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 7908b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_preheader: 7918b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 7928b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop: 7938b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 7948b55d342SMin-Yih Hsu; CHECK-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 7958b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 7968b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 797*56c091eaSPaul Walker; CHECK-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 7988b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 799*56c091eaSPaul Walker; CHECK-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 800*56c091eaSPaul Walker; CHECK-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 801*56c091eaSPaul Walker; CHECK-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 8028b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 8038b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 8048b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_inc: 8058b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 8068b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 8078b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 8088b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 8098b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_found: 8108b55d342SMin-Yih Hsu; CHECK-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 8118b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 8128b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 8138b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 8148b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 8158b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_END]] 8168b55d342SMin-Yih Hsu; CHECK: mismatch_loop_pre: 8178b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_LOOP:%.*]] 8188b55d342SMin-Yih Hsu; CHECK: mismatch_loop: 8198b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX3:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 8208b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX3]] to i64 8218b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 8228b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 8238b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 8248b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 8258b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 8268b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 8278b55d342SMin-Yih Hsu; CHECK: mismatch_loop_inc: 8288b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX3]], 1 8298b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 8308b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 8318b55d342SMin-Yih Hsu; CHECK: mismatch_end: 8328b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX3]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 8338b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 8348b55d342SMin-Yih Hsu; CHECK: while.cond: 8358b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 8368b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 8378b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 8388b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 8398b55d342SMin-Yih Hsu; CHECK: while.body: 8408b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 8418b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 8428b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 8438b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 8448b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 8458b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 8468b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_FOUND:%.*]] 8478b55d342SMin-Yih Hsu; CHECK: while.found: 8488b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX1:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 8498b55d342SMin-Yih Hsu; CHECK-NEXT: [[FOUND_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[C]], [[BYTE_COMPARE]] ] 8508b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[END:%.*]] 8518b55d342SMin-Yih Hsu; CHECK: byte.compare: 8528b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP39:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 8538b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP39]], label [[WHILE_END]], label [[WHILE_FOUND]] 8548b55d342SMin-Yih Hsu; CHECK: while.end: 8558b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX2:%.*]] = phi i32 [ [[N]], [[WHILE_COND]] ], [ [[N]], [[BYTE_COMPARE]] ] 8568b55d342SMin-Yih Hsu; CHECK-NEXT: [[END_PTR:%.*]] = phi ptr [ [[D]], [[WHILE_COND]] ], [ [[D]], [[BYTE_COMPARE]] ] 8578b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[END]] 8588b55d342SMin-Yih Hsu; CHECK: end: 8598b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[MISMATCH_INDEX1]], [[WHILE_FOUND]] ], [ [[MISMATCH_INDEX2]], [[WHILE_END]] ] 8608b55d342SMin-Yih Hsu; CHECK-NEXT: [[STORE_PTR:%.*]] = phi ptr [ [[END_PTR]], [[WHILE_END]] ], [ [[FOUND_PTR]], [[WHILE_FOUND]] ] 8618b55d342SMin-Yih Hsu; CHECK-NEXT: store i32 [[MISMATCH_INDEX]], ptr [[STORE_PTR]], align 4 8628b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[MISMATCH_INDEX]] 8638b55d342SMin-Yih Hsu; 8648b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @compare_bytes_simple_end_ne_found( 8658b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 8668b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 8678b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 8688b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 8698b55d342SMin-Yih Hsu; LMUL8: mismatch_min_it_check: 8708b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 8718b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 8728b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 8738b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 8748b55d342SMin-Yih Hsu; LMUL8: mismatch_mem_check: 8758b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 8768b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 8778b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 8788b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 8798b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 8808b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 8818b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 8828b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 8838b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 8848b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 8858b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 8868b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 8878b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 8888b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 8898b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 8908b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 8918b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_preheader: 8928b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 8938b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop: 8948b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 8958b55d342SMin-Yih Hsu; LMUL8-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 8968b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 64, i1 true) 8978b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 898*56c091eaSPaul Walker; LMUL8-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP20]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 8998b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 900*56c091eaSPaul Walker; LMUL8-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP21]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 901*56c091eaSPaul Walker; LMUL8-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 64 x i1> @llvm.vp.icmp.nxv64i8(<vscale x 64 x i8> [[LHS_LOAD]], <vscale x 64 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 902*56c091eaSPaul Walker; LMUL8-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv64i1(<vscale x 64 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 9038b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 9048b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 9058b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_inc: 9068b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 9078b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 9088b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 9098b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 9108b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_found: 9118b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 9128b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 9138b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 9148b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 9158b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 9168b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_END]] 9178b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_pre: 9188b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_LOOP:%.*]] 9198b55d342SMin-Yih Hsu; LMUL8: mismatch_loop: 9208b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX3:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 9218b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX3]] to i64 9228b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 9238b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 9248b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 9258b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 9268b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 9278b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 9288b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_inc: 9298b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX3]], 1 9308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 9318b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 9328b55d342SMin-Yih Hsu; LMUL8: mismatch_end: 9338b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX3]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 9348b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 9358b55d342SMin-Yih Hsu; LMUL8: while.cond: 9368b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 9378b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 9388b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 9398b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 9408b55d342SMin-Yih Hsu; LMUL8: while.body: 9418b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 9428b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 9438b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 9448b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 9458b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 9468b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 9478b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_FOUND:%.*]] 9488b55d342SMin-Yih Hsu; LMUL8: while.found: 9498b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX1:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 9508b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FOUND_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[C]], [[BYTE_COMPARE]] ] 9518b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[END:%.*]] 9528b55d342SMin-Yih Hsu; LMUL8: byte.compare: 9538b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP39:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 9548b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP39]], label [[WHILE_END]], label [[WHILE_FOUND]] 9558b55d342SMin-Yih Hsu; LMUL8: while.end: 9568b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX2:%.*]] = phi i32 [ [[N]], [[WHILE_COND]] ], [ [[N]], [[BYTE_COMPARE]] ] 9578b55d342SMin-Yih Hsu; LMUL8-NEXT: [[END_PTR:%.*]] = phi ptr [ [[D]], [[WHILE_COND]] ], [ [[D]], [[BYTE_COMPARE]] ] 9588b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[END]] 9598b55d342SMin-Yih Hsu; LMUL8: end: 9608b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[MISMATCH_INDEX1]], [[WHILE_FOUND]] ], [ [[MISMATCH_INDEX2]], [[WHILE_END]] ] 9618b55d342SMin-Yih Hsu; LMUL8-NEXT: [[STORE_PTR:%.*]] = phi ptr [ [[END_PTR]], [[WHILE_END]] ], [ [[FOUND_PTR]], [[WHILE_FOUND]] ] 9628b55d342SMin-Yih Hsu; LMUL8-NEXT: store i32 [[MISMATCH_INDEX]], ptr [[STORE_PTR]], align 4 9638b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[MISMATCH_INDEX]] 9648b55d342SMin-Yih Hsu; 9658b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @compare_bytes_simple_end_ne_found( 9668b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 9678b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 9688b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 9698b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 9708b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 9718b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 9728b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 9738b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_mem_check: 9748b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 9758b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 9768b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 9778b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 9788b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 9798b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 9808b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 9818b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 9828b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 9838b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 9848b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 9858b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 9868b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 9878b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 9888b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 9898b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP:%.*]], !prof [[PROF1]] 9908b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop: 9918b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ], [ [[TMP1]], [[MISMATCH_MEM_CHECK]] ] 9928b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 9938b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 9948b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 995*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 9968b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 997*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 998*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 999*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 10008b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 10018b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 10028b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_inc: 10038b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 10048b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 10058b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 10068b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[BYTE_COMPARE:%.*]] 10078b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_found: 10088b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 10098b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 10108b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST1]] to i64 10118b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP26]] 10128b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 10138b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[BYTE_COMPARE]] 10148b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_pre: 10158b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[MISMATCH_LOOP:%.*]] 10168b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop: 10178b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_INDEX3:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 10188b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX3]] to i64 10198b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 10208b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 10218b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 10228b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 10238b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 10248b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[BYTE_COMPARE]] 10258b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_inc: 10268b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX3]], 1 10278b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 10288b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP36]], label [[BYTE_COMPARE]], label [[MISMATCH_LOOP]] 10298b55d342SMin-Yih Hsu; LOOP-DEL: byte.compare: 10308b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX3]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 10318b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP37:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 10328b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[SPEC_SELECT:%.*]] = select i1 [[TMP37]], i32 [[N]], i32 [[MISMATCH_RESULT]] 10338b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[SPEC_SELECT4:%.*]] = select i1 [[TMP37]], ptr [[D]], ptr [[C]] 10348b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: store i32 [[SPEC_SELECT]], ptr [[SPEC_SELECT4]], align 4 10358b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[SPEC_SELECT]] 10368b55d342SMin-Yih Hsu; 10378b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @compare_bytes_simple_end_ne_found( 10388b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 10398b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 10408b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 10418b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 10428b55d342SMin-Yih Hsu; MASKED: mismatch_min_it_check: 10438b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 10448b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 10458b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 10468b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 10478b55d342SMin-Yih Hsu; MASKED: mismatch_mem_check: 10488b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 10498b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 10508b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i64 10518b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 10528b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 10538b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 10548b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP8]] to i64 10558b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP9]] to i64 10568b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP7]], 12 10578b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP13:%.*]] = lshr i64 [[TMP10]], 12 10588b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP14:%.*]] = lshr i64 [[TMP6]], 12 10598b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP11]], 12 10608b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP12]], [[TMP13]] 10618b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP14]], [[TMP15]] 10628b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 10638b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VEC_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 10648b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_preheader: 10658b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP19:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP1]], i64 [[TMP2]]) 10668b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP20:%.*]] = call i64 @llvm.vscale.i64() 10678b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP21:%.*]] = mul nuw nsw i64 [[TMP20]], 16 10688b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_VEC_LOOP:%.*]] 10698b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop: 10708b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP19]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP30:%.*]], [[MISMATCH_VEC_LOOP_INC:%.*]] ] 10718b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP29:%.*]], [[MISMATCH_VEC_LOOP_INC]] ] 10728b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP22:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VEC_INDEX]] 10738b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP23:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP22]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 10748b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP24:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VEC_INDEX]] 10758b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP25:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP24]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 10768b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP26:%.*]] = icmp ne <vscale x 16 x i8> [[TMP23]], [[TMP25]] 10778b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP27:%.*]] = select <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i1> [[TMP26]], <vscale x 16 x i1> zeroinitializer 10788b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP28:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP27]]) 10798b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP28]], label [[MISMATCH_VEC_LOOP_FOUND:%.*]], label [[MISMATCH_VEC_LOOP_INC]] 10808b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_inc: 10818b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP29]] = add nuw nsw i64 [[MISMATCH_VEC_INDEX]], [[TMP21]] 10828b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP30]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP29]], i64 [[TMP2]]) 10838b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP31:%.*]] = extractelement <vscale x 16 x i1> [[TMP30]], i64 0 10848b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP31]], label [[MISMATCH_VEC_LOOP]], label [[MISMATCH_END:%.*]] 10858b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_found: 10868b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP27]], [[MISMATCH_VEC_LOOP]] ] 10878b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LAST_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[MISMATCH_VEC_LOOP_PRED]], [[MISMATCH_VEC_LOOP]] ] 10888b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_INDEX:%.*]] = phi i64 [ [[MISMATCH_VEC_INDEX]], [[MISMATCH_VEC_LOOP]] ] 10898b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP32:%.*]] = and <vscale x 16 x i1> [[MISMATCH_VEC_LAST_LOOP_PRED]], [[MISMATCH_VEC_FOUND_PRED]] 10908b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP33:%.*]] = call i32 @llvm.experimental.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[TMP32]], i1 true) 10918b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP34:%.*]] = zext i32 [[TMP33]] to i64 10928b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP35:%.*]] = add nuw nsw i64 [[MISMATCH_VEC_FOUND_INDEX]], [[TMP34]] 10938b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP36:%.*]] = trunc i64 [[TMP35]] to i32 10948b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_END]] 10958b55d342SMin-Yih Hsu; MASKED: mismatch_loop_pre: 10968b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_LOOP:%.*]] 10978b55d342SMin-Yih Hsu; MASKED: mismatch_loop: 10988b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX3:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP43:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 10998b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP37:%.*]] = zext i32 [[MISMATCH_INDEX3]] to i64 11008b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP38:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP37]] 11018b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP39:%.*]] = load i8, ptr [[TMP38]], align 1 11028b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP40:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP37]] 11038b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP41:%.*]] = load i8, ptr [[TMP40]], align 1 11048b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP42:%.*]] = icmp eq i8 [[TMP39]], [[TMP41]] 11058b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP42]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 11068b55d342SMin-Yih Hsu; MASKED: mismatch_loop_inc: 11078b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP43]] = add i32 [[MISMATCH_INDEX3]], 1 11088b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP44:%.*]] = icmp eq i32 [[TMP43]], [[N]] 11098b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP44]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 11108b55d342SMin-Yih Hsu; MASKED: mismatch_end: 11118b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX3]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VEC_LOOP_INC]] ], [ [[TMP36]], [[MISMATCH_VEC_LOOP_FOUND]] ] 11128b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 11138b55d342SMin-Yih Hsu; MASKED: while.cond: 11148b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 11158b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 11168b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 11178b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 11188b55d342SMin-Yih Hsu; MASKED: while.body: 11198b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 11208b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 11218b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP45:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 11228b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 11238b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP46:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 11248b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP45]], [[TMP46]] 11258b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_FOUND:%.*]] 11268b55d342SMin-Yih Hsu; MASKED: while.found: 11278b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX1:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 11288b55d342SMin-Yih Hsu; MASKED-NEXT: [[FOUND_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[C]], [[BYTE_COMPARE]] ] 11298b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[END:%.*]] 11308b55d342SMin-Yih Hsu; MASKED: byte.compare: 11318b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP47:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 11328b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP47]], label [[WHILE_END]], label [[WHILE_FOUND]] 11338b55d342SMin-Yih Hsu; MASKED: while.end: 11348b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX2:%.*]] = phi i32 [ [[N]], [[WHILE_COND]] ], [ [[N]], [[BYTE_COMPARE]] ] 11358b55d342SMin-Yih Hsu; MASKED-NEXT: [[END_PTR:%.*]] = phi ptr [ [[D]], [[WHILE_COND]] ], [ [[D]], [[BYTE_COMPARE]] ] 11368b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[END]] 11378b55d342SMin-Yih Hsu; MASKED: end: 11388b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[MISMATCH_INDEX1]], [[WHILE_FOUND]] ], [ [[MISMATCH_INDEX2]], [[WHILE_END]] ] 11398b55d342SMin-Yih Hsu; MASKED-NEXT: [[STORE_PTR:%.*]] = phi ptr [ [[END_PTR]], [[WHILE_END]] ], [ [[FOUND_PTR]], [[WHILE_FOUND]] ] 11408b55d342SMin-Yih Hsu; MASKED-NEXT: store i32 [[MISMATCH_INDEX]], ptr [[STORE_PTR]], align 4 11418b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[MISMATCH_INDEX]] 11428b55d342SMin-Yih Hsu; 11438b55d342SMin-Yih Hsu; NO-TRANSFORM-LABEL: define i32 @compare_bytes_simple_end_ne_found( 11448b55d342SMin-Yih Hsu; NO-TRANSFORM-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) { 11458b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: entry: 11468b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br label [[WHILE_COND:%.*]] 11478b55d342SMin-Yih Hsu; NO-TRANSFORM: while.cond: 11488b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 11498b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 11508b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 11518b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 11528b55d342SMin-Yih Hsu; NO-TRANSFORM: while.body: 11538b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 11548b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 11558b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 11568b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 11578b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 11588b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 11598b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_FOUND:%.*]] 11608b55d342SMin-Yih Hsu; NO-TRANSFORM: while.found: 11618b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[MISMATCH_INDEX1:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ] 11628b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[FOUND_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ] 11638b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br label [[END:%.*]] 11648b55d342SMin-Yih Hsu; NO-TRANSFORM: while.end: 11658b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[MISMATCH_INDEX2:%.*]] = phi i32 [ [[N]], [[WHILE_COND]] ] 11668b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[END_PTR:%.*]] = phi ptr [ [[D]], [[WHILE_COND]] ] 11678b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br label [[END]] 11688b55d342SMin-Yih Hsu; NO-TRANSFORM: end: 11698b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[MISMATCH_INDEX1]], [[WHILE_FOUND]] ], [ [[MISMATCH_INDEX2]], [[WHILE_END]] ] 11708b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[STORE_PTR:%.*]] = phi ptr [ [[END_PTR]], [[WHILE_END]] ], [ [[FOUND_PTR]], [[WHILE_FOUND]] ] 11718b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: store i32 [[MISMATCH_INDEX]], ptr [[STORE_PTR]], align 4 11728b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: ret i32 [[MISMATCH_INDEX]] 11738b55d342SMin-Yih Hsuentry: 11748b55d342SMin-Yih Hsu br label %while.cond 11758b55d342SMin-Yih Hsu 11768b55d342SMin-Yih Hsuwhile.cond: 11778b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %entry ], [ %inc, %while.body ] 11788b55d342SMin-Yih Hsu %inc = add i32 %len.addr, 1 11798b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 11808b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 11818b55d342SMin-Yih Hsu 11828b55d342SMin-Yih Hsuwhile.body: 11838b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 11848b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 11858b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 11868b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 11878b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 11888b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 11898b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.found 11908b55d342SMin-Yih Hsu 11918b55d342SMin-Yih Hsuwhile.found: 11928b55d342SMin-Yih Hsu %mismatch_index1 = phi i32 [ %inc, %while.body ] 11938b55d342SMin-Yih Hsu %found_ptr = phi ptr [ %c, %while.body ] 11948b55d342SMin-Yih Hsu br label %end 11958b55d342SMin-Yih Hsu 11968b55d342SMin-Yih Hsuwhile.end: 11978b55d342SMin-Yih Hsu %mismatch_index2 = phi i32 [ %n, %while.cond ] 11988b55d342SMin-Yih Hsu %end_ptr = phi ptr [ %d, %while.cond ] 11998b55d342SMin-Yih Hsu br label %end 12008b55d342SMin-Yih Hsu 12018b55d342SMin-Yih Hsuend: 12028b55d342SMin-Yih Hsu %mismatch_index = phi i32 [ %mismatch_index1, %while.found ], [ %mismatch_index2, %while.end ] 12038b55d342SMin-Yih Hsu %store_ptr = phi ptr [ %end_ptr, %while.end ], [ %found_ptr, %while.found ] 12048b55d342SMin-Yih Hsu store i32 %mismatch_index, ptr %store_ptr 12058b55d342SMin-Yih Hsu ret i32 %mismatch_index 12068b55d342SMin-Yih Hsu} 12078b55d342SMin-Yih Hsu 12088b55d342SMin-Yih Hsu 12098b55d342SMin-Yih Hsu 12108b55d342SMin-Yih Hsudefine i32 @compare_bytes_extra_cmp(ptr %a, ptr %b, i32 %len, i32 %n, i32 %x) { 12118b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @compare_bytes_extra_cmp( 12128b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]], i32 [[X:%.*]]) #[[ATTR0]] { 12138b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 12148b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_X:%.*]] = icmp ult i32 [[N]], [[X]] 12158b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_X]], label [[PH:%.*]], label [[WHILE_END:%.*]] 12168b55d342SMin-Yih Hsu; CHECK: ph: 12178b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 12188b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 12198b55d342SMin-Yih Hsu; CHECK: mismatch_min_it_check: 12208b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 12218b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 12228b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 12238b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 12248b55d342SMin-Yih Hsu; CHECK: mismatch_mem_check: 12258b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 12268b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 12278b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 12288b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 12298b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 12308b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 12318b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 12328b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 12338b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 12348b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 12358b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 12368b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 12378b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 12388b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 12398b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 12408b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 12418b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_preheader: 12428b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 12438b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop: 12448b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 12458b55d342SMin-Yih Hsu; CHECK-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 12468b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 12478b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 1248*56c091eaSPaul Walker; CHECK-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 12498b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 1250*56c091eaSPaul Walker; CHECK-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 1251*56c091eaSPaul Walker; CHECK-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 1252*56c091eaSPaul Walker; CHECK-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 12538b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 12548b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 12558b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_inc: 12568b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 12578b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 12588b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 12598b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 12608b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_found: 12618b55d342SMin-Yih Hsu; CHECK-NEXT: [[FIRST2:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 12628b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX3:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 12638b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST2]] to i64 12648b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX3]], [[TMP26]] 12658b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 12668b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_END]] 12678b55d342SMin-Yih Hsu; CHECK: mismatch_loop_pre: 12688b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_LOOP:%.*]] 12698b55d342SMin-Yih Hsu; CHECK: mismatch_loop: 12708b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 12718b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 12728b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 12738b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 12748b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 12758b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 12768b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 12778b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 12788b55d342SMin-Yih Hsu; CHECK: mismatch_loop_inc: 12798b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX]], 1 12808b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 12818b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 12828b55d342SMin-Yih Hsu; CHECK: mismatch_end: 12838b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 12848b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 12858b55d342SMin-Yih Hsu; CHECK: while.cond: 12868b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 12878b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 12888b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 12898b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]] 12908b55d342SMin-Yih Hsu; CHECK: while.body: 12918b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 12928b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 12938b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 12948b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 12958b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 12968b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 12978b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END_LOOPEXIT]] 12988b55d342SMin-Yih Hsu; CHECK: byte.compare: 12998b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_END_LOOPEXIT]] 13008b55d342SMin-Yih Hsu; CHECK: while.end.loopexit: 13018b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC_LCSSA1:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 13028b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_END]] 13038b55d342SMin-Yih Hsu; CHECK: while.end: 13048b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ [[INC_LCSSA1]], [[WHILE_END_LOOPEXIT]] ] 13058b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[INC_LCSSA]] 13068b55d342SMin-Yih Hsu; 13078b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @compare_bytes_extra_cmp( 13088b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]], i32 [[X:%.*]]) #[[ATTR0]] { 13098b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 13108b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_X:%.*]] = icmp ult i32 [[N]], [[X]] 13118b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_X]], label [[PH:%.*]], label [[WHILE_END:%.*]] 13128b55d342SMin-Yih Hsu; LMUL8: ph: 13138b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 13148b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 13158b55d342SMin-Yih Hsu; LMUL8: mismatch_min_it_check: 13168b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 13178b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 13188b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 13198b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 13208b55d342SMin-Yih Hsu; LMUL8: mismatch_mem_check: 13218b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 13228b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 13238b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 13248b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 13258b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 13268b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 13278b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 13288b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 13298b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 13308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 13318b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 13328b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 13338b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 13348b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 13358b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 13368b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 13378b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_preheader: 13388b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 13398b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop: 13408b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 13418b55d342SMin-Yih Hsu; LMUL8-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 13428b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 64, i1 true) 13438b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 1344*56c091eaSPaul Walker; LMUL8-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP20]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 13458b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 1346*56c091eaSPaul Walker; LMUL8-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP21]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 1347*56c091eaSPaul Walker; LMUL8-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 64 x i1> @llvm.vp.icmp.nxv64i8(<vscale x 64 x i8> [[LHS_LOAD]], <vscale x 64 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 1348*56c091eaSPaul Walker; LMUL8-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv64i1(<vscale x 64 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 64 x i1> splat (i1 true), i32 [[TMP19]]) 13498b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 13508b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 13518b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_inc: 13528b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 13538b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 13548b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 13558b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 13568b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_found: 13578b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FIRST2:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 13588b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX3:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 13598b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST2]] to i64 13608b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX3]], [[TMP26]] 13618b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 13628b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_END]] 13638b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_pre: 13648b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_LOOP:%.*]] 13658b55d342SMin-Yih Hsu; LMUL8: mismatch_loop: 13668b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 13678b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 13688b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 13698b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 13708b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 13718b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 13728b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 13738b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 13748b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_inc: 13758b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX]], 1 13768b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 13778b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP36]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 13788b55d342SMin-Yih Hsu; LMUL8: mismatch_end: 13798b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 13808b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 13818b55d342SMin-Yih Hsu; LMUL8: while.cond: 13828b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 13838b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 13848b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 13858b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]] 13868b55d342SMin-Yih Hsu; LMUL8: while.body: 13878b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 13888b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 13898b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP37:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 13908b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 13918b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP38:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 13928b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP37]], [[TMP38]] 13938b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END_LOOPEXIT]] 13948b55d342SMin-Yih Hsu; LMUL8: byte.compare: 13958b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_END_LOOPEXIT]] 13968b55d342SMin-Yih Hsu; LMUL8: while.end.loopexit: 13978b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC_LCSSA1:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 13988b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_END]] 13998b55d342SMin-Yih Hsu; LMUL8: while.end: 14008b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ [[INC_LCSSA1]], [[WHILE_END_LOOPEXIT]] ] 14018b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[INC_LCSSA]] 14028b55d342SMin-Yih Hsu; 14038b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @compare_bytes_extra_cmp( 14048b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]], i32 [[X:%.*]]) #[[ATTR0]] { 14058b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 14068b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_X:%.*]] = icmp ult i32 [[N]], [[X]] 14078b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_X]], label [[PH:%.*]], label [[WHILE_END:%.*]] 14088b55d342SMin-Yih Hsu; LOOP-DEL: ph: 14098b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 14108b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 14118b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 14128b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 14138b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 14148b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_mem_check: 14158b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 14168b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 14178b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP8:%.*]] = ptrtoint ptr [[TMP5]] to i64 14188b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 14198b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP10:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 14208b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP13:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 14218b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP10]] to i64 14228b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP14:%.*]] = ptrtoint ptr [[TMP13]] to i64 14238b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP6:%.*]] = lshr i64 [[TMP7]], 12 14248b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP11]], 12 14258b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP8]], 12 14268b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP14]], 12 14278b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP6]], [[TMP9]] 14288b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP12]], [[TMP15]] 14298b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 14308b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP:%.*]], !prof [[PROF1]] 14318b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop: 14328b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ [[TMP24:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ], [ [[TMP1]], [[MISMATCH_MEM_CHECK]] ] 14338b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[AVL:%.*]] = sub nuw nsw i64 [[TMP2]], [[MISMATCH_VECTOR_INDEX]] 14348b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP19:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 14358b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP20:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VECTOR_INDEX]] 1436*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP20]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 14378b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP21:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VECTOR_INDEX]] 1438*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP21]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 1439*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 1440*56c091eaSPaul Walker; LOOP-DEL-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP19]]) 14418b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP22:%.*]] = icmp ne i32 [[FIRST]], [[TMP19]] 14428b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP22]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 14438b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_inc: 14448b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP23:%.*]] = zext i32 [[TMP19]] to i64 14458b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP24]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP23]] 14468b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP25:%.*]] = icmp ne i64 [[TMP24]], [[TMP2]] 14478b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP25]], label [[MISMATCH_VECTOR_LOOP]], label [[WHILE_END]] 14488b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_vec_loop_found: 14498b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[FIRST2:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 14508b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_VECTOR_INDEX3:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 14518b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP26:%.*]] = zext i32 [[FIRST2]] to i64 14528b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP27:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX3]], [[TMP26]] 14538b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP28:%.*]] = trunc i64 [[TMP27]] to i32 14548b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[WHILE_END]] 14558b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_pre: 14568b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[MISMATCH_LOOP:%.*]] 14578b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop: 14588b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP35:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 14598b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP29:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 14608b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP30:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP29]] 14618b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP31:%.*]] = load i8, ptr [[TMP30]], align 1 14628b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP32:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP29]] 14638b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP33:%.*]] = load i8, ptr [[TMP32]], align 1 14648b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP34:%.*]] = icmp eq i8 [[TMP31]], [[TMP33]] 14658b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP34]], label [[MISMATCH_LOOP_INC]], label [[WHILE_END]] 14668b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop_inc: 14678b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP35]] = add i32 [[MISMATCH_INDEX]], 1 14688b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP36:%.*]] = icmp eq i32 [[TMP35]], [[N]] 14698b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[TMP36]], label [[WHILE_END]], label [[MISMATCH_LOOP]] 14708b55d342SMin-Yih Hsu; LOOP-DEL: while.end: 14718b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP28]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 14728b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[INC_LCSSA]] 14738b55d342SMin-Yih Hsu; 14748b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @compare_bytes_extra_cmp( 14758b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]], i32 [[X:%.*]]) #[[ATTR0]] { 14768b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 14778b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_X:%.*]] = icmp ult i32 [[N]], [[X]] 14788b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_X]], label [[PH:%.*]], label [[WHILE_END:%.*]] 14798b55d342SMin-Yih Hsu; MASKED: ph: 14808b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = add i32 [[LEN]], 1 14818b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 14828b55d342SMin-Yih Hsu; MASKED: mismatch_min_it_check: 14838b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = zext i32 [[TMP0]] to i64 14848b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP2:%.*]] = zext i32 [[N]] to i64 14858b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP3:%.*]] = icmp ule i32 [[TMP0]], [[N]] 14868b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP3]], label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 14878b55d342SMin-Yih Hsu; MASKED: mismatch_mem_check: 14888b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP1]] 14898b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP1]] 14908b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP5]] to i64 14918b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP4]] to i64 14928b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP8:%.*]] = getelementptr i8, ptr [[A]], i64 [[TMP2]] 14938b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP9:%.*]] = getelementptr i8, ptr [[B]], i64 [[TMP2]] 14948b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP8]] to i64 14958b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP11:%.*]] = ptrtoint ptr [[TMP9]] to i64 14968b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP12:%.*]] = lshr i64 [[TMP7]], 12 14978b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP13:%.*]] = lshr i64 [[TMP10]], 12 14988b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP14:%.*]] = lshr i64 [[TMP6]], 12 14998b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP15:%.*]] = lshr i64 [[TMP11]], 12 15008b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP16:%.*]] = icmp ne i64 [[TMP12]], [[TMP13]] 15018b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP17:%.*]] = icmp ne i64 [[TMP14]], [[TMP15]] 15028b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP18:%.*]] = or i1 [[TMP16]], [[TMP17]] 15038b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP18]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VEC_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 15048b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_preheader: 15058b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP19:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP1]], i64 [[TMP2]]) 15068b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP20:%.*]] = call i64 @llvm.vscale.i64() 15078b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP21:%.*]] = mul nuw nsw i64 [[TMP20]], 16 15088b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_VEC_LOOP:%.*]] 15098b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop: 15108b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP19]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP30:%.*]], [[MISMATCH_VEC_LOOP_INC:%.*]] ] 15118b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_INDEX:%.*]] = phi i64 [ [[TMP1]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP29:%.*]], [[MISMATCH_VEC_LOOP_INC]] ] 15128b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP22:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[MISMATCH_VEC_INDEX]] 15138b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP23:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP22]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 15148b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP24:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[MISMATCH_VEC_INDEX]] 15158b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP25:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP24]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 15168b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP26:%.*]] = icmp ne <vscale x 16 x i8> [[TMP23]], [[TMP25]] 15178b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP27:%.*]] = select <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i1> [[TMP26]], <vscale x 16 x i1> zeroinitializer 15188b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP28:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP27]]) 15198b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP28]], label [[MISMATCH_VEC_LOOP_FOUND:%.*]], label [[MISMATCH_VEC_LOOP_INC]] 15208b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_inc: 15218b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP29]] = add nuw nsw i64 [[MISMATCH_VEC_INDEX]], [[TMP21]] 15228b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP30]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP29]], i64 [[TMP2]]) 15238b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP31:%.*]] = extractelement <vscale x 16 x i1> [[TMP30]], i64 0 15248b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP31]], label [[MISMATCH_VEC_LOOP]], label [[MISMATCH_END:%.*]] 15258b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_found: 15268b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP27]], [[MISMATCH_VEC_LOOP]] ] 15278b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LAST_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[MISMATCH_VEC_LOOP_PRED]], [[MISMATCH_VEC_LOOP]] ] 15288b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_INDEX:%.*]] = phi i64 [ [[MISMATCH_VEC_INDEX]], [[MISMATCH_VEC_LOOP]] ] 15298b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP32:%.*]] = and <vscale x 16 x i1> [[MISMATCH_VEC_LAST_LOOP_PRED]], [[MISMATCH_VEC_FOUND_PRED]] 15308b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP33:%.*]] = call i32 @llvm.experimental.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[TMP32]], i1 true) 15318b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP34:%.*]] = zext i32 [[TMP33]] to i64 15328b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP35:%.*]] = add nuw nsw i64 [[MISMATCH_VEC_FOUND_INDEX]], [[TMP34]] 15338b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP36:%.*]] = trunc i64 [[TMP35]] to i32 15348b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_END]] 15358b55d342SMin-Yih Hsu; MASKED: mismatch_loop_pre: 15368b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_LOOP:%.*]] 15378b55d342SMin-Yih Hsu; MASKED: mismatch_loop: 15388b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ [[TMP0]], [[MISMATCH_LOOP_PRE]] ], [ [[TMP43:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 15398b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP37:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 15408b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP38:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[TMP37]] 15418b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP39:%.*]] = load i8, ptr [[TMP38]], align 1 15428b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP40:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[TMP37]] 15438b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP41:%.*]] = load i8, ptr [[TMP40]], align 1 15448b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP42:%.*]] = icmp eq i8 [[TMP39]], [[TMP41]] 15458b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP42]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 15468b55d342SMin-Yih Hsu; MASKED: mismatch_loop_inc: 15478b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP43]] = add i32 [[MISMATCH_INDEX]], 1 15488b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP44:%.*]] = icmp eq i32 [[TMP43]], [[N]] 15498b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP44]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 15508b55d342SMin-Yih Hsu; MASKED: mismatch_end: 15518b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ [[N]], [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ [[N]], [[MISMATCH_VEC_LOOP_INC]] ], [ [[TMP36]], [[MISMATCH_VEC_LOOP_FOUND]] ] 15528b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 15538b55d342SMin-Yih Hsu; MASKED: while.cond: 15548b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[MISMATCH_END]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ] 15558b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC:%.*]] = add i32 [[LEN_ADDR]], 1 15568b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], [[N]] 15578b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END_LOOPEXIT:%.*]], label [[WHILE_BODY]] 15588b55d342SMin-Yih Hsu; MASKED: while.body: 15598b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 15608b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 15618b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP45:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 15628b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 15638b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP46:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 15648b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP45]], [[TMP46]] 15658b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END_LOOPEXIT]] 15668b55d342SMin-Yih Hsu; MASKED: byte.compare: 15678b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_END_LOOPEXIT]] 15688b55d342SMin-Yih Hsu; MASKED: while.end.loopexit: 15698b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC_LCSSA1:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_COND]] ], [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 15708b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_END]] 15718b55d342SMin-Yih Hsu; MASKED: while.end: 15728b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[X]], [[ENTRY:%.*]] ], [ [[INC_LCSSA1]], [[WHILE_END_LOOPEXIT]] ] 15738b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[INC_LCSSA]] 15748b55d342SMin-Yih Hsu; 15758b55d342SMin-Yih Hsu; NO-TRANSFORM-LABEL: define i32 @compare_bytes_extra_cmp( 15768b55d342SMin-Yih Hsu; NO-TRANSFORM-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]], i32 [[X:%.*]]) { 15778b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: entry: 15788b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_X:%.*]] = icmp ult i32 [[N]], [[X]] 15798b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_X]], label [[PH:%.*]], label [[WHILE_END:%.*]] 15808b55d342SMin-Yih Hsu; NO-TRANSFORM: ph: 15818b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br label [[WHILE_COND:%.*]] 15828b55d342SMin-Yih Hsu; NO-TRANSFORM: while.cond: 15838b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[PH]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 15848b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 15858b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 15868b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END]], label [[WHILE_BODY]] 15878b55d342SMin-Yih Hsu; NO-TRANSFORM: while.body: 15888b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 15898b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 15908b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 15918b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 15928b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 15938b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 15948b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 15958b55d342SMin-Yih Hsu; NO-TRANSFORM: while.end: 15968b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ], [ [[X]], [[ENTRY:%.*]] ] 15978b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: ret i32 [[INC_LCSSA]] 15988b55d342SMin-Yih Hsuentry: 15998b55d342SMin-Yih Hsu %cmp.x = icmp ult i32 %n, %x 16008b55d342SMin-Yih Hsu br i1 %cmp.x, label %ph, label %while.end 16018b55d342SMin-Yih Hsu 16028b55d342SMin-Yih Hsuph: 16038b55d342SMin-Yih Hsu br label %while.cond 16048b55d342SMin-Yih Hsu 16058b55d342SMin-Yih Hsuwhile.cond: 16068b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %ph ], [ %inc, %while.body ] 16078b55d342SMin-Yih Hsu %inc = add i32 %len.addr, 1 16088b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 16098b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 16108b55d342SMin-Yih Hsu 16118b55d342SMin-Yih Hsuwhile.body: 16128b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 16138b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 16148b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 16158b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 16168b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 16178b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 16188b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.end 16198b55d342SMin-Yih Hsu 16208b55d342SMin-Yih Hsuwhile.end: 16218b55d342SMin-Yih Hsu %inc.lcssa = phi i32 [ %inc, %while.body ], [ %inc, %while.cond ], [ %x, %entry ] 16228b55d342SMin-Yih Hsu ret i32 %inc.lcssa 16238b55d342SMin-Yih Hsu} 16248b55d342SMin-Yih Hsu 16258b55d342SMin-Yih Hsudefine void @compare_bytes_cleanup_block(ptr %src1, ptr %src2) { 16268b55d342SMin-Yih Hsu; CHECK-LABEL: define void @compare_bytes_cleanup_block( 16278b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[SRC1:%.*]], ptr [[SRC2:%.*]]) #[[ATTR0]] { 16288b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 16298b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 16308b55d342SMin-Yih Hsu; CHECK: mismatch_min_it_check: 16318b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 false, label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 16328b55d342SMin-Yih Hsu; CHECK: mismatch_mem_check: 16338b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[SRC1]], i64 1 16348b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[SRC2]], i64 1 16358b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP1]] to i64 16368b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP0]] to i64 16378b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[SRC1]], i64 0 16388b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[SRC2]], i64 0 16398b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[TMP3]] to i64 16408b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP6]] to i64 16418b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP10]], 12 16428b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 12 16438b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP9]], 12 16448b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP11:%.*]] = lshr i64 [[TMP7]], 12 16458b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP12:%.*]] = icmp ne i64 [[TMP2]], [[TMP5]] 16468b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP13:%.*]] = icmp ne i64 [[TMP8]], [[TMP11]] 16478b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP14:%.*]] = or i1 [[TMP12]], [[TMP13]] 16488b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP14]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 16498b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_preheader: 16508b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 16518b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop: 16528b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ 1, [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP20:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 16538b55d342SMin-Yih Hsu; CHECK-NEXT: [[AVL:%.*]] = sub nuw nsw i64 0, [[MISMATCH_VECTOR_INDEX]] 16548b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP15:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 16, i1 true) 16558b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[MISMATCH_VECTOR_INDEX]] 1656*56c091eaSPaul Walker; CHECK-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP16]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP15]]) 16578b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[MISMATCH_VECTOR_INDEX]] 1658*56c091eaSPaul Walker; CHECK-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 16 x i8> @llvm.vp.load.nxv16i8.p0(ptr [[TMP17]], <vscale x 16 x i1> splat (i1 true), i32 [[TMP15]]) 1659*56c091eaSPaul Walker; CHECK-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 16 x i1> @llvm.vp.icmp.nxv16i8(<vscale x 16 x i8> [[LHS_LOAD]], <vscale x 16 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 16 x i1> splat (i1 true), i32 [[TMP15]]) 1660*56c091eaSPaul Walker; CHECK-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 16 x i1> splat (i1 true), i32 [[TMP15]]) 16618b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP18:%.*]] = icmp ne i32 [[FIRST]], [[TMP15]] 16628b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP18]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 16638b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_inc: 16648b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP19:%.*]] = zext i32 [[TMP15]] to i64 16658b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP20]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP19]] 16668b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP21:%.*]] = icmp ne i64 [[TMP20]], 0 16678b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP21]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 16688b55d342SMin-Yih Hsu; CHECK: mismatch_vec_loop_found: 16698b55d342SMin-Yih Hsu; CHECK-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 16708b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 16718b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP22:%.*]] = zext i32 [[FIRST1]] to i64 16728b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP23:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP22]] 16738b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP24:%.*]] = trunc i64 [[TMP23]] to i32 16748b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_END]] 16758b55d342SMin-Yih Hsu; CHECK: mismatch_loop_pre: 16768b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[MISMATCH_LOOP:%.*]] 16778b55d342SMin-Yih Hsu; CHECK: mismatch_loop: 16788b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ 1, [[MISMATCH_LOOP_PRE]] ], [ [[TMP31:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 16798b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP25:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 16808b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP26:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[TMP25]] 16818b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP27:%.*]] = load i8, ptr [[TMP26]], align 1 16828b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP28:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[TMP25]] 16838b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP29:%.*]] = load i8, ptr [[TMP28]], align 1 16848b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP30:%.*]] = icmp eq i8 [[TMP27]], [[TMP29]] 16858b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP30]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 16868b55d342SMin-Yih Hsu; CHECK: mismatch_loop_inc: 16878b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP31]] = add i32 [[MISMATCH_INDEX]], 1 16888b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 0 16898b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP32]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 16908b55d342SMin-Yih Hsu; CHECK: mismatch_end: 16918b55d342SMin-Yih Hsu; CHECK-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ 0, [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ 0, [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP24]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 16928b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 16938b55d342SMin-Yih Hsu; CHECK: while.cond: 16948b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ], [ 0, [[MISMATCH_END]] ] 16958b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC:%.*]] = add i32 [[LEN]], 1 16968b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], 0 16978b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[CLEANUP_THREAD:%.*]], label [[WHILE_BODY]] 16988b55d342SMin-Yih Hsu; CHECK: while.body: 16998b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 17008b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[IDXPROM]] 17018b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP33:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 17028b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[IDXPROM]] 17038b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP34:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 17048b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP33]], [[TMP34]] 17058b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[IF_END:%.*]] 17068b55d342SMin-Yih Hsu; CHECK: byte.compare: 17078b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP35:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], 0 17088b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[TMP35]], label [[CLEANUP_THREAD]], label [[IF_END]] 17098b55d342SMin-Yih Hsu; CHECK: cleanup.thread: 17108b55d342SMin-Yih Hsu; CHECK-NEXT: ret void 17118b55d342SMin-Yih Hsu; CHECK: if.end: 17128b55d342SMin-Yih Hsu; CHECK-NEXT: [[RES:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 17138b55d342SMin-Yih Hsu; CHECK-NEXT: ret void 17148b55d342SMin-Yih Hsu; 17158b55d342SMin-Yih Hsu; LMUL8-LABEL: define void @compare_bytes_cleanup_block( 17168b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[SRC1:%.*]], ptr [[SRC2:%.*]]) #[[ATTR0]] { 17178b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 17188b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 17198b55d342SMin-Yih Hsu; LMUL8: mismatch_min_it_check: 17208b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 false, label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 17218b55d342SMin-Yih Hsu; LMUL8: mismatch_mem_check: 17228b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[SRC1]], i64 1 17238b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[SRC2]], i64 1 17248b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP9:%.*]] = ptrtoint ptr [[TMP1]] to i64 17258b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP10:%.*]] = ptrtoint ptr [[TMP0]] to i64 17268b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[SRC1]], i64 0 17278b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP6:%.*]] = getelementptr i8, ptr [[SRC2]], i64 0 17288b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP4:%.*]] = ptrtoint ptr [[TMP3]] to i64 17298b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP6]] to i64 17308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP2:%.*]] = lshr i64 [[TMP10]], 12 17318b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP5:%.*]] = lshr i64 [[TMP4]], 12 17328b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP9]], 12 17338b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP11:%.*]] = lshr i64 [[TMP7]], 12 17348b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP12:%.*]] = icmp ne i64 [[TMP2]], [[TMP5]] 17358b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP13:%.*]] = icmp ne i64 [[TMP8]], [[TMP11]] 17368b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP14:%.*]] = or i1 [[TMP12]], [[TMP13]] 17378b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP14]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VECTOR_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 17388b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_preheader: 17398b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_VECTOR_LOOP:%.*]] 17408b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop: 17418b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX:%.*]] = phi i64 [ 1, [[MISMATCH_VECTOR_LOOP_PREHEADER]] ], [ [[TMP20:%.*]], [[MISMATCH_VECTOR_LOOP_INC:%.*]] ] 17428b55d342SMin-Yih Hsu; LMUL8-NEXT: [[AVL:%.*]] = sub nuw nsw i64 0, [[MISMATCH_VECTOR_INDEX]] 17438b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP15:%.*]] = call i32 @llvm.experimental.get.vector.length.i64(i64 [[AVL]], i32 64, i1 true) 17448b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP16:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[MISMATCH_VECTOR_INDEX]] 1745*56c091eaSPaul Walker; LMUL8-NEXT: [[LHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP16]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP15]]) 17468b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP17:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[MISMATCH_VECTOR_INDEX]] 1747*56c091eaSPaul Walker; LMUL8-NEXT: [[RHS_LOAD:%.*]] = call <vscale x 64 x i8> @llvm.vp.load.nxv64i8.p0(ptr [[TMP17]], <vscale x 64 x i1> splat (i1 true), i32 [[TMP15]]) 1748*56c091eaSPaul Walker; LMUL8-NEXT: [[MISMATCH_CMP:%.*]] = call <vscale x 64 x i1> @llvm.vp.icmp.nxv64i8(<vscale x 64 x i8> [[LHS_LOAD]], <vscale x 64 x i8> [[RHS_LOAD]], metadata !"ne", <vscale x 64 x i1> splat (i1 true), i32 [[TMP15]]) 1749*56c091eaSPaul Walker; LMUL8-NEXT: [[FIRST:%.*]] = call i32 @llvm.vp.cttz.elts.i32.nxv64i1(<vscale x 64 x i1> [[MISMATCH_CMP]], i1 false, <vscale x 64 x i1> splat (i1 true), i32 [[TMP15]]) 17508b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP18:%.*]] = icmp ne i32 [[FIRST]], [[TMP15]] 17518b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP18]], label [[MISMATCH_VECTOR_LOOP_FOUND:%.*]], label [[MISMATCH_VECTOR_LOOP_INC]] 17528b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_inc: 17538b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP19:%.*]] = zext i32 [[TMP15]] to i64 17548b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP20]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX]], [[TMP19]] 17558b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP21:%.*]] = icmp ne i64 [[TMP20]], 0 17568b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP21]], label [[MISMATCH_VECTOR_LOOP]], label [[MISMATCH_END:%.*]] 17578b55d342SMin-Yih Hsu; LMUL8: mismatch_vec_loop_found: 17588b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FIRST1:%.*]] = phi i32 [ [[FIRST]], [[MISMATCH_VECTOR_LOOP]] ] 17598b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_VECTOR_INDEX2:%.*]] = phi i64 [ [[MISMATCH_VECTOR_INDEX]], [[MISMATCH_VECTOR_LOOP]] ] 17608b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP22:%.*]] = zext i32 [[FIRST1]] to i64 17618b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP23:%.*]] = add nuw nsw i64 [[MISMATCH_VECTOR_INDEX2]], [[TMP22]] 17628b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP24:%.*]] = trunc i64 [[TMP23]] to i32 17638b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_END]] 17648b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_pre: 17658b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[MISMATCH_LOOP:%.*]] 17668b55d342SMin-Yih Hsu; LMUL8: mismatch_loop: 17678b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ 1, [[MISMATCH_LOOP_PRE]] ], [ [[TMP31:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 17688b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP25:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 17698b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP26:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[TMP25]] 17708b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP27:%.*]] = load i8, ptr [[TMP26]], align 1 17718b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP28:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[TMP25]] 17728b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP29:%.*]] = load i8, ptr [[TMP28]], align 1 17738b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP30:%.*]] = icmp eq i8 [[TMP27]], [[TMP29]] 17748b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP30]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 17758b55d342SMin-Yih Hsu; LMUL8: mismatch_loop_inc: 17768b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP31]] = add i32 [[MISMATCH_INDEX]], 1 17778b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP32:%.*]] = icmp eq i32 [[TMP31]], 0 17788b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP32]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 17798b55d342SMin-Yih Hsu; LMUL8: mismatch_end: 17808b55d342SMin-Yih Hsu; LMUL8-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ 0, [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ 0, [[MISMATCH_VECTOR_LOOP_INC]] ], [ [[TMP24]], [[MISMATCH_VECTOR_LOOP_FOUND]] ] 17818b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 17828b55d342SMin-Yih Hsu; LMUL8: while.cond: 17838b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ], [ 0, [[MISMATCH_END]] ] 17848b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC:%.*]] = add i32 [[LEN]], 1 17858b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], 0 17868b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[CLEANUP_THREAD:%.*]], label [[WHILE_BODY]] 17878b55d342SMin-Yih Hsu; LMUL8: while.body: 17888b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 17898b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[IDXPROM]] 17908b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP33:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 17918b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[IDXPROM]] 17928b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP34:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 17938b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP33]], [[TMP34]] 17948b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[IF_END:%.*]] 17958b55d342SMin-Yih Hsu; LMUL8: byte.compare: 17968b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP35:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], 0 17978b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[TMP35]], label [[CLEANUP_THREAD]], label [[IF_END]] 17988b55d342SMin-Yih Hsu; LMUL8: cleanup.thread: 17998b55d342SMin-Yih Hsu; LMUL8-NEXT: ret void 18008b55d342SMin-Yih Hsu; LMUL8: if.end: 18018b55d342SMin-Yih Hsu; LMUL8-NEXT: [[RES:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 18028b55d342SMin-Yih Hsu; LMUL8-NEXT: ret void 18038b55d342SMin-Yih Hsu; 18048b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define void @compare_bytes_cleanup_block( 18058b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[SRC1:%.*]], ptr [[SRC2:%.*]]) #[[ATTR0]] { 18068b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 18078b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[MISMATCH_LOOP:%.*]] 18088b55d342SMin-Yih Hsu; LOOP-DEL: mismatch_loop: 18098b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ 1, [[ENTRY:%.*]] ], [ [[TMP6:%.*]], [[MISMATCH_LOOP]] ] 18108b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 18118b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[TMP0]] 18128b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP2:%.*]] = load i8, ptr [[TMP1]], align 1 18138b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP3:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[TMP0]] 18148b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP4:%.*]] = load i8, ptr [[TMP3]], align 1 18158b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP5:%.*]] = icmp ne i8 [[TMP2]], [[TMP4]] 18168b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP6]] = add i32 [[MISMATCH_INDEX]], 1 18178b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP7:%.*]] = icmp eq i32 [[TMP6]], 0 18188b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[OR_COND:%.*]] = or i1 [[TMP5]], [[TMP7]] 18198b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[OR_COND]], label [[COMMON_RET:%.*]], label [[MISMATCH_LOOP]] 18208b55d342SMin-Yih Hsu; LOOP-DEL: common.ret: 18218b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret void 18228b55d342SMin-Yih Hsu; 18238b55d342SMin-Yih Hsu; MASKED-LABEL: define void @compare_bytes_cleanup_block( 18248b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[SRC1:%.*]], ptr [[SRC2:%.*]]) #[[ATTR0]] { 18258b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 18268b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_MIN_IT_CHECK:%.*]] 18278b55d342SMin-Yih Hsu; MASKED: mismatch_min_it_check: 18288b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 false, label [[MISMATCH_MEM_CHECK:%.*]], label [[MISMATCH_LOOP_PRE:%.*]], !prof [[PROF0]] 18298b55d342SMin-Yih Hsu; MASKED: mismatch_mem_check: 18308b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = getelementptr i8, ptr [[SRC1]], i64 1 18318b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = getelementptr i8, ptr [[SRC2]], i64 1 18328b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP2:%.*]] = ptrtoint ptr [[TMP1]] to i64 18338b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP3:%.*]] = ptrtoint ptr [[TMP0]] to i64 18348b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP4:%.*]] = getelementptr i8, ptr [[SRC1]], i64 0 18358b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP5:%.*]] = getelementptr i8, ptr [[SRC2]], i64 0 18368b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP6:%.*]] = ptrtoint ptr [[TMP4]] to i64 18378b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP7:%.*]] = ptrtoint ptr [[TMP5]] to i64 18388b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP8:%.*]] = lshr i64 [[TMP3]], 12 18398b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP9:%.*]] = lshr i64 [[TMP6]], 12 18408b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP10:%.*]] = lshr i64 [[TMP2]], 12 18418b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP11:%.*]] = lshr i64 [[TMP7]], 12 18428b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP12:%.*]] = icmp ne i64 [[TMP8]], [[TMP9]] 18438b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP13:%.*]] = icmp ne i64 [[TMP10]], [[TMP11]] 18448b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP14:%.*]] = or i1 [[TMP12]], [[TMP13]] 18458b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP14]], label [[MISMATCH_LOOP_PRE]], label [[MISMATCH_VEC_LOOP_PREHEADER:%.*]], !prof [[PROF1]] 18468b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_preheader: 18478b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP15:%.*]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 1, i64 0) 18488b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP16:%.*]] = call i64 @llvm.vscale.i64() 18498b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP17:%.*]] = mul nuw nsw i64 [[TMP16]], 16 18508b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_VEC_LOOP:%.*]] 18518b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop: 18528b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP15]], [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP26:%.*]], [[MISMATCH_VEC_LOOP_INC:%.*]] ] 18538b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_INDEX:%.*]] = phi i64 [ 1, [[MISMATCH_VEC_LOOP_PREHEADER]] ], [ [[TMP25:%.*]], [[MISMATCH_VEC_LOOP_INC]] ] 18548b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP18:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[MISMATCH_VEC_INDEX]] 18558b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP19:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP18]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 18568b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP20:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[MISMATCH_VEC_INDEX]] 18578b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP21:%.*]] = call <vscale x 16 x i8> @llvm.masked.load.nxv16i8.p0(ptr [[TMP20]], i32 1, <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i8> zeroinitializer) 18588b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP22:%.*]] = icmp ne <vscale x 16 x i8> [[TMP19]], [[TMP21]] 18598b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP23:%.*]] = select <vscale x 16 x i1> [[MISMATCH_VEC_LOOP_PRED]], <vscale x 16 x i1> [[TMP22]], <vscale x 16 x i1> zeroinitializer 18608b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP24:%.*]] = call i1 @llvm.vector.reduce.or.nxv16i1(<vscale x 16 x i1> [[TMP23]]) 18618b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP24]], label [[MISMATCH_VEC_LOOP_FOUND:%.*]], label [[MISMATCH_VEC_LOOP_INC]] 18628b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_inc: 18638b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP25]] = add nuw nsw i64 [[MISMATCH_VEC_INDEX]], [[TMP17]] 18648b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP26]] = call <vscale x 16 x i1> @llvm.get.active.lane.mask.nxv16i1.i64(i64 [[TMP25]], i64 0) 18658b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP27:%.*]] = extractelement <vscale x 16 x i1> [[TMP26]], i64 0 18668b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP27]], label [[MISMATCH_VEC_LOOP]], label [[MISMATCH_END:%.*]] 18678b55d342SMin-Yih Hsu; MASKED: mismatch_vec_loop_found: 18688b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_PRED:%.*]] = phi <vscale x 16 x i1> [ [[TMP23]], [[MISMATCH_VEC_LOOP]] ] 18698b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_LAST_LOOP_PRED:%.*]] = phi <vscale x 16 x i1> [ [[MISMATCH_VEC_LOOP_PRED]], [[MISMATCH_VEC_LOOP]] ] 18708b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_VEC_FOUND_INDEX:%.*]] = phi i64 [ [[MISMATCH_VEC_INDEX]], [[MISMATCH_VEC_LOOP]] ] 18718b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP28:%.*]] = and <vscale x 16 x i1> [[MISMATCH_VEC_LAST_LOOP_PRED]], [[MISMATCH_VEC_FOUND_PRED]] 18728b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP29:%.*]] = call i32 @llvm.experimental.cttz.elts.i32.nxv16i1(<vscale x 16 x i1> [[TMP28]], i1 true) 18738b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP30:%.*]] = zext i32 [[TMP29]] to i64 18748b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP31:%.*]] = add nuw nsw i64 [[MISMATCH_VEC_FOUND_INDEX]], [[TMP30]] 18758b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP32:%.*]] = trunc i64 [[TMP31]] to i32 18768b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_END]] 18778b55d342SMin-Yih Hsu; MASKED: mismatch_loop_pre: 18788b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[MISMATCH_LOOP:%.*]] 18798b55d342SMin-Yih Hsu; MASKED: mismatch_loop: 18808b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_INDEX:%.*]] = phi i32 [ 1, [[MISMATCH_LOOP_PRE]] ], [ [[TMP39:%.*]], [[MISMATCH_LOOP_INC:%.*]] ] 18818b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP33:%.*]] = zext i32 [[MISMATCH_INDEX]] to i64 18828b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP34:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[TMP33]] 18838b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP35:%.*]] = load i8, ptr [[TMP34]], align 1 18848b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP36:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[TMP33]] 18858b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP37:%.*]] = load i8, ptr [[TMP36]], align 1 18868b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP38:%.*]] = icmp eq i8 [[TMP35]], [[TMP37]] 18878b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP38]], label [[MISMATCH_LOOP_INC]], label [[MISMATCH_END]] 18888b55d342SMin-Yih Hsu; MASKED: mismatch_loop_inc: 18898b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP39]] = add i32 [[MISMATCH_INDEX]], 1 18908b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP40:%.*]] = icmp eq i32 [[TMP39]], 0 18918b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP40]], label [[MISMATCH_END]], label [[MISMATCH_LOOP]] 18928b55d342SMin-Yih Hsu; MASKED: mismatch_end: 18938b55d342SMin-Yih Hsu; MASKED-NEXT: [[MISMATCH_RESULT:%.*]] = phi i32 [ 0, [[MISMATCH_LOOP_INC]] ], [ [[MISMATCH_INDEX]], [[MISMATCH_LOOP]] ], [ 0, [[MISMATCH_VEC_LOOP_INC]] ], [ [[TMP32]], [[MISMATCH_VEC_LOOP_FOUND]] ] 18948b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 true, label [[BYTE_COMPARE:%.*]], label [[WHILE_COND:%.*]] 18958b55d342SMin-Yih Hsu; MASKED: while.cond: 18968b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY:%.*]] ], [ 0, [[MISMATCH_END]] ] 18978b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC:%.*]] = add i32 [[LEN]], 1 18988b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], 0 18998b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[CLEANUP_THREAD:%.*]], label [[WHILE_BODY]] 19008b55d342SMin-Yih Hsu; MASKED: while.body: 19018b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[MISMATCH_RESULT]] to i64 19028b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[IDXPROM]] 19038b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP41:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 19048b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[IDXPROM]] 19058b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP42:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 19068b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP41]], [[TMP42]] 19078b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[IF_END:%.*]] 19088b55d342SMin-Yih Hsu; MASKED: byte.compare: 19098b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP43:%.*]] = icmp eq i32 [[MISMATCH_RESULT]], 0 19108b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[TMP43]], label [[CLEANUP_THREAD]], label [[IF_END]] 19118b55d342SMin-Yih Hsu; MASKED: cleanup.thread: 19128b55d342SMin-Yih Hsu; MASKED-NEXT: ret void 19138b55d342SMin-Yih Hsu; MASKED: if.end: 19148b55d342SMin-Yih Hsu; MASKED-NEXT: [[RES:%.*]] = phi i32 [ [[MISMATCH_RESULT]], [[WHILE_BODY]] ], [ [[MISMATCH_RESULT]], [[BYTE_COMPARE]] ] 19158b55d342SMin-Yih Hsu; MASKED-NEXT: ret void 19168b55d342SMin-Yih Hsu; 19178b55d342SMin-Yih Hsu; NO-TRANSFORM-LABEL: define void @compare_bytes_cleanup_block( 19188b55d342SMin-Yih Hsu; NO-TRANSFORM-SAME: ptr [[SRC1:%.*]], ptr [[SRC2:%.*]]) { 19198b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: entry: 19208b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br label [[WHILE_COND:%.*]] 19218b55d342SMin-Yih Hsu; NO-TRANSFORM: while.cond: 19228b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[LEN:%.*]] = phi i32 [ [[INC:%.*]], [[WHILE_BODY:%.*]] ], [ 0, [[ENTRY:%.*]] ] 19238b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[INC]] = add i32 [[LEN]], 1 19248b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], 0 19258b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT]], label [[CLEANUP_THREAD:%.*]], label [[WHILE_BODY]] 19268b55d342SMin-Yih Hsu; NO-TRANSFORM: while.body: 19278b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 19288b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX:%.*]] = getelementptr i8, ptr [[SRC1]], i64 [[IDXPROM]] 19298b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 19308b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[ARRAYIDX2:%.*]] = getelementptr i8, ptr [[SRC2]], i64 [[IDXPROM]] 19318b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 19328b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 19338b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[IF_END:%.*]] 19348b55d342SMin-Yih Hsu; NO-TRANSFORM: cleanup.thread: 19358b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: ret void 19368b55d342SMin-Yih Hsu; NO-TRANSFORM: if.end: 19378b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: [[RES:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ] 19388b55d342SMin-Yih Hsu; NO-TRANSFORM-NEXT: ret void 19398b55d342SMin-Yih Hsuentry: 19408b55d342SMin-Yih Hsu br label %while.cond 19418b55d342SMin-Yih Hsu 19428b55d342SMin-Yih Hsuwhile.cond: 19438b55d342SMin-Yih Hsu %len = phi i32 [ %inc, %while.body ], [ 0, %entry ] 19448b55d342SMin-Yih Hsu %inc = add i32 %len, 1 19458b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, 0 19468b55d342SMin-Yih Hsu br i1 %cmp.not, label %cleanup.thread, label %while.body 19478b55d342SMin-Yih Hsu 19488b55d342SMin-Yih Hsuwhile.body: 19498b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 19508b55d342SMin-Yih Hsu %arrayidx = getelementptr i8, ptr %src1, i64 %idxprom 19518b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx, align 1 19528b55d342SMin-Yih Hsu %arrayidx2 = getelementptr i8, ptr %src2, i64 %idxprom 19538b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2, align 1 19548b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 19558b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %if.end 19568b55d342SMin-Yih Hsu 19578b55d342SMin-Yih Hsucleanup.thread: 19588b55d342SMin-Yih Hsu ret void 19598b55d342SMin-Yih Hsu 19608b55d342SMin-Yih Hsuif.end: 19618b55d342SMin-Yih Hsu %res = phi i32 [ %inc, %while.body ] 19628b55d342SMin-Yih Hsu ret void 19638b55d342SMin-Yih Hsu} 19648b55d342SMin-Yih Hsu 19658b55d342SMin-Yih Hsu; 19668b55d342SMin-Yih Hsu; NEGATIVE TESTS 19678b55d342SMin-Yih Hsu; 19688b55d342SMin-Yih Hsu 19698b55d342SMin-Yih Hsu; Similar to @compare_bytes_simple, except in the while.end block we have an extra PHI 19708b55d342SMin-Yih Hsu; with unique values for each incoming block from the loop. 19718b55d342SMin-Yih Hsudefine i32 @compare_bytes_simple2(ptr %a, ptr %b, ptr %c, ptr %d, i32 %len, i32 %n) { 19728b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @compare_bytes_simple2( 19738b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 19748b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 19758b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_COND:%.*]] 19768b55d342SMin-Yih Hsu; CHECK: while.cond: 19778b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 19788b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 19798b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 19808b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 19818b55d342SMin-Yih Hsu; CHECK: while.body: 19828b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 19838b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 19848b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 19858b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 19868b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 19878b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 19888b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 19898b55d342SMin-Yih Hsu; CHECK: while.end: 19908b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 19918b55d342SMin-Yih Hsu; CHECK-NEXT: [[FINAL_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[D]], [[WHILE_COND]] ] 19928b55d342SMin-Yih Hsu; CHECK-NEXT: store i32 [[INC_LCSSA]], ptr [[FINAL_PTR]], align 4 19938b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[INC_LCSSA]] 19948b55d342SMin-Yih Hsu; 19958b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @compare_bytes_simple2( 19968b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 19978b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 19988b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_COND:%.*]] 19998b55d342SMin-Yih Hsu; LMUL8: while.cond: 20008b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 20018b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 20028b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 20038b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 20048b55d342SMin-Yih Hsu; LMUL8: while.body: 20058b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 20068b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 20078b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 20088b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 20098b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 20108b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 20118b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 20128b55d342SMin-Yih Hsu; LMUL8: while.end: 20138b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 20148b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FINAL_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[D]], [[WHILE_COND]] ] 20158b55d342SMin-Yih Hsu; LMUL8-NEXT: store i32 [[INC_LCSSA]], ptr [[FINAL_PTR]], align 4 20168b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[INC_LCSSA]] 20178b55d342SMin-Yih Hsu; 20188b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @compare_bytes_simple2( 20198b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 20208b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 20218b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[WHILE_COND:%.*]] 20228b55d342SMin-Yih Hsu; LOOP-DEL: while.cond: 20238b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 20248b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 20258b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 20268b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 20278b55d342SMin-Yih Hsu; LOOP-DEL: while.body: 20288b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 20298b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 20308b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 20318b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 20328b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 20338b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 20348b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 20358b55d342SMin-Yih Hsu; LOOP-DEL: while.end: 20368b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 20378b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[FINAL_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[D]], [[WHILE_COND]] ] 20388b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: store i32 [[INC_LCSSA]], ptr [[FINAL_PTR]], align 4 20398b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[INC_LCSSA]] 20408b55d342SMin-Yih Hsu; 20418b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @compare_bytes_simple2( 20428b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], ptr [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 20438b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 20448b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_COND:%.*]] 20458b55d342SMin-Yih Hsu; MASKED: while.cond: 20468b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 20478b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 20488b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 20498b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 20508b55d342SMin-Yih Hsu; MASKED: while.body: 20518b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 20528b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 20538b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 20548b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 20558b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 20568b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 20578b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 20588b55d342SMin-Yih Hsu; MASKED: while.end: 20598b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 20608b55d342SMin-Yih Hsu; MASKED-NEXT: [[FINAL_PTR:%.*]] = phi ptr [ [[C]], [[WHILE_BODY]] ], [ [[D]], [[WHILE_COND]] ] 20618b55d342SMin-Yih Hsu; MASKED-NEXT: store i32 [[INC_LCSSA]], ptr [[FINAL_PTR]], align 4 20628b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[INC_LCSSA]] 20638b55d342SMin-Yih Hsu; 20648b55d342SMin-Yih Hsuentry: 20658b55d342SMin-Yih Hsu br label %while.cond 20668b55d342SMin-Yih Hsu 20678b55d342SMin-Yih Hsuwhile.cond: 20688b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %entry ], [ %inc, %while.body ] 20698b55d342SMin-Yih Hsu %inc = add i32 %len.addr, 1 20708b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 20718b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 20728b55d342SMin-Yih Hsu 20738b55d342SMin-Yih Hsuwhile.body: 20748b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 20758b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 20768b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 20778b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 20788b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 20798b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 20808b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.end 20818b55d342SMin-Yih Hsu 20828b55d342SMin-Yih Hsuwhile.end: 20838b55d342SMin-Yih Hsu %inc.lcssa = phi i32 [ %inc, %while.body ], [ %inc, %while.cond ] 20848b55d342SMin-Yih Hsu %final_ptr = phi ptr [ %c, %while.body ], [ %d, %while.cond ] 20858b55d342SMin-Yih Hsu store i32 %inc.lcssa, ptr %final_ptr 20868b55d342SMin-Yih Hsu ret i32 %inc.lcssa 20878b55d342SMin-Yih Hsu} 20888b55d342SMin-Yih Hsu 20898b55d342SMin-Yih Hsudefine i32 @compare_bytes_simple3(ptr %a, ptr %b, ptr %c, i32 %d, i32 %len, i32 %n) { 20908b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @compare_bytes_simple3( 20918b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], i32 [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 20928b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 20938b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_COND:%.*]] 20948b55d342SMin-Yih Hsu; CHECK: while.cond: 20958b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 20968b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 20978b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 20988b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 20998b55d342SMin-Yih Hsu; CHECK: while.body: 21008b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 21018b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 21028b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 21038b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 21048b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 21058b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 21068b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 21078b55d342SMin-Yih Hsu; CHECK: while.end: 21088b55d342SMin-Yih Hsu; CHECK-NEXT: [[FINAL_VAL:%.*]] = phi i32 [ [[D]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 21098b55d342SMin-Yih Hsu; CHECK-NEXT: store i32 [[FINAL_VAL]], ptr [[C]], align 4 21108b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[FINAL_VAL]] 21118b55d342SMin-Yih Hsu; 21128b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @compare_bytes_simple3( 21138b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], i32 [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 21148b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 21158b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_COND:%.*]] 21168b55d342SMin-Yih Hsu; LMUL8: while.cond: 21178b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 21188b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 21198b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 21208b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 21218b55d342SMin-Yih Hsu; LMUL8: while.body: 21228b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 21238b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 21248b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 21258b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 21268b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 21278b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 21288b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 21298b55d342SMin-Yih Hsu; LMUL8: while.end: 21308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[FINAL_VAL:%.*]] = phi i32 [ [[D]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 21318b55d342SMin-Yih Hsu; LMUL8-NEXT: store i32 [[FINAL_VAL]], ptr [[C]], align 4 21328b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[FINAL_VAL]] 21338b55d342SMin-Yih Hsu; 21348b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @compare_bytes_simple3( 21358b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], i32 [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 21368b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 21378b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[WHILE_COND:%.*]] 21388b55d342SMin-Yih Hsu; LOOP-DEL: while.cond: 21398b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 21408b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 21418b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 21428b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 21438b55d342SMin-Yih Hsu; LOOP-DEL: while.body: 21448b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 21458b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 21468b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 21478b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 21488b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 21498b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 21508b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 21518b55d342SMin-Yih Hsu; LOOP-DEL: while.end: 21528b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[FINAL_VAL:%.*]] = phi i32 [ [[D]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 21538b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: store i32 [[FINAL_VAL]], ptr [[C]], align 4 21548b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[FINAL_VAL]] 21558b55d342SMin-Yih Hsu; 21568b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @compare_bytes_simple3( 21578b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], ptr [[C:%.*]], i32 [[D:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR0]] { 21588b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 21598b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_COND:%.*]] 21608b55d342SMin-Yih Hsu; MASKED: while.cond: 21618b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 21628b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 21638b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 21648b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 21658b55d342SMin-Yih Hsu; MASKED: while.body: 21668b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 21678b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 21688b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 21698b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 21708b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 21718b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 21728b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 21738b55d342SMin-Yih Hsu; MASKED: while.end: 21748b55d342SMin-Yih Hsu; MASKED-NEXT: [[FINAL_VAL:%.*]] = phi i32 [ [[D]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 21758b55d342SMin-Yih Hsu; MASKED-NEXT: store i32 [[FINAL_VAL]], ptr [[C]], align 4 21768b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[FINAL_VAL]] 21778b55d342SMin-Yih Hsu; 21788b55d342SMin-Yih Hsu entry: 21798b55d342SMin-Yih Hsu br label %while.cond 21808b55d342SMin-Yih Hsu 21818b55d342SMin-Yih Hsu while.cond: 21828b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %entry ], [ %inc, %while.body ] 21838b55d342SMin-Yih Hsu %inc = add i32 %len.addr, 1 21848b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 21858b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 21868b55d342SMin-Yih Hsu 21878b55d342SMin-Yih Hsu while.body: 21888b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 21898b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 21908b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 21918b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 21928b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 21938b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 21948b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.end 21958b55d342SMin-Yih Hsu 21968b55d342SMin-Yih Hsu while.end: 21978b55d342SMin-Yih Hsu %final_val = phi i32 [ %d, %while.body ], [ %inc, %while.cond ] 21988b55d342SMin-Yih Hsu store i32 %final_val, ptr %c 21998b55d342SMin-Yih Hsu ret i32 %final_val 22008b55d342SMin-Yih Hsu} 22018b55d342SMin-Yih Hsu 22028b55d342SMin-Yih Hsu; Disable the optimization when noimplicitfloat is present. 22038b55d342SMin-Yih Hsudefine i32 @no_implicit_float(ptr %a, ptr %b, i32 %len, i32 %n) noimplicitfloat { 22048b55d342SMin-Yih Hsu; CHECK-LABEL: define i32 @no_implicit_float( 22058b55d342SMin-Yih Hsu; CHECK-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR1:[0-9]+]] { 22068b55d342SMin-Yih Hsu; CHECK-NEXT: entry: 22078b55d342SMin-Yih Hsu; CHECK-NEXT: br label [[WHILE_COND:%.*]] 22088b55d342SMin-Yih Hsu; CHECK: while.cond: 22098b55d342SMin-Yih Hsu; CHECK-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 22108b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 22118b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 22128b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 22138b55d342SMin-Yih Hsu; CHECK: while.body: 22148b55d342SMin-Yih Hsu; CHECK-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 22158b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 22168b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 22178b55d342SMin-Yih Hsu; CHECK-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 22188b55d342SMin-Yih Hsu; CHECK-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 22198b55d342SMin-Yih Hsu; CHECK-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 22208b55d342SMin-Yih Hsu; CHECK-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 22218b55d342SMin-Yih Hsu; CHECK: while.end: 22228b55d342SMin-Yih Hsu; CHECK-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 22238b55d342SMin-Yih Hsu; CHECK-NEXT: ret i32 [[INC_LCSSA]] 22248b55d342SMin-Yih Hsu; 22258b55d342SMin-Yih Hsu; LMUL8-LABEL: define i32 @no_implicit_float( 22268b55d342SMin-Yih Hsu; LMUL8-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR1:[0-9]+]] { 22278b55d342SMin-Yih Hsu; LMUL8-NEXT: entry: 22288b55d342SMin-Yih Hsu; LMUL8-NEXT: br label [[WHILE_COND:%.*]] 22298b55d342SMin-Yih Hsu; LMUL8: while.cond: 22308b55d342SMin-Yih Hsu; LMUL8-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 22318b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 22328b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 22338b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 22348b55d342SMin-Yih Hsu; LMUL8: while.body: 22358b55d342SMin-Yih Hsu; LMUL8-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 22368b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 22378b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 22388b55d342SMin-Yih Hsu; LMUL8-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 22398b55d342SMin-Yih Hsu; LMUL8-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 22408b55d342SMin-Yih Hsu; LMUL8-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 22418b55d342SMin-Yih Hsu; LMUL8-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 22428b55d342SMin-Yih Hsu; LMUL8: while.end: 22438b55d342SMin-Yih Hsu; LMUL8-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 22448b55d342SMin-Yih Hsu; LMUL8-NEXT: ret i32 [[INC_LCSSA]] 22458b55d342SMin-Yih Hsu; 22468b55d342SMin-Yih Hsu; LOOP-DEL-LABEL: define i32 @no_implicit_float( 22478b55d342SMin-Yih Hsu; LOOP-DEL-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR1:[0-9]+]] { 22488b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: entry: 22498b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br label [[WHILE_COND:%.*]] 22508b55d342SMin-Yih Hsu; LOOP-DEL: while.cond: 22518b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 22528b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 22538b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 22548b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 22558b55d342SMin-Yih Hsu; LOOP-DEL: while.body: 22568b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 22578b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 22588b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 22598b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 22608b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 22618b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 22628b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 22638b55d342SMin-Yih Hsu; LOOP-DEL: while.end: 22648b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 22658b55d342SMin-Yih Hsu; LOOP-DEL-NEXT: ret i32 [[INC_LCSSA]] 22668b55d342SMin-Yih Hsu; 22678b55d342SMin-Yih Hsu; MASKED-LABEL: define i32 @no_implicit_float( 22688b55d342SMin-Yih Hsu; MASKED-SAME: ptr [[A:%.*]], ptr [[B:%.*]], i32 [[LEN:%.*]], i32 [[N:%.*]]) #[[ATTR1:[0-9]+]] { 22698b55d342SMin-Yih Hsu; MASKED-NEXT: entry: 22708b55d342SMin-Yih Hsu; MASKED-NEXT: br label [[WHILE_COND:%.*]] 22718b55d342SMin-Yih Hsu; MASKED: while.cond: 22728b55d342SMin-Yih Hsu; MASKED-NEXT: [[LEN_ADDR:%.*]] = phi i32 [ [[LEN]], [[ENTRY:%.*]] ], [ [[INC:%.*]], [[WHILE_BODY:%.*]] ] 22738b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC]] = add i32 [[LEN_ADDR]], 1 22748b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT:%.*]] = icmp eq i32 [[INC]], [[N]] 22758b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT]], label [[WHILE_END:%.*]], label [[WHILE_BODY]] 22768b55d342SMin-Yih Hsu; MASKED: while.body: 22778b55d342SMin-Yih Hsu; MASKED-NEXT: [[IDXPROM:%.*]] = zext i32 [[INC]] to i64 22788b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[A]], i64 [[IDXPROM]] 22798b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 22808b55d342SMin-Yih Hsu; MASKED-NEXT: [[ARRAYIDX2:%.*]] = getelementptr inbounds i8, ptr [[B]], i64 [[IDXPROM]] 22818b55d342SMin-Yih Hsu; MASKED-NEXT: [[TMP1:%.*]] = load i8, ptr [[ARRAYIDX2]], align 1 22828b55d342SMin-Yih Hsu; MASKED-NEXT: [[CMP_NOT2:%.*]] = icmp eq i8 [[TMP0]], [[TMP1]] 22838b55d342SMin-Yih Hsu; MASKED-NEXT: br i1 [[CMP_NOT2]], label [[WHILE_COND]], label [[WHILE_END]] 22848b55d342SMin-Yih Hsu; MASKED: while.end: 22858b55d342SMin-Yih Hsu; MASKED-NEXT: [[INC_LCSSA:%.*]] = phi i32 [ [[INC]], [[WHILE_BODY]] ], [ [[INC]], [[WHILE_COND]] ] 22868b55d342SMin-Yih Hsu; MASKED-NEXT: ret i32 [[INC_LCSSA]] 22878b55d342SMin-Yih Hsu; 22888b55d342SMin-Yih Hsuentry: 22898b55d342SMin-Yih Hsu br label %while.cond 22908b55d342SMin-Yih Hsu 22918b55d342SMin-Yih Hsuwhile.cond: 22928b55d342SMin-Yih Hsu %len.addr = phi i32 [ %len, %entry ], [ %inc, %while.body ] 22938b55d342SMin-Yih Hsu %inc = add i32 %len.addr, 1 22948b55d342SMin-Yih Hsu %cmp.not = icmp eq i32 %inc, %n 22958b55d342SMin-Yih Hsu br i1 %cmp.not, label %while.end, label %while.body 22968b55d342SMin-Yih Hsu 22978b55d342SMin-Yih Hsuwhile.body: 22988b55d342SMin-Yih Hsu %idxprom = zext i32 %inc to i64 22998b55d342SMin-Yih Hsu %arrayidx = getelementptr inbounds i8, ptr %a, i64 %idxprom 23008b55d342SMin-Yih Hsu %0 = load i8, ptr %arrayidx 23018b55d342SMin-Yih Hsu %arrayidx2 = getelementptr inbounds i8, ptr %b, i64 %idxprom 23028b55d342SMin-Yih Hsu %1 = load i8, ptr %arrayidx2 23038b55d342SMin-Yih Hsu %cmp.not2 = icmp eq i8 %0, %1 23048b55d342SMin-Yih Hsu br i1 %cmp.not2, label %while.cond, label %while.end 23058b55d342SMin-Yih Hsu 23068b55d342SMin-Yih Hsuwhile.end: 23078b55d342SMin-Yih Hsu %inc.lcssa = phi i32 [ %inc, %while.body ], [ %inc, %while.cond ] 23088b55d342SMin-Yih Hsu ret i32 %inc.lcssa 23098b55d342SMin-Yih Hsu} 2310