xref: /llvm-project/llvm/test/Transforms/LoopIdiom/RISCV/byte-compare-index.ll (revision 56c091ea7106507b36015297ee9005c9d5fab0bf)
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