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