brintos

brintos / llvm-project-archived public Read only

0
0
Text · 42.7 KiB · c785a16 Raw
800 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --check-globals none --version 52; RUN: opt -p loop-unroll -mcpu=neoverse-v1 -S %s | FileCheck --check-prefixes=COMMON,UNROLL4 %s3; RUN: opt -p loop-unroll -mcpu=generic -S %s | FileCheck --check-prefixes=COMMON,UNROLL4 %s4; RUN: opt -p loop-unroll -mcpu=generic -unroll-runtime-multi-exit=false -S %s | FileCheck --check-prefixes=COMMON,NOUNROLL %s5 6target triple = "aarch64-linux-gnu"7 8define i1 @multi_2_exiting_find_i8_loop_same_exit(ptr %vec, i8 %tgt) {9; UNROLL4-LABEL: define i1 @multi_2_exiting_find_i8_loop_same_exit(10; UNROLL4-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0:[0-9]+]] {11; UNROLL4-NEXT:  [[ENTRY:.*]]:12; UNROLL4-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 813; UNROLL4-NEXT:    [[START2:%.*]] = ptrtoint ptr [[START]] to i6414; UNROLL4-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 115; UNROLL4-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 816; UNROLL4-NEXT:    [[END1:%.*]] = ptrtoint ptr [[END]] to i6417; UNROLL4-NEXT:    [[TMP0:%.*]] = sub i64 [[END1]], [[START2]]18; UNROLL4-NEXT:    [[TMP1:%.*]] = freeze i64 [[TMP0]]19; UNROLL4-NEXT:    [[TMP2:%.*]] = add i64 [[TMP1]], -120; UNROLL4-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP1]], 321; UNROLL4-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 022; UNROLL4-NEXT:    br i1 [[LCMP_MOD]], label %[[LOOP_HEADER_PROL_PREHEADER:.*]], label %[[LOOP_HEADER_PROL_LOOPEXIT:.*]]23; UNROLL4:       [[LOOP_HEADER_PROL_PREHEADER]]:24; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL:.*]]25; UNROLL4:       [[LOOP_HEADER_PROL]]:26; UNROLL4-NEXT:    [[PTR_IV_PROL:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL:%.*]], %[[LOOP_LATCH_PROL:.*]] ], [ [[START]], %[[LOOP_HEADER_PROL_PREHEADER]] ]27; UNROLL4-NEXT:    [[PROL_ITER:%.*]] = phi i64 [ 0, %[[LOOP_HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], %[[LOOP_LATCH_PROL]] ]28; UNROLL4-NEXT:    [[L_PROL:%.*]] = load i8, ptr [[PTR_IV_PROL]], align 829; UNROLL4-NEXT:    [[C_1_PROL:%.*]] = icmp eq i8 [[L_PROL]], [[TGT]]30; UNROLL4-NEXT:    br i1 [[C_1_PROL]], label %[[EXIT_UNR_LCSSA_LOOPEXIT3:.*]], label %[[LOOP_LATCH_PROL]]31; UNROLL4:       [[LOOP_LATCH_PROL]]:32; UNROLL4-NEXT:    [[PTR_IV_NEXT_PROL]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_PROL]], i64 133; UNROLL4-NEXT:    [[C_2_PROL:%.*]] = icmp eq ptr [[PTR_IV_NEXT_PROL]], [[END]]34; UNROLL4-NEXT:    [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 135; UNROLL4-NEXT:    [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]]36; UNROLL4-NEXT:    br i1 [[PROL_ITER_CMP]], label %[[LOOP_HEADER_PROL]], label %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA:.*]], !llvm.loop [[LOOP0:![0-9]+]]37; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]]:38; UNROLL4-NEXT:    [[RES_UNR_PH:%.*]] = phi ptr [ [[END]], %[[LOOP_LATCH_PROL]] ]39; UNROLL4-NEXT:    [[PTR_IV_UNR_PH:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL]], %[[LOOP_LATCH_PROL]] ]40; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL_LOOPEXIT]]41; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT]]:42; UNROLL4-NEXT:    [[RES_UNR:%.*]] = phi ptr [ poison, %[[ENTRY]] ], [ [[RES_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]43; UNROLL4-NEXT:    [[PTR_IV_UNR:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]44; UNROLL4-NEXT:    [[TMP3:%.*]] = icmp ult i64 [[TMP2]], 345; UNROLL4-NEXT:    br i1 [[TMP3]], label %[[EXIT:.*]], label %[[ENTRY_NEW:.*]]46; UNROLL4:       [[ENTRY_NEW]]:47; UNROLL4-NEXT:    br label %[[LOOP_HEADER:.*]]48; UNROLL4:       [[LOOP_HEADER]]:49; UNROLL4-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_UNR]], %[[ENTRY_NEW]] ], [ [[PTR_IV_NEXT_3:%.*]], %[[LOOP_LATCH_3:.*]] ]50; UNROLL4-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 851; UNROLL4-NEXT:    [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]52; UNROLL4-NEXT:    br i1 [[C_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT:.*]], label %[[LOOP_LATCH:.*]]53; UNROLL4:       [[LOOP_LATCH]]:54; UNROLL4-NEXT:    [[PTR_IV_NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 155; UNROLL4-NEXT:    [[L_1:%.*]] = load i8, ptr [[PTR_IV_NEXT]], align 856; UNROLL4-NEXT:    [[C_1_1:%.*]] = icmp eq i8 [[L_1]], [[TGT]]57; UNROLL4-NEXT:    br i1 [[C_1_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_1:.*]]58; UNROLL4:       [[LOOP_LATCH_1]]:59; UNROLL4-NEXT:    [[PTR_IV_NEXT_1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT]], i64 160; UNROLL4-NEXT:    [[L_2:%.*]] = load i8, ptr [[PTR_IV_NEXT_1]], align 861; UNROLL4-NEXT:    [[C_1_2:%.*]] = icmp eq i8 [[L_2]], [[TGT]]62; UNROLL4-NEXT:    br i1 [[C_1_2]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_2:.*]]63; UNROLL4:       [[LOOP_LATCH_2]]:64; UNROLL4-NEXT:    [[PTR_IV_NEXT_2:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_1]], i64 165; UNROLL4-NEXT:    [[L_3:%.*]] = load i8, ptr [[PTR_IV_NEXT_2]], align 866; UNROLL4-NEXT:    [[C_1_3:%.*]] = icmp eq i8 [[L_3]], [[TGT]]67; UNROLL4-NEXT:    br i1 [[C_1_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_3]]68; UNROLL4:       [[LOOP_LATCH_3]]:69; UNROLL4-NEXT:    [[PTR_IV_NEXT_3]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_2]], i64 170; UNROLL4-NEXT:    [[C_2_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT_3]], [[END]]71; UNROLL4-NEXT:    br i1 [[C_2_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_HEADER]]72; UNROLL4:       [[EXIT_UNR_LCSSA_LOOPEXIT]]:73; UNROLL4-NEXT:    [[RES_PH_PH:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[PTR_IV_NEXT]], %[[LOOP_LATCH]] ], [ [[PTR_IV_NEXT_1]], %[[LOOP_LATCH_1]] ], [ [[PTR_IV_NEXT_2]], %[[LOOP_LATCH_2]] ], [ [[END]], %[[LOOP_LATCH_3]] ]74; UNROLL4-NEXT:    br label %[[EXIT_UNR_LCSSA:.*]]75; UNROLL4:       [[EXIT_UNR_LCSSA_LOOPEXIT3]]:76; UNROLL4-NEXT:    [[RES_PH_PH4:%.*]] = phi ptr [ [[PTR_IV_PROL]], %[[LOOP_HEADER_PROL]] ]77; UNROLL4-NEXT:    br label %[[EXIT_UNR_LCSSA]]78; UNROLL4:       [[EXIT_UNR_LCSSA]]:79; UNROLL4-NEXT:    [[RES_PH:%.*]] = phi ptr [ [[RES_PH_PH]], %[[EXIT_UNR_LCSSA_LOOPEXIT]] ], [ [[RES_PH_PH4]], %[[EXIT_UNR_LCSSA_LOOPEXIT3]] ]80; UNROLL4-NEXT:    br label %[[EXIT]]81; UNROLL4:       [[EXIT]]:82; UNROLL4-NEXT:    [[RES:%.*]] = phi ptr [ [[RES_UNR]], %[[LOOP_HEADER_PROL_LOOPEXIT]] ], [ [[RES_PH]], %[[EXIT_UNR_LCSSA]] ]83; UNROLL4-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]84; UNROLL4-NEXT:    ret i1 [[C_3]]85;86; NOUNROLL-LABEL: define i1 @multi_2_exiting_find_i8_loop_same_exit(87; NOUNROLL-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0:[0-9]+]] {88; NOUNROLL-NEXT:  [[ENTRY:.*]]:89; NOUNROLL-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 890; NOUNROLL-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 191; NOUNROLL-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 892; NOUNROLL-NEXT:    br label %[[LOOP_HEADER:.*]]93; NOUNROLL:       [[LOOP_HEADER]]:94; NOUNROLL-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]95; NOUNROLL-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 896; NOUNROLL-NEXT:    [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]97; NOUNROLL-NEXT:    br i1 [[C_1]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]98; NOUNROLL:       [[LOOP_LATCH]]:99; NOUNROLL-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1100; NOUNROLL-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]101; NOUNROLL-NEXT:    br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]102; NOUNROLL:       [[EXIT]]:103; NOUNROLL-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]104; NOUNROLL-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]105; NOUNROLL-NEXT:    ret i1 [[C_3]]106;107entry:108  %start = load ptr, ptr %vec, align 8109  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1110  %end = load ptr, ptr %gep.end, align 8111  br label %loop.header112 113loop.header:114  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]115  %l = load i8, ptr %ptr.iv, align 8116  %c.1 = icmp eq i8 %l, %tgt117  br i1 %c.1, label %exit, label %loop.latch118 119loop.latch:120  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 1121  %c.2 = icmp eq ptr %ptr.iv.next, %end122  br i1 %c.2, label %exit, label %loop.header123 124exit:125  %res = phi ptr [ %ptr.iv, %loop.header ], [ %end, %loop.latch ]126  %c.3 = icmp eq ptr %res, %end127  ret i1 %c.3128}129 130 131define i1 @multi_2_exiting_find_i8_loop_diff_exit(ptr %vec, i8 %tgt) {132; UNROLL4-LABEL: define i1 @multi_2_exiting_find_i8_loop_diff_exit(133; UNROLL4-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0]] {134; UNROLL4-NEXT:  [[ENTRY:.*]]:135; UNROLL4-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8136; UNROLL4-NEXT:    [[START2:%.*]] = ptrtoint ptr [[START]] to i64137; UNROLL4-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1138; UNROLL4-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8139; UNROLL4-NEXT:    [[END1:%.*]] = ptrtoint ptr [[END]] to i64140; UNROLL4-NEXT:    [[TMP0:%.*]] = sub i64 [[END1]], [[START2]]141; UNROLL4-NEXT:    [[TMP1:%.*]] = freeze i64 [[TMP0]]142; UNROLL4-NEXT:    [[TMP2:%.*]] = add i64 [[TMP1]], -1143; UNROLL4-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP1]], 3144; UNROLL4-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0145; UNROLL4-NEXT:    br i1 [[LCMP_MOD]], label %[[LOOP_HEADER_PROL_PREHEADER:.*]], label %[[LOOP_HEADER_PROL_LOOPEXIT:.*]]146; UNROLL4:       [[LOOP_HEADER_PROL_PREHEADER]]:147; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL:.*]]148; UNROLL4:       [[LOOP_HEADER_PROL]]:149; UNROLL4-NEXT:    [[PTR_IV_PROL:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL:%.*]], %[[LOOP_LATCH_PROL:.*]] ], [ [[START]], %[[LOOP_HEADER_PROL_PREHEADER]] ]150; UNROLL4-NEXT:    [[PROL_ITER:%.*]] = phi i64 [ 0, %[[LOOP_HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], %[[LOOP_LATCH_PROL]] ]151; UNROLL4-NEXT:    [[L_PROL:%.*]] = load i8, ptr [[PTR_IV_PROL]], align 8152; UNROLL4-NEXT:    [[C_1_PROL:%.*]] = icmp eq i8 [[L_PROL]], [[TGT]]153; UNROLL4-NEXT:    br i1 [[C_1_PROL]], label %[[EARLY_EXIT_LOOPEXIT3:.*]], label %[[LOOP_LATCH_PROL]]154; UNROLL4:       [[LOOP_LATCH_PROL]]:155; UNROLL4-NEXT:    [[PTR_IV_NEXT_PROL]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_PROL]], i64 1156; UNROLL4-NEXT:    [[C_2_PROL:%.*]] = icmp eq ptr [[PTR_IV_NEXT_PROL]], [[END]]157; UNROLL4-NEXT:    [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1158; UNROLL4-NEXT:    [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]]159; UNROLL4-NEXT:    br i1 [[PROL_ITER_CMP]], label %[[LOOP_HEADER_PROL]], label %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA:.*]], !llvm.loop [[LOOP2:![0-9]+]]160; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]]:161; UNROLL4-NEXT:    [[PTR_IV_UNR_PH:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL]], %[[LOOP_LATCH_PROL]] ]162; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL_LOOPEXIT]]163; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT]]:164; UNROLL4-NEXT:    [[PTR_IV_UNR:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]165; UNROLL4-NEXT:    [[TMP3:%.*]] = icmp ult i64 [[TMP2]], 3166; UNROLL4-NEXT:    br i1 [[TMP3]], label %[[LATCH_EXIT:.*]], label %[[ENTRY_NEW:.*]]167; UNROLL4:       [[ENTRY_NEW]]:168; UNROLL4-NEXT:    br label %[[LOOP_HEADER:.*]]169; UNROLL4:       [[LOOP_HEADER]]:170; UNROLL4-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_UNR]], %[[ENTRY_NEW]] ], [ [[PTR_IV_NEXT_3:%.*]], %[[LOOP_LATCH_3:.*]] ]171; UNROLL4-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8172; UNROLL4-NEXT:    [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]173; UNROLL4-NEXT:    br i1 [[C_1]], label %[[EARLY_EXIT_LOOPEXIT:.*]], label %[[LOOP_LATCH:.*]]174; UNROLL4:       [[LOOP_LATCH]]:175; UNROLL4-NEXT:    [[PTR_IV_NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1176; UNROLL4-NEXT:    [[L_1:%.*]] = load i8, ptr [[PTR_IV_NEXT]], align 8177; UNROLL4-NEXT:    [[C_1_1:%.*]] = icmp eq i8 [[L_1]], [[TGT]]178; UNROLL4-NEXT:    br i1 [[C_1_1]], label %[[EARLY_EXIT_LOOPEXIT]], label %[[LOOP_LATCH_1:.*]]179; UNROLL4:       [[LOOP_LATCH_1]]:180; UNROLL4-NEXT:    [[PTR_IV_NEXT_1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT]], i64 1181; UNROLL4-NEXT:    [[L_2:%.*]] = load i8, ptr [[PTR_IV_NEXT_1]], align 8182; UNROLL4-NEXT:    [[C_1_2:%.*]] = icmp eq i8 [[L_2]], [[TGT]]183; UNROLL4-NEXT:    br i1 [[C_1_2]], label %[[EARLY_EXIT_LOOPEXIT]], label %[[LOOP_LATCH_2:.*]]184; UNROLL4:       [[LOOP_LATCH_2]]:185; UNROLL4-NEXT:    [[PTR_IV_NEXT_2:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_1]], i64 1186; UNROLL4-NEXT:    [[L_3:%.*]] = load i8, ptr [[PTR_IV_NEXT_2]], align 8187; UNROLL4-NEXT:    [[C_1_3:%.*]] = icmp eq i8 [[L_3]], [[TGT]]188; UNROLL4-NEXT:    br i1 [[C_1_3]], label %[[EARLY_EXIT_LOOPEXIT]], label %[[LOOP_LATCH_3]]189; UNROLL4:       [[LOOP_LATCH_3]]:190; UNROLL4-NEXT:    [[PTR_IV_NEXT_3]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_2]], i64 1191; UNROLL4-NEXT:    [[C_2_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT_3]], [[END]]192; UNROLL4-NEXT:    br i1 [[C_2_3]], label %[[LATCH_EXIT_UNR_LCSSA:.*]], label %[[LOOP_HEADER]]193; UNROLL4:       [[EARLY_EXIT_LOOPEXIT]]:194; UNROLL4-NEXT:    br label %[[EARLY_EXIT:.*]]195; UNROLL4:       [[EARLY_EXIT_LOOPEXIT3]]:196; UNROLL4-NEXT:    br label %[[EARLY_EXIT]]197; UNROLL4:       [[EARLY_EXIT]]:198; UNROLL4-NEXT:    ret i1 true199; UNROLL4:       [[LATCH_EXIT_UNR_LCSSA]]:200; UNROLL4-NEXT:    br label %[[LATCH_EXIT]]201; UNROLL4:       [[LATCH_EXIT]]:202; UNROLL4-NEXT:    ret i1 false203;204; NOUNROLL-LABEL: define i1 @multi_2_exiting_find_i8_loop_diff_exit(205; NOUNROLL-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0]] {206; NOUNROLL-NEXT:  [[ENTRY:.*]]:207; NOUNROLL-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8208; NOUNROLL-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1209; NOUNROLL-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8210; NOUNROLL-NEXT:    br label %[[LOOP_HEADER:.*]]211; NOUNROLL:       [[LOOP_HEADER]]:212; NOUNROLL-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]213; NOUNROLL-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8214; NOUNROLL-NEXT:    [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]215; NOUNROLL-NEXT:    br i1 [[C_1]], label %[[EARLY_EXIT:.*]], label %[[LOOP_LATCH]]216; NOUNROLL:       [[LOOP_LATCH]]:217; NOUNROLL-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1218; NOUNROLL-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]219; NOUNROLL-NEXT:    br i1 [[C_2]], label %[[LATCH_EXIT:.*]], label %[[LOOP_HEADER]]220; NOUNROLL:       [[EARLY_EXIT]]:221; NOUNROLL-NEXT:    ret i1 true222; NOUNROLL:       [[LATCH_EXIT]]:223; NOUNROLL-NEXT:    ret i1 false224;225entry:226  %start = load ptr, ptr %vec, align 8227  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1228  %end = load ptr, ptr %gep.end, align 8229  br label %loop.header230 231loop.header:232  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]233  %l = load i8, ptr %ptr.iv, align 8234  %c.1 = icmp eq i8 %l, %tgt235  br i1 %c.1, label %early.exit, label %loop.latch236 237loop.latch:238  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 1239  %c.2 = icmp eq ptr %ptr.iv.next, %end240  br i1 %c.2, label %latch.exit, label %loop.header241 242early.exit:243  ret i1 1244 245latch.exit:246  ret i1 0247}248 249 250define i1 @multi_2_exiting_find_ptr_loop_same_exit(ptr %vec, ptr %tgt) {251; UNROLL4-LABEL: define i1 @multi_2_exiting_find_ptr_loop_same_exit(252; UNROLL4-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]]) #[[ATTR0]] {253; UNROLL4-NEXT:  [[ENTRY:.*]]:254; UNROLL4-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8255; UNROLL4-NEXT:    [[START2:%.*]] = ptrtoint ptr [[START]] to i64256; UNROLL4-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]257; UNROLL4-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8258; UNROLL4-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8259; UNROLL4-NEXT:    [[END1:%.*]] = ptrtoint ptr [[END]] to i64260; UNROLL4-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]261; UNROLL4-NEXT:    [[TMP0:%.*]] = add i64 [[END1]], -8262; UNROLL4-NEXT:    [[TMP1:%.*]] = sub i64 [[TMP0]], [[START2]]263; UNROLL4-NEXT:    [[TMP2:%.*]] = lshr i64 [[TMP1]], 3264; UNROLL4-NEXT:    [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 1265; UNROLL4-NEXT:    [[TMP4:%.*]] = freeze i64 [[TMP3]]266; UNROLL4-NEXT:    [[TMP5:%.*]] = add i64 [[TMP4]], -1267; UNROLL4-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP4]], 3268; UNROLL4-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0269; UNROLL4-NEXT:    br i1 [[LCMP_MOD]], label %[[LOOP_HEADER_PROL_PREHEADER:.*]], label %[[LOOP_HEADER_PROL_LOOPEXIT:.*]]270; UNROLL4:       [[LOOP_HEADER_PROL_PREHEADER]]:271; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL:.*]]272; UNROLL4:       [[LOOP_HEADER_PROL]]:273; UNROLL4-NEXT:    [[PTR_IV_PROL:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL:%.*]], %[[LOOP_LATCH_PROL:.*]] ], [ [[START]], %[[LOOP_HEADER_PROL_PREHEADER]] ]274; UNROLL4-NEXT:    [[PROL_ITER:%.*]] = phi i64 [ 0, %[[LOOP_HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], %[[LOOP_LATCH_PROL]] ]275; UNROLL4-NEXT:    [[L_PROL:%.*]] = load ptr, ptr [[PTR_IV_PROL]], align 8276; UNROLL4-NEXT:    [[C_1_PROL:%.*]] = icmp eq ptr [[L_PROL]], [[TGT]]277; UNROLL4-NEXT:    br i1 [[C_1_PROL]], label %[[EXIT_UNR_LCSSA_LOOPEXIT3:.*]], label %[[LOOP_LATCH_PROL]]278; UNROLL4:       [[LOOP_LATCH_PROL]]:279; UNROLL4-NEXT:    [[PTR_IV_NEXT_PROL]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_PROL]], i64 8280; UNROLL4-NEXT:    [[C_2_PROL:%.*]] = icmp eq ptr [[PTR_IV_NEXT_PROL]], [[END]]281; UNROLL4-NEXT:    [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1282; UNROLL4-NEXT:    [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]]283; UNROLL4-NEXT:    br i1 [[PROL_ITER_CMP]], label %[[LOOP_HEADER_PROL]], label %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA:.*]], !llvm.loop [[LOOP3:![0-9]+]]284; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]]:285; UNROLL4-NEXT:    [[RES_UNR_PH:%.*]] = phi ptr [ [[END]], %[[LOOP_LATCH_PROL]] ]286; UNROLL4-NEXT:    [[PTR_IV_UNR_PH:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL]], %[[LOOP_LATCH_PROL]] ]287; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL_LOOPEXIT]]288; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT]]:289; UNROLL4-NEXT:    [[RES_UNR:%.*]] = phi ptr [ poison, %[[ENTRY]] ], [ [[RES_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]290; UNROLL4-NEXT:    [[PTR_IV_UNR:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]291; UNROLL4-NEXT:    [[TMP6:%.*]] = icmp ult i64 [[TMP5]], 3292; UNROLL4-NEXT:    br i1 [[TMP6]], label %[[EXIT:.*]], label %[[ENTRY_NEW:.*]]293; UNROLL4:       [[ENTRY_NEW]]:294; UNROLL4-NEXT:    br label %[[LOOP_HEADER:.*]]295; UNROLL4:       [[LOOP_HEADER]]:296; UNROLL4-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_UNR]], %[[ENTRY_NEW]] ], [ [[PTR_IV_NEXT_3:%.*]], %[[LOOP_LATCH_3:.*]] ]297; UNROLL4-NEXT:    [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8298; UNROLL4-NEXT:    [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]299; UNROLL4-NEXT:    br i1 [[C_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT:.*]], label %[[LOOP_LATCH:.*]]300; UNROLL4:       [[LOOP_LATCH]]:301; UNROLL4-NEXT:    [[PTR_IV_NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8302; UNROLL4-NEXT:    [[L_1:%.*]] = load ptr, ptr [[PTR_IV_NEXT]], align 8303; UNROLL4-NEXT:    [[C_1_1:%.*]] = icmp eq ptr [[L_1]], [[TGT]]304; UNROLL4-NEXT:    br i1 [[C_1_1]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_1:.*]]305; UNROLL4:       [[LOOP_LATCH_1]]:306; UNROLL4-NEXT:    [[PTR_IV_NEXT_1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT]], i64 8307; UNROLL4-NEXT:    [[L_2:%.*]] = load ptr, ptr [[PTR_IV_NEXT_1]], align 8308; UNROLL4-NEXT:    [[C_1_2:%.*]] = icmp eq ptr [[L_2]], [[TGT]]309; UNROLL4-NEXT:    br i1 [[C_1_2]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_2:.*]]310; UNROLL4:       [[LOOP_LATCH_2]]:311; UNROLL4-NEXT:    [[PTR_IV_NEXT_2:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_1]], i64 8312; UNROLL4-NEXT:    [[L_3:%.*]] = load ptr, ptr [[PTR_IV_NEXT_2]], align 8313; UNROLL4-NEXT:    [[C_1_3:%.*]] = icmp eq ptr [[L_3]], [[TGT]]314; UNROLL4-NEXT:    br i1 [[C_1_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_LATCH_3]]315; UNROLL4:       [[LOOP_LATCH_3]]:316; UNROLL4-NEXT:    [[PTR_IV_NEXT_3]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_2]], i64 8317; UNROLL4-NEXT:    [[C_2_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT_3]], [[END]]318; UNROLL4-NEXT:    br i1 [[C_2_3]], label %[[EXIT_UNR_LCSSA_LOOPEXIT]], label %[[LOOP_HEADER]]319; UNROLL4:       [[EXIT_UNR_LCSSA_LOOPEXIT]]:320; UNROLL4-NEXT:    [[RES_PH_PH:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[PTR_IV_NEXT]], %[[LOOP_LATCH]] ], [ [[PTR_IV_NEXT_1]], %[[LOOP_LATCH_1]] ], [ [[PTR_IV_NEXT_2]], %[[LOOP_LATCH_2]] ], [ [[END]], %[[LOOP_LATCH_3]] ]321; UNROLL4-NEXT:    br label %[[EXIT_UNR_LCSSA:.*]]322; UNROLL4:       [[EXIT_UNR_LCSSA_LOOPEXIT3]]:323; UNROLL4-NEXT:    [[RES_PH_PH4:%.*]] = phi ptr [ [[PTR_IV_PROL]], %[[LOOP_HEADER_PROL]] ]324; UNROLL4-NEXT:    br label %[[EXIT_UNR_LCSSA]]325; UNROLL4:       [[EXIT_UNR_LCSSA]]:326; UNROLL4-NEXT:    [[RES_PH:%.*]] = phi ptr [ [[RES_PH_PH]], %[[EXIT_UNR_LCSSA_LOOPEXIT]] ], [ [[RES_PH_PH4]], %[[EXIT_UNR_LCSSA_LOOPEXIT3]] ]327; UNROLL4-NEXT:    br label %[[EXIT]]328; UNROLL4:       [[EXIT]]:329; UNROLL4-NEXT:    [[RES:%.*]] = phi ptr [ [[RES_UNR]], %[[LOOP_HEADER_PROL_LOOPEXIT]] ], [ [[RES_PH]], %[[EXIT_UNR_LCSSA]] ]330; UNROLL4-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]331; UNROLL4-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]332; UNROLL4-NEXT:    ret i1 [[C_3]]333;334; NOUNROLL-LABEL: define i1 @multi_2_exiting_find_ptr_loop_same_exit(335; NOUNROLL-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]]) #[[ATTR0]] {336; NOUNROLL-NEXT:  [[ENTRY:.*]]:337; NOUNROLL-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8338; NOUNROLL-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]339; NOUNROLL-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8340; NOUNROLL-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8341; NOUNROLL-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]342; NOUNROLL-NEXT:    br label %[[LOOP_HEADER:.*]]343; NOUNROLL:       [[LOOP_HEADER]]:344; NOUNROLL-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]345; NOUNROLL-NEXT:    [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8346; NOUNROLL-NEXT:    [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]347; NOUNROLL-NEXT:    br i1 [[C_1]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]348; NOUNROLL:       [[LOOP_LATCH]]:349; NOUNROLL-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8350; NOUNROLL-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]351; NOUNROLL-NEXT:    br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]352; NOUNROLL:       [[EXIT]]:353; NOUNROLL-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]354; NOUNROLL-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]355; NOUNROLL-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]356; NOUNROLL-NEXT:    ret i1 [[C_3]]357;358entry:359  %start = load ptr, ptr %vec, align 8360  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]361  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 8362  %end = load ptr, ptr %gep.end, align 8363  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]364  br label %loop.header365 366loop.header:367  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]368  %l = load ptr, ptr %ptr.iv, align 8369  %c.1 = icmp eq ptr %l, %tgt370  br i1 %c.1, label %exit, label %loop.latch371 372loop.latch:373  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 8374  %c.2 = icmp eq ptr %ptr.iv.next, %end375  br i1 %c.2, label %exit, label %loop.header376 377exit:378  %res = phi ptr [ %ptr.iv, %loop.header ], [ %end, %loop.latch ]379  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]380  %c.3 = icmp eq ptr %res, %end381  ret i1 %c.3382}383 384 385define ptr @multi_2_exiting_find_ptr_loop_diff_exit(ptr %vec, ptr %tgt) {386; UNROLL4-LABEL: define ptr @multi_2_exiting_find_ptr_loop_diff_exit(387; UNROLL4-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]]) #[[ATTR0]] {388; UNROLL4-NEXT:  [[ENTRY:.*]]:389; UNROLL4-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8390; UNROLL4-NEXT:    [[START3:%.*]] = ptrtoint ptr [[START]] to i64391; UNROLL4-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]392; UNROLL4-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8393; UNROLL4-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8394; UNROLL4-NEXT:    [[END2:%.*]] = ptrtoint ptr [[END]] to i64395; UNROLL4-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]396; UNROLL4-NEXT:    [[TMP0:%.*]] = add i64 [[END2]], -8397; UNROLL4-NEXT:    [[TMP1:%.*]] = sub i64 [[TMP0]], [[START3]]398; UNROLL4-NEXT:    [[TMP2:%.*]] = lshr i64 [[TMP1]], 3399; UNROLL4-NEXT:    [[TMP3:%.*]] = add nuw nsw i64 [[TMP2]], 1400; UNROLL4-NEXT:    [[TMP4:%.*]] = freeze i64 [[TMP3]]401; UNROLL4-NEXT:    [[TMP5:%.*]] = add i64 [[TMP4]], -1402; UNROLL4-NEXT:    [[XTRAITER:%.*]] = and i64 [[TMP4]], 3403; UNROLL4-NEXT:    [[LCMP_MOD:%.*]] = icmp ne i64 [[XTRAITER]], 0404; UNROLL4-NEXT:    br i1 [[LCMP_MOD]], label %[[LOOP_HEADER_PROL_PREHEADER:.*]], label %[[LOOP_HEADER_PROL_LOOPEXIT:.*]]405; UNROLL4:       [[LOOP_HEADER_PROL_PREHEADER]]:406; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL:.*]]407; UNROLL4:       [[LOOP_HEADER_PROL]]:408; UNROLL4-NEXT:    [[PTR_IV_PROL:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL:%.*]], %[[LOOP_LATCH_PROL:.*]] ], [ [[START]], %[[LOOP_HEADER_PROL_PREHEADER]] ]409; UNROLL4-NEXT:    [[PROL_ITER:%.*]] = phi i64 [ 0, %[[LOOP_HEADER_PROL_PREHEADER]] ], [ [[PROL_ITER_NEXT:%.*]], %[[LOOP_LATCH_PROL]] ]410; UNROLL4-NEXT:    [[L_PROL:%.*]] = load ptr, ptr [[PTR_IV_PROL]], align 8411; UNROLL4-NEXT:    [[C_1_PROL:%.*]] = icmp eq ptr [[L_PROL]], [[TGT]]412; UNROLL4-NEXT:    br i1 [[C_1_PROL]], label %[[EARLY_EXIT_LOOPEXIT4:.*]], label %[[LOOP_LATCH_PROL]]413; UNROLL4:       [[LOOP_LATCH_PROL]]:414; UNROLL4-NEXT:    [[PTR_IV_NEXT_PROL]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_PROL]], i64 8415; UNROLL4-NEXT:    [[C_2_PROL:%.*]] = icmp eq ptr [[PTR_IV_NEXT_PROL]], [[END]]416; UNROLL4-NEXT:    [[PROL_ITER_NEXT]] = add i64 [[PROL_ITER]], 1417; UNROLL4-NEXT:    [[PROL_ITER_CMP:%.*]] = icmp ne i64 [[PROL_ITER_NEXT]], [[XTRAITER]]418; UNROLL4-NEXT:    br i1 [[PROL_ITER_CMP]], label %[[LOOP_HEADER_PROL]], label %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA:.*]], !llvm.loop [[LOOP4:![0-9]+]]419; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]]:420; UNROLL4-NEXT:    [[PTR_IV_UNR_PH:%.*]] = phi ptr [ [[PTR_IV_NEXT_PROL]], %[[LOOP_LATCH_PROL]] ]421; UNROLL4-NEXT:    br label %[[LOOP_HEADER_PROL_LOOPEXIT]]422; UNROLL4:       [[LOOP_HEADER_PROL_LOOPEXIT]]:423; UNROLL4-NEXT:    [[PTR_IV_UNR:%.*]] = phi ptr [ [[START]], %[[ENTRY]] ], [ [[PTR_IV_UNR_PH]], %[[LOOP_HEADER_PROL_LOOPEXIT_UNR_LCSSA]] ]424; UNROLL4-NEXT:    [[TMP6:%.*]] = icmp ult i64 [[TMP5]], 3425; UNROLL4-NEXT:    br i1 [[TMP6]], label %[[LATCH_EXIT:.*]], label %[[ENTRY_NEW:.*]]426; UNROLL4:       [[ENTRY_NEW]]:427; UNROLL4-NEXT:    br label %[[LOOP_HEADER:.*]]428; UNROLL4:       [[LOOP_HEADER]]:429; UNROLL4-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_UNR]], %[[ENTRY_NEW]] ], [ [[PTR_IV_NEXT_3:%.*]], %[[LOOP_LATCH_3:.*]] ]430; UNROLL4-NEXT:    [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8431; UNROLL4-NEXT:    [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]432; UNROLL4-NEXT:    br i1 [[C_1]], label %[[EARLY_EXIT_LOOPEXIT:.*]], label %[[LOOP_LATCH:.*]]433; UNROLL4:       [[LOOP_LATCH]]:434; UNROLL4-NEXT:    [[PTR_IV_NEXT:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8435; UNROLL4-NEXT:    [[L_1:%.*]] = load ptr, ptr [[PTR_IV_NEXT]], align 8436; UNROLL4-NEXT:    [[C_1_1:%.*]] = icmp eq ptr [[L_1]], [[TGT]]437; UNROLL4-NEXT:    br i1 [[C_1_1]], label %[[EARLY_EXIT_LOOPEXIT]], label %[[LOOP_LATCH_1:.*]]438; UNROLL4:       [[LOOP_LATCH_1]]:439; UNROLL4-NEXT:    [[PTR_IV_NEXT_1:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT]], i64 8440; UNROLL4-NEXT:    [[L_2:%.*]] = load ptr, ptr [[PTR_IV_NEXT_1]], align 8441; UNROLL4-NEXT:    [[C_1_2:%.*]] = icmp eq ptr [[L_2]], [[TGT]]442; UNROLL4-NEXT:    br i1 [[C_1_2]], label %[[EARLY_EXIT_LOOPEXIT]], label %[[LOOP_LATCH_2:.*]]443; UNROLL4:       [[LOOP_LATCH_2]]:444; UNROLL4-NEXT:    [[PTR_IV_NEXT_2:%.*]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_1]], i64 8445; UNROLL4-NEXT:    [[L_3:%.*]] = load ptr, ptr [[PTR_IV_NEXT_2]], align 8446; UNROLL4-NEXT:    [[C_1_3:%.*]] = icmp eq ptr [[L_3]], [[TGT]]447; UNROLL4-NEXT:    br i1 [[C_1_3]], label %[[EARLY_EXIT_LOOPEXIT]], label %[[LOOP_LATCH_3]]448; UNROLL4:       [[LOOP_LATCH_3]]:449; UNROLL4-NEXT:    [[PTR_IV_NEXT_3]] = getelementptr inbounds nuw i8, ptr [[PTR_IV_NEXT_2]], i64 8450; UNROLL4-NEXT:    [[C_2_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT_3]], [[END]]451; UNROLL4-NEXT:    br i1 [[C_2_3]], label %[[LATCH_EXIT_UNR_LCSSA:.*]], label %[[LOOP_HEADER]]452; UNROLL4:       [[EARLY_EXIT_LOOPEXIT]]:453; UNROLL4-NEXT:    [[L_LCSSA_PH:%.*]] = phi ptr [ [[L]], %[[LOOP_HEADER]] ], [ [[L_1]], %[[LOOP_LATCH]] ], [ [[L_2]], %[[LOOP_LATCH_1]] ], [ [[L_3]], %[[LOOP_LATCH_2]] ]454; UNROLL4-NEXT:    br label %[[EARLY_EXIT:.*]]455; UNROLL4:       [[EARLY_EXIT_LOOPEXIT4]]:456; UNROLL4-NEXT:    [[L_LCSSA_PH5:%.*]] = phi ptr [ [[L_PROL]], %[[LOOP_HEADER_PROL]] ]457; UNROLL4-NEXT:    br label %[[EARLY_EXIT]]458; UNROLL4:       [[EARLY_EXIT]]:459; UNROLL4-NEXT:    [[L_LCSSA:%.*]] = phi ptr [ [[L_LCSSA_PH]], %[[EARLY_EXIT_LOOPEXIT]] ], [ [[L_LCSSA_PH5]], %[[EARLY_EXIT_LOOPEXIT4]] ]460; UNROLL4-NEXT:    ret ptr [[L_LCSSA]]461; UNROLL4:       [[LATCH_EXIT_UNR_LCSSA]]:462; UNROLL4-NEXT:    br label %[[LATCH_EXIT]]463; UNROLL4:       [[LATCH_EXIT]]:464; UNROLL4-NEXT:    ret ptr [[END]]465;466; NOUNROLL-LABEL: define ptr @multi_2_exiting_find_ptr_loop_diff_exit(467; NOUNROLL-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]]) #[[ATTR0]] {468; NOUNROLL-NEXT:  [[ENTRY:.*]]:469; NOUNROLL-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8470; NOUNROLL-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]471; NOUNROLL-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8472; NOUNROLL-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8473; NOUNROLL-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]474; NOUNROLL-NEXT:    br label %[[LOOP_HEADER:.*]]475; NOUNROLL:       [[LOOP_HEADER]]:476; NOUNROLL-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]477; NOUNROLL-NEXT:    [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8478; NOUNROLL-NEXT:    [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]479; NOUNROLL-NEXT:    br i1 [[C_1]], label %[[EARLY_EXIT:.*]], label %[[LOOP_LATCH]]480; NOUNROLL:       [[LOOP_LATCH]]:481; NOUNROLL-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8482; NOUNROLL-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]483; NOUNROLL-NEXT:    br i1 [[C_2]], label %[[LATCH_EXIT:.*]], label %[[LOOP_HEADER]]484; NOUNROLL:       [[EARLY_EXIT]]:485; NOUNROLL-NEXT:    [[L_LCSSA:%.*]] = phi ptr [ [[L]], %[[LOOP_HEADER]] ]486; NOUNROLL-NEXT:    ret ptr [[L_LCSSA]]487; NOUNROLL:       [[LATCH_EXIT]]:488; NOUNROLL-NEXT:    ret ptr [[END]]489;490entry:491  %start = load ptr, ptr %vec, align 8492  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]493  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 8494  %end = load ptr, ptr %gep.end, align 8495  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]496  br label %loop.header497 498loop.header:499  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]500  %l = load ptr, ptr %ptr.iv, align 8501  %c.1 = icmp eq ptr %l, %tgt502  br i1 %c.1, label %early.exit, label %loop.latch503 504loop.latch:505  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 8506  %c.2 = icmp eq ptr %ptr.iv.next, %end507  br i1 %c.2, label %latch.exit, label %loop.header508 509early.exit:510  ret ptr %l511 512latch.exit:513  ret ptr %end514}515 516 517define i1 @multi_2_exiting_find_i8_loop_too_large(ptr %vec, i8 %tgt) {518; COMMON-LABEL: define i1 @multi_2_exiting_find_i8_loop_too_large(519; COMMON-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0:[0-9]+]] {520; COMMON-NEXT:  [[ENTRY:.*]]:521; COMMON-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8522; COMMON-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1523; COMMON-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8524; COMMON-NEXT:    br label %[[LOOP_HEADER:.*]]525; COMMON:       [[LOOP_HEADER]]:526; COMMON-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]527; COMMON-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8528; COMMON-NEXT:    [[UDIV:%.*]] = udiv i8 [[L]], [[TGT]]529; COMMON-NEXT:    [[UDIV_2:%.*]] = udiv i8 [[UDIV]], 10530; COMMON-NEXT:    [[C_1:%.*]] = icmp eq i8 [[UDIV_2]], 2531; COMMON-NEXT:    br i1 [[C_1]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]532; COMMON:       [[LOOP_LATCH]]:533; COMMON-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1534; COMMON-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]535; COMMON-NEXT:    br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]536; COMMON:       [[EXIT]]:537; COMMON-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]538; COMMON-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]539; COMMON-NEXT:    ret i1 [[C_3]]540;541entry:542  %start = load ptr, ptr %vec, align 8543  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1544  %end = load ptr, ptr %gep.end, align 8545  br label %loop.header546 547loop.header:548  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]549  %l = load i8, ptr %ptr.iv, align 8550  %udiv = udiv i8 %l, %tgt551  %udiv.2 = udiv i8 %udiv, 10552  %c.1 = icmp eq i8 %udiv.2, 2553  br i1 %c.1, label %exit, label %loop.latch554 555loop.latch:556  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 1557  %c.2 = icmp eq ptr %ptr.iv.next, %end558  br i1 %c.2, label %exit, label %loop.header559 560exit:561  %res = phi ptr [ %ptr.iv, %loop.header ], [ %end, %loop.latch ]562  %c.3 = icmp eq ptr %res, %end563  ret i1 %c.3564}565 566 567define i1 @multi_3_exiting_find_ptr_loop(ptr %vec, ptr %tgt, ptr %tgt2) {568; COMMON-LABEL: define i1 @multi_3_exiting_find_ptr_loop(569; COMMON-SAME: ptr [[VEC:%.*]], ptr [[TGT:%.*]], ptr [[TGT2:%.*]]) #[[ATTR0]] {570; COMMON-NEXT:  [[ENTRY:.*]]:571; COMMON-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8572; COMMON-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[START]], i64 8) ]573; COMMON-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 8574; COMMON-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8575; COMMON-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]576; COMMON-NEXT:    br label %[[LOOP_HEADER:.*]]577; COMMON:       [[LOOP_HEADER]]:578; COMMON-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]579; COMMON-NEXT:    [[L:%.*]] = load ptr, ptr [[PTR_IV]], align 8580; COMMON-NEXT:    [[C_1:%.*]] = icmp eq ptr [[L]], [[TGT]]581; COMMON-NEXT:    [[C_2:%.*]] = icmp eq ptr [[L]], [[TGT2]]582; COMMON-NEXT:    [[OR_COND:%.*]] = select i1 [[C_1]], i1 true, i1 [[C_2]]583; COMMON-NEXT:    br i1 [[OR_COND]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]584; COMMON:       [[LOOP_LATCH]]:585; COMMON-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 8586; COMMON-NEXT:    [[C_3:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]587; COMMON-NEXT:    br i1 [[C_3]], label %[[EXIT]], label %[[LOOP_HEADER]]588; COMMON:       [[EXIT]]:589; COMMON-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]590; COMMON-NEXT:    call void @llvm.assume(i1 true) [ "align"(ptr [[END]], i64 8) ]591; COMMON-NEXT:    [[C_4:%.*]] = icmp eq ptr [[RES]], [[END]]592; COMMON-NEXT:    ret i1 [[C_4]]593;594entry:595  %start = load ptr, ptr %vec, align 8596  call void @llvm.assume(i1 true) [ "align"(ptr %start, i64 8) ]597  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 8598  %end = load ptr, ptr %gep.end, align 8599  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]600  br label %loop.header601 602loop.header:603  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]604  %l = load ptr, ptr %ptr.iv, align 8605  %c.1 = icmp eq ptr %l, %tgt606  br i1 %c.1, label %exit, label %then607 608then:609  %c.2 = icmp eq ptr %l, %tgt2610  br i1 %c.2, label %exit, label %loop.latch611 612loop.latch:613  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 8614  %c.3 = icmp eq ptr %ptr.iv.next, %end615  br i1 %c.3, label %exit, label %loop.header616 617exit:618  %res = phi ptr [ %ptr.iv, %loop.header ], [ %ptr.iv, %then], [ %end, %loop.latch ]619  call void @llvm.assume(i1 true) [ "align"(ptr %end, i64 8) ]620  %c.4 = icmp eq ptr %res, %end621  ret i1 %c.4622}623 624 625define i1 @multi_2_exiting_find_i8_loop_switch(ptr %vec, i8 %tgt) {626; COMMON-LABEL: define i1 @multi_2_exiting_find_i8_loop_switch(627; COMMON-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR0]] {628; COMMON-NEXT:  [[ENTRY:.*]]:629; COMMON-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8630; COMMON-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1631; COMMON-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8632; COMMON-NEXT:    br label %[[LOOP_HEADER:.*]]633; COMMON:       [[LOOP_HEADER]]:634; COMMON-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]635; COMMON-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8636; COMMON-NEXT:    switch i8 [[L]], label %[[LOOP_LATCH]] [637; COMMON-NEXT:      i8 0, label %[[EXIT_1:.*]]638; COMMON-NEXT:      i8 1, label %[[EXIT_2:.*]]639; COMMON-NEXT:      i8 2, label %[[EXIT:.*]]640; COMMON-NEXT:    ]641; COMMON:       [[LOOP_LATCH]]:642; COMMON-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1643; COMMON-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]644; COMMON-NEXT:    br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]645; COMMON:       [[EXIT]]:646; COMMON-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]647; COMMON-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]648; COMMON-NEXT:    ret i1 [[C_3]]649; COMMON:       [[EXIT_1]]:650; COMMON-NEXT:    ret i1 false651; COMMON:       [[EXIT_2]]:652; COMMON-NEXT:    ret i1 true653;654entry:655  %start = load ptr, ptr %vec, align 8656  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1657  %end = load ptr, ptr %gep.end, align 8658  br label %loop.header659 660loop.header:661  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]662  %l = load i8, ptr %ptr.iv, align 8663  switch i8 %l, label %loop.latch [664  i8 0, label %exit.1665  i8 1, label %exit.2666  i8 2, label %exit ]667 668loop.latch:669  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 1670  %c.2 = icmp eq ptr %ptr.iv.next, %end671  br i1 %c.2, label %exit, label %loop.header672 673exit:674  %res = phi ptr [ %ptr.iv, %loop.header ], [ %end, %loop.latch ]675  %c.3 = icmp eq ptr %res, %end676  ret i1 %c.3677 678exit.1:679  ret i1 0680 681exit.2:682  ret i1 1683}684 685 686define i1 @multi_2_exiting_find_i8_loop_small_max_tc(ptr %vec, i8 %tgt, i5 %n5) {687; COMMON-LABEL: define i1 @multi_2_exiting_find_i8_loop_small_max_tc(688; COMMON-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]], i5 [[N5:%.*]]) #[[ATTR0]] {689; COMMON-NEXT:  [[ENTRY:.*:]]690; COMMON-NEXT:    [[C_0:%.*]] = icmp sgt i5 [[N5]], 0691; COMMON-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8692; COMMON-NEXT:    br i1 [[C_0]], label %[[LOOP_PH:.*]], label %[[EXIT:.*]]693; COMMON:       [[LOOP_PH]]:694; COMMON-NEXT:    [[N64:%.*]] = zext i5 [[N5]] to i64695; COMMON-NEXT:    [[END:%.*]] = getelementptr inbounds nuw i8, ptr [[START]], i64 [[N64]]696; COMMON-NEXT:    br label %[[LOOP_HEADER:.*]]697; COMMON:       [[LOOP_HEADER]]:698; COMMON-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[LOOP_PH]] ]699; COMMON-NEXT:    [[IV:%.*]] = phi i64 [ [[IV_NEXT:%.*]], %[[LOOP_LATCH]] ], [ 0, %[[LOOP_PH]] ]700; COMMON-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8701; COMMON-NEXT:    [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]702; COMMON-NEXT:    br i1 [[C_1]], label %[[LOOP_EXIT:.*]], label %[[LOOP_LATCH]]703; COMMON:       [[LOOP_LATCH]]:704; COMMON-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1705; COMMON-NEXT:    [[IV_NEXT]] = add nuw nsw i64 [[IV]], 1706; COMMON-NEXT:    [[C_2:%.*]] = icmp eq i64 [[IV_NEXT]], [[N64]]707; COMMON-NEXT:    br i1 [[C_2]], label %[[LOOP_EXIT]], label %[[LOOP_HEADER]]708; COMMON:       [[LOOP_EXIT]]:709; COMMON-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]710; COMMON-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]711; COMMON-NEXT:    ret i1 [[C_3]]712; COMMON:       [[EXIT]]:713; COMMON-NEXT:    ret i1 false714;715entry:716  %c.0 = icmp sgt i5 %n5, 0717  %start = load ptr, ptr %vec, align 8718  br i1 %c.0, label %loop.ph, label %exit719 720loop.ph:721  %n64 = zext i5 %n5 to i64722  %end = getelementptr inbounds nuw i8, ptr %start, i64 %n64723  br label %loop.header724 725loop.header:726  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %loop.ph ]727  %iv = phi i64 [ %iv.next, %loop.latch ], [ 0, %loop.ph ]728  %l = load i8, ptr %ptr.iv, align 8729  %c.1 = icmp eq i8 %l, %tgt730  br i1 %c.1, label %loop.exit, label %loop.latch731 732loop.latch:733  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 1734  %iv.next = add nuw nsw i64 %iv, 1735  %c.2 = icmp eq i64 %iv.next, %n64736  br i1 %c.2, label %loop.exit, label %loop.header737 738loop.exit:739  %res = phi ptr [ %ptr.iv, %loop.header ], [ %end, %loop.latch ]740  %c.3 = icmp eq ptr %res, %end741  ret i1 %c.3742 743exit:744  ret i1 false745}746 747 748define i1 @multi_2_exiting_find_i8_loop_invalid_insn(ptr %vec, i8 %tgt) #0 {749; COMMON-LABEL: define i1 @multi_2_exiting_find_i8_loop_invalid_insn(750; COMMON-SAME: ptr [[VEC:%.*]], i8 [[TGT:%.*]]) #[[ATTR1:[0-9]+]] {751; COMMON-NEXT:  [[ENTRY:.*]]:752; COMMON-NEXT:    [[START:%.*]] = load ptr, ptr [[VEC]], align 8753; COMMON-NEXT:    [[GEP_END:%.*]] = getelementptr inbounds nuw i8, ptr [[VEC]], i64 1754; COMMON-NEXT:    [[END:%.*]] = load ptr, ptr [[GEP_END]], align 8755; COMMON-NEXT:    br label %[[LOOP_HEADER:.*]]756; COMMON:       [[LOOP_HEADER]]:757; COMMON-NEXT:    [[PTR_IV:%.*]] = phi ptr [ [[PTR_IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ], [ [[START]], %[[ENTRY]] ]758; COMMON-NEXT:    [[L:%.*]] = load i8, ptr [[PTR_IV]], align 8759; COMMON-NEXT:    [[DEINTER:%.*]] = call { <vscale x 16 x i8>, <vscale x 16 x i8> } @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> poison)760; COMMON-NEXT:    [[C_1:%.*]] = icmp eq i8 [[L]], [[TGT]]761; COMMON-NEXT:    br i1 [[C_1]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]762; COMMON:       [[LOOP_LATCH]]:763; COMMON-NEXT:    [[PTR_IV_NEXT]] = getelementptr inbounds nuw i8, ptr [[PTR_IV]], i64 1764; COMMON-NEXT:    [[C_2:%.*]] = icmp eq ptr [[PTR_IV_NEXT]], [[END]]765; COMMON-NEXT:    br i1 [[C_2]], label %[[EXIT]], label %[[LOOP_HEADER]]766; COMMON:       [[EXIT]]:767; COMMON-NEXT:    [[RES:%.*]] = phi ptr [ [[PTR_IV]], %[[LOOP_HEADER]] ], [ [[END]], %[[LOOP_LATCH]] ]768; COMMON-NEXT:    [[C_3:%.*]] = icmp eq ptr [[RES]], [[END]]769; COMMON-NEXT:    ret i1 [[C_3]]770;771entry:772  %start = load ptr, ptr %vec, align 8773  %gep.end = getelementptr inbounds nuw i8, ptr %vec, i64 1774  %end = load ptr, ptr %gep.end, align 8775  br label %loop.header776 777loop.header:778  %ptr.iv = phi ptr [ %ptr.iv.next, %loop.latch ], [ %start, %entry ]779  %l = load i8, ptr %ptr.iv, align 8780  %deinter = call {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8> poison)781  %c.1 = icmp eq i8 %l, %tgt782  br i1 %c.1, label %exit, label %loop.latch783 784loop.latch:785  %ptr.iv.next = getelementptr inbounds nuw i8, ptr %ptr.iv, i64 1786  %c.2 = icmp eq ptr %ptr.iv.next, %end787  br i1 %c.2, label %exit, label %loop.header788 789exit:790  %res = phi ptr [ %ptr.iv, %loop.header ], [ %end, %loop.latch ]791  %c.3 = icmp eq ptr %res, %end792  ret i1 %c.3793}794 795 796declare void @llvm.assume(i1 noundef)797declare {<vscale x 16 x i8>, <vscale x 16 x i8>} @llvm.vector.deinterleave2.nxv32i8(<vscale x 32 x i8>)798 799attributes #0 = { "target-features"="-sve,-sve2" }800