brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.3 KiB · a04b06e Raw
810 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 52; RUN: opt -p constraint-elimination -S %s | FileCheck %s3 4declare void @llvm.assume(i1)5 6define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known(ptr %s) {7; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known(8; CHECK-SAME: ptr [[S:%.*]]) {9; CHECK-NEXT:  [[ENTRY:.*]]:10; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]11; CHECK:       [[LOOP_HEADER]]:12; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]13; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 123414; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]15; CHECK:       [[LOOP_LATCH]]:16; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]17; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 118; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 1019; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 120; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]21; CHECK:       [[EXIT]]:22; CHECK-NEXT:    ret i1 true23;24entry:25  br label %loop.header26 27loop.header:28  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]29  %exitcond.not = icmp eq i32 %iv, 123430  br i1 %exitcond.not, label %exit, label %loop.latch31 32loop.latch:33  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv34  %0 = load i8, ptr %arrayidx, align 135  %latch.c = icmp ult i8 %0, 1036  %iv.next = add nuw nsw i32 %iv, 137  br i1 %latch.c, label %loop.header, label %exit38 39exit:40  %t = icmp ult i32 %iv, 123541  ret i1 %t42}43 44define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_start_value(ptr %s) {45; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_start_value(46; CHECK-SAME: ptr [[S:%.*]]) {47; CHECK-NEXT:  [[ENTRY:.*]]:48; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]49; CHECK:       [[LOOP_HEADER]]:50; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 1235, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]51; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 123452; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]53; CHECK:       [[LOOP_LATCH]]:54; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]55; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 156; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 1057; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 158; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]59; CHECK:       [[EXIT]]:60; CHECK-NEXT:    [[T:%.*]] = icmp ult i32 [[IV]], 123561; CHECK-NEXT:    ret i1 [[T]]62;63entry:64  br label %loop.header65 66loop.header:67  %iv = phi i32 [ 1235, %entry ], [ %iv.next, %loop.latch ]68  %exitcond.not = icmp eq i32 %iv, 123469  br i1 %exitcond.not, label %exit, label %loop.latch70 71loop.latch:72  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv73  %0 = load i8, ptr %arrayidx, align 174  %latch.c = icmp ult i8 %0, 1075  %iv.next = add i32 %iv, 176  br i1 %latch.c, label %loop.header, label %exit77 78exit:79  %t = icmp ult i32 %iv, 123580  ret i1 %t81}82 83define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known_due_to_precond_on_start_value(ptr %s, i32 %start) {84; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known_due_to_precond_on_start_value(85; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) {86; CHECK-NEXT:  [[ENTRY:.*]]:87; CHECK-NEXT:    [[PRE_C:%.*]] = icmp ule i32 [[START]], 123488; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE_C]])89; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]90; CHECK:       [[LOOP_HEADER]]:91; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]92; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 123493; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]94; CHECK:       [[LOOP_LATCH]]:95; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]96; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 197; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 1098; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 199; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]100; CHECK:       [[EXIT]]:101; CHECK-NEXT:    ret i1 true102;103entry:104  %pre.c = icmp ule i32 %start, 1234105  call void @llvm.assume(i1 %pre.c)106  br label %loop.header107 108loop.header:109  %iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ]110  %exitcond.not = icmp eq i32 %iv, 1234111  br i1 %exitcond.not, label %exit, label %loop.latch112 113loop.latch:114  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv115  %0 = load i8, ptr %arrayidx, align 1116  %latch.c = icmp ult i8 %0, 10117  %iv.next = add i32 %iv, 1118  br i1 %latch.c, label %loop.header, label %exit119 120exit:121  %t = icmp ult i32 %iv, 1235122  ret i1 %t123}124 125define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_precond_on_start_value(ptr %s, i32 %start) {126; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_precond_on_start_value(127; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) {128; CHECK-NEXT:  [[ENTRY:.*]]:129; CHECK-NEXT:    [[PRE_C:%.*]] = icmp ule i32 [[START]], 1236130; CHECK-NEXT:    call void @llvm.assume(i1 [[PRE_C]])131; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]132; CHECK:       [[LOOP_HEADER]]:133; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]134; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234135; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]136; CHECK:       [[LOOP_LATCH]]:137; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]138; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1139; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10140; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1141; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]142; CHECK:       [[EXIT]]:143; CHECK-NEXT:    [[T:%.*]] = icmp ult i32 [[IV]], 1236144; CHECK-NEXT:    ret i1 [[T]]145;146entry:147  %pre.c = icmp ule i32 %start, 1236148  call void @llvm.assume(i1 %pre.c)149  br label %loop.header150 151loop.header:152  %iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ]153  %exitcond.not = icmp eq i32 %iv, 1234154  br i1 %exitcond.not, label %exit, label %loop.latch155 156loop.latch:157  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv158  %0 = load i8, ptr %arrayidx, align 1159  %latch.c = icmp ult i8 %0, 10160  %iv.next = add i32 %iv, 1161  br i1 %latch.c, label %loop.header, label %exit162 163exit:164  %t = icmp ult i32 %iv, 1236165  ret i1 %t166}167 168define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_missing_precond(ptr %s, i32 %start) {169; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_missing_precond(170; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) {171; CHECK-NEXT:  [[ENTRY:.*]]:172; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]173; CHECK:       [[LOOP_HEADER]]:174; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]175; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234176; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]177; CHECK:       [[LOOP_LATCH]]:178; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]179; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1180; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10181; CHECK-NEXT:    [[IV_NEXT]] = add i32 [[IV]], 1182; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]183; CHECK:       [[EXIT]]:184; CHECK-NEXT:    [[T:%.*]] = icmp ult i32 [[IV]], 1236185; CHECK-NEXT:    ret i1 [[T]]186;187entry:188  br label %loop.header189 190loop.header:191  %iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ]192  %exitcond.not = icmp eq i32 %iv, 1234193  br i1 %exitcond.not, label %exit, label %loop.latch194 195loop.latch:196  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv197  %0 = load i8, ptr %arrayidx, align 1198  %latch.c = icmp ult i8 %0, 10199  %iv.next = add i32 %iv, 1200  br i1 %latch.c, label %loop.header, label %exit201 202exit:203  %t = icmp ult i32 %iv, 1236204  ret i1 %t205}206 207define i1 @multi_exiting_loop_eq_same_exit_with_out_loop_preds_const_compare_not_known(ptr %s, i1 %pre.c, i32 %x) {208; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_exit_with_out_loop_preds_const_compare_not_known(209; CHECK-SAME: ptr [[S:%.*]], i1 [[PRE_C:%.*]], i32 [[X:%.*]]) {210; CHECK-NEXT:  [[ENTRY:.*]]:211; CHECK-NEXT:    br i1 [[PRE_C]], label %[[LOOP_HEADER:.*]], label %[[EXIT:.*]]212; CHECK:       [[LOOP_HEADER]]:213; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]214; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234215; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT]], label %[[LOOP_LATCH]]216; CHECK:       [[LOOP_LATCH]]:217; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]218; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1219; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10220; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1221; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]222; CHECK:       [[EXIT]]:223; CHECK-NEXT:    [[P:%.*]] = phi i32 [ [[X]], %[[ENTRY]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IV]], %[[LOOP_LATCH]] ]224; CHECK-NEXT:    [[U:%.*]] = icmp ult i32 [[P]], 1235225; CHECK-NEXT:    ret i1 [[U]]226;227entry:228  br i1 %pre.c, label %loop.header, label %exit229 230loop.header:231  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]232  %exitcond.not = icmp eq i32 %iv, 1234233  br i1 %exitcond.not, label %exit, label %loop.latch234 235loop.latch:236  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv237  %0 = load i8, ptr %arrayidx, align 1238  %latch.c = icmp ult i8 %0, 10239  %iv.next = add nuw nsw i32 %iv, 1240  br i1 %latch.c, label %loop.header, label %exit241 242exit:243  %p = phi i32 [ %x, %entry ], [ %iv, %loop.header ], [ %iv, %loop.latch ]244  %u = icmp ult i32 %p, 1235245  ret i1 %u246}247 248define i1 @multi_exiting_loop_eq_same_unique_exit_successors_swapped(ptr %s) {249; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_successors_swapped(250; CHECK-SAME: ptr [[S:%.*]]) {251; CHECK-NEXT:  [[ENTRY:.*]]:252; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]253; CHECK:       [[LOOP_HEADER]]:254; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]255; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234256; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT:.*]]257; CHECK:       [[LOOP_LATCH]]:258; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]259; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1260; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10261; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1262; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]263; CHECK:       [[EXIT]]:264; CHECK-NEXT:    [[U:%.*]] = icmp ult i32 [[IV]], 1235265; CHECK-NEXT:    ret i1 [[U]]266;267entry:268  br label %loop.header269 270loop.header:271  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]272  %exitcond.not = icmp eq i32 %iv, 1234273  br i1 %exitcond.not, label %loop.latch, label %exit274 275loop.latch:276  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv277  %0 = load i8, ptr %arrayidx, align 1278  %latch.c = icmp ult i8 %0, 10279  %iv.next = add nuw nsw i32 %iv, 1280  br i1 %latch.c, label %loop.header, label %exit281 282exit:283  %u = icmp ult i32 %iv, 1235284  ret i1 %u285}286 287define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known(ptr %s) {288; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known(289; CHECK-SAME: ptr [[S:%.*]]) {290; CHECK-NEXT:  [[ENTRY:.*]]:291; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]292; CHECK:       [[LOOP_HEADER]]:293; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]294; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234295; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]296; CHECK:       [[LOOP_LATCH]]:297; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]298; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1299; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10300; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1301; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]302; CHECK:       [[EXIT]]:303; CHECK-NEXT:    [[U:%.*]] = icmp ult i32 [[IV]], 1234304; CHECK-NEXT:    ret i1 [[U]]305;306entry:307  br label %loop.header308 309loop.header:310  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]311  %exitcond.not = icmp eq i32 %iv, 1234312  br i1 %exitcond.not, label %exit, label %loop.latch313 314loop.latch:315  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv316  %0 = load i8, ptr %arrayidx, align 1317  %latch.c = icmp ult i8 %0, 10318  %iv.next = add nuw nsw i32 %iv, 1319  br i1 %latch.c, label %loop.header, label %exit320 321exit:322  %u = icmp ult i32 %iv, 1234323  ret i1 %u324}325 326define i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_known(ptr %s, i32 %N) {327; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_known(328; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) {329; CHECK-NEXT:  [[ENTRY:.*]]:330; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]331; CHECK:       [[LOOP_HEADER]]:332; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]333; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]]334; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]335; CHECK:       [[LOOP_LATCH]]:336; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]337; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1338; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10339; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1340; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]341; CHECK:       [[EXIT]]:342; CHECK-NEXT:    ret i1 true343;344entry:345  br label %loop.header346 347loop.header:348  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]349  %exitcond.not = icmp eq i32 %iv, %N350  br i1 %exitcond.not, label %exit, label %loop.latch351 352loop.latch:353  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv354  %0 = load i8, ptr %arrayidx, align 1355  %latch.c = icmp ult i8 %0, 10356  %iv.next = add nuw nsw i32 %iv, 1357  br i1 %latch.c, label %loop.header, label %exit358 359exit:360  %t = icmp ule i32 %iv, %N361  ret i1 %t362}363 364define i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_not_known_due_to_start(ptr %s, i32 %N) {365; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_not_known_due_to_start(366; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) {367; CHECK-NEXT:  [[ENTRY:.*]]:368; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]369; CHECK:       [[LOOP_HEADER]]:370; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]371; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]]372; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]373; CHECK:       [[LOOP_LATCH]]:374; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]375; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1376; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10377; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1378; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]379; CHECK:       [[EXIT]]:380; CHECK-NEXT:    [[C:%.*]] = icmp ule i32 [[IV]], [[N]]381; CHECK-NEXT:    ret i1 [[C]]382;383entry:384  br label %loop.header385 386loop.header:387  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]388  %exitcond.not = icmp eq i32 %iv, %N389  br i1 %exitcond.not, label %exit, label %loop.latch390 391loop.latch:392  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv393  %0 = load i8, ptr %arrayidx, align 1394  %latch.c = icmp ult i8 %0, 10395  %iv.next = add nuw nsw i32 %iv, 1396  br i1 %latch.c, label %loop.header, label %exit397 398exit:399  %c = icmp ule i32 %iv, %N400  ret i1 %c401}402 403define i1 @multi_exiting_loop_ne_same_unique_exit_const_compare_known(ptr %s) {404; CHECK-LABEL: define i1 @multi_exiting_loop_ne_same_unique_exit_const_compare_known(405; CHECK-SAME: ptr [[S:%.*]]) {406; CHECK-NEXT:  [[ENTRY:.*]]:407; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]408; CHECK:       [[LOOP_HEADER]]:409; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]410; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], 1234411; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT:.*]]412; CHECK:       [[LOOP_LATCH]]:413; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]414; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1415; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10416; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1417; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]418; CHECK:       [[EXIT]]:419; CHECK-NEXT:    ret i1 true420;421entry:422  br label %loop.header423 424loop.header:425  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]426  %exitcond.not = icmp ne i32 %iv, 1234427  br i1 %exitcond.not, label %loop.latch, label %exit428 429loop.latch:430  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv431  %0 = load i8, ptr %arrayidx, align 1432  %latch.c = icmp ult i8 %0, 10433  %iv.next = add nuw nsw i32 %iv, 1434  br i1 %latch.c, label %loop.header, label %exit435 436exit:437  %t = icmp ult i32 %iv, 1235438  ret i1 %t439}440 441define i1 @multi_exiting_loop_ne_same_unique_exit_successors_swapped(ptr %s) {442; CHECK-LABEL: define i1 @multi_exiting_loop_ne_same_unique_exit_successors_swapped(443; CHECK-SAME: ptr [[S:%.*]]) {444; CHECK-NEXT:  [[ENTRY:.*]]:445; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]446; CHECK:       [[LOOP_HEADER]]:447; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]448; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], 1234449; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]]450; CHECK:       [[LOOP_LATCH]]:451; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]452; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1453; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10454; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1455; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]]456; CHECK:       [[EXIT]]:457; CHECK-NEXT:    [[U:%.*]] = icmp ult i32 [[IV]], 1235458; CHECK-NEXT:    ret i1 [[U]]459;460entry:461  br label %loop.header462 463loop.header:464  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]465  %exitcond.not = icmp ne i32 %iv, 1234466  br i1 %exitcond.not, label %exit, label %loop.latch467 468loop.latch:469  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv470  %0 = load i8, ptr %arrayidx, align 1471  %latch.c = icmp ult i8 %0, 10472  %iv.next = add nuw nsw i32 %iv, 1473  br i1 %latch.c, label %loop.header, label %exit474 475exit:476  %u = icmp ult i32 %iv, 1235477  ret i1 %u478}479 480define i1 @multi_exiting_loop_eq_different_exits_const_compare_known(ptr %s) {481; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_const_compare_known(482; CHECK-SAME: ptr [[S:%.*]]) {483; CHECK-NEXT:  [[ENTRY:.*]]:484; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]485; CHECK:       [[LOOP_HEADER]]:486; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]487; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234488; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[LOOP_LATCH]]489; CHECK:       [[LOOP_LATCH]]:490; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]491; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1492; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10493; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1494; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]]495; CHECK:       [[EXIT_1]]:496; CHECK-NEXT:    ret i1 true497; CHECK:       [[EXIT_2]]:498; CHECK-NEXT:    ret i1 true499;500entry:501  br label %loop.header502 503loop.header:504  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]505  %exitcond.not = icmp eq i32 %iv, 1234506  br i1 %exitcond.not, label %exit.1, label %loop.latch507 508loop.latch:509  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv510  %0 = load i8, ptr %arrayidx, align 1511  %latch.c = icmp ult i8 %0, 10512  %iv.next = add nuw nsw i32 %iv, 1513  br i1 %latch.c, label %loop.header, label %exit.2514 515exit.1:516  %t.1 = icmp ult i32 %iv, 1235517  ret i1 %t.1518 519exit.2:520  %t.2 = icmp ult i32 %iv, 1235521  ret i1 %t.2522}523 524define i1 @multi_exiting_loop_eq_different_exits_2_const_compare_known(ptr %s, i1 %c.1, i1 %c.2) {525; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_2_const_compare_known(526; CHECK-SAME: ptr [[S:%.*]], i1 [[C_1:%.*]], i1 [[C_2:%.*]]) {527; CHECK-NEXT:  [[ENTRY:.*]]:528; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]529; CHECK:       [[LOOP_HEADER]]:530; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]531; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234532; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[ELSE_1:.*]]533; CHECK:       [[ELSE_1]]:534; CHECK-NEXT:    br i1 [[C_1]], label %[[EXIT_1]], label %[[ELSE_2:.*]]535; CHECK:       [[ELSE_2]]:536; CHECK-NEXT:    br i1 [[C_2]], label %[[EXIT_2:.*]], label %[[LOOP_LATCH]]537; CHECK:       [[LOOP_LATCH]]:538; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]539; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1540; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10541; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1542; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2]]543; CHECK:       [[EXIT_1]]:544; CHECK-NEXT:    ret i1 true545; CHECK:       [[EXIT_2]]:546; CHECK-NEXT:    ret i1 true547;548entry:549  br label %loop.header550 551loop.header:552  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]553  %exitcond.not = icmp eq i32 %iv, 1234554  br i1 %exitcond.not, label %exit.1, label %else.1555 556else.1:557  br i1 %c.1, label %exit.1, label %else.2558 559else.2:560  br i1 %c.2, label %exit.2, label %loop.latch561 562loop.latch:563  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv564  %0 = load i8, ptr %arrayidx, align 1565  %latch.c = icmp ult i8 %0, 10566  %iv.next = add nuw nsw i32 %iv, 1567  br i1 %latch.c, label %loop.header, label %exit.2568 569exit.1:570  %t.1 = icmp ult i32 %iv, 1235571  ret i1 %t.1572 573exit.2:574  %t.2 = icmp ult i32 %iv, 1235575  ret i1 %t.2576}577 578 579define i1 @multi_exiting_loop_eq_different_exits_compare_not_known(ptr %s, i32 %N) {580; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_compare_not_known(581; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) {582; CHECK-NEXT:  [[ENTRY:.*]]:583; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]584; CHECK:       [[LOOP_HEADER]]:585; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]586; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]]587; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[LOOP_LATCH]]588; CHECK:       [[LOOP_LATCH]]:589; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]590; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1591; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10592; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1593; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]]594; CHECK:       [[EXIT_1]]:595; CHECK-NEXT:    ret i1 false596; CHECK:       [[EXIT_2]]:597; CHECK-NEXT:    ret i1 true598;599entry:600  br label %loop.header601 602loop.header:603  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]604  %exitcond.not = icmp eq i32 %iv, %N605  br i1 %exitcond.not, label %exit.1, label %loop.latch606 607loop.latch:608  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv609  %0 = load i8, ptr %arrayidx, align 1610  %latch.c = icmp ult i8 %0, 10611  %iv.next = add nuw nsw i32 %iv, 1612  br i1 %latch.c, label %loop.header, label %exit.2613 614exit.1:615  %t.1 = icmp ult i32 %iv, %N616  ret i1 %t.1617 618exit.2:619  %t.2 = icmp ult i32 %iv, %N620  ret i1 %t.2621}622 623define i1 @multi_exiting_loop_eq_different_exits_2_compare_not_known(ptr %s, i32 %N, i1 %c.1, i1 %c.2) {624; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_2_compare_not_known(625; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]], i1 [[C_1:%.*]], i1 [[C_2:%.*]]) {626; CHECK-NEXT:  [[ENTRY:.*]]:627; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]628; CHECK:       [[LOOP_HEADER]]:629; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]630; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]]631; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[ELSE_1:.*]]632; CHECK:       [[ELSE_1]]:633; CHECK-NEXT:    br i1 [[C_1]], label %[[EXIT_1]], label %[[ELSE_2:.*]]634; CHECK:       [[ELSE_2]]:635; CHECK-NEXT:    br i1 [[C_2]], label %[[EXIT_2:.*]], label %[[LOOP_LATCH]]636; CHECK:       [[LOOP_LATCH]]:637; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]638; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1639; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10640; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1641; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2]]642; CHECK:       [[EXIT_1]]:643; CHECK-NEXT:    [[T_1:%.*]] = icmp ult i32 [[IV]], [[N]]644; CHECK-NEXT:    ret i1 [[T_1]]645; CHECK:       [[EXIT_2]]:646; CHECK-NEXT:    ret i1 true647;648entry:649  br label %loop.header650 651loop.header:652  %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ]653  %exitcond.not = icmp eq i32 %iv, %N654  br i1 %exitcond.not, label %exit.1, label %else.1655 656else.1:657  br i1 %c.1, label %exit.1, label %else.2658 659else.2:660  br i1 %c.2, label %exit.2, label %loop.latch661 662loop.latch:663  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv664  %0 = load i8, ptr %arrayidx, align 1665  %latch.c = icmp ult i8 %0, 10666  %iv.next = add nuw nsw i32 %iv, 1667  br i1 %latch.c, label %loop.header, label %exit.2668 669exit.1:670  %t.1 = icmp ult i32 %iv, %N671  ret i1 %t.1672 673exit.2:674  %t.2 = icmp ult i32 %iv, %N675  ret i1 %t.2676}677 678define i1 @multi_exiting_loop_ne_different_exits_const_compare_known(ptr %s) {679; CHECK-LABEL: define i1 @multi_exiting_loop_ne_different_exits_const_compare_known(680; CHECK-SAME: ptr [[S:%.*]]) {681; CHECK-NEXT:  [[ENTRY:.*]]:682; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]683; CHECK:       [[LOOP_HEADER]]:684; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]685; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], 1234686; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT_1:.*]]687; CHECK:       [[LOOP_LATCH]]:688; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]689; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1690; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10691; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1692; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]]693; CHECK:       [[EXIT_1]]:694; CHECK-NEXT:    ret i1 true695; CHECK:       [[EXIT_2]]:696; CHECK-NEXT:    ret i1 true697;698entry:699  br label %loop.header700 701loop.header:702  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]703  %exitcond.not = icmp ne i32 %iv, 1234704  br i1 %exitcond.not, label %loop.latch, label %exit.1705 706loop.latch:707  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv708  %0 = load i8, ptr %arrayidx, align 1709  %latch.c = icmp ult i8 %0, 10710  %iv.next = add nuw nsw i32 %iv, 1711  br i1 %latch.c, label %loop.header, label %exit.2712 713exit.1:714  %t.1 = icmp ult i32 %iv, 1235715  ret i1 %t.1716 717exit.2:718  %t.2 = icmp ult i32 %iv, 1235719  ret i1 %t.2720}721 722define i1 @multi_exiting_loop_ne_different_exits_compare_not_known(ptr %s, i32 %N) {723; CHECK-LABEL: define i1 @multi_exiting_loop_ne_different_exits_compare_not_known(724; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) {725; CHECK-NEXT:  [[ENTRY:.*]]:726; CHECK-NEXT:    br label %[[LOOP_HEADER:.*]]727; CHECK:       [[LOOP_HEADER]]:728; CHECK-NEXT:    [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ]729; CHECK-NEXT:    [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], [[N]]730; CHECK-NEXT:    br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT_1:.*]]731; CHECK:       [[LOOP_LATCH]]:732; CHECK-NEXT:    [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]]733; CHECK-NEXT:    [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1734; CHECK-NEXT:    [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10735; CHECK-NEXT:    [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1736; CHECK-NEXT:    br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]]737; CHECK:       [[EXIT_1]]:738; CHECK-NEXT:    ret i1 false739; CHECK:       [[EXIT_2]]:740; CHECK-NEXT:    [[T_2:%.*]] = icmp ult i32 [[IV]], [[N]]741; CHECK-NEXT:    ret i1 [[T_2]]742;743entry:744  br label %loop.header745 746loop.header:747  %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ]748  %exitcond.not = icmp ne i32 %iv, %N749  br i1 %exitcond.not, label %loop.latch, label %exit.1750 751loop.latch:752  %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv753  %0 = load i8, ptr %arrayidx, align 1754  %latch.c = icmp ult i8 %0, 10755  %iv.next = add nuw nsw i32 %iv, 1756  br i1 %latch.c, label %loop.header, label %exit.2757 758exit.1:759  %t.1 = icmp ult i32 %iv, %N760  ret i1 %t.1761 762exit.2:763  %t.2 = icmp ult i32 %iv, %N764  ret i1 %t.2765}766 767define i1 @test_non_dedicated_exit(i16 %n) {768; CHECK-LABEL: define i1 @test_non_dedicated_exit(769; CHECK-SAME: i16 [[N:%.*]]) {770; CHECK-NEXT:  [[ENTRY:.*:]]771; CHECK-NEXT:    [[COND:%.*]] = icmp slt i16 [[N]], 1772; CHECK-NEXT:    br i1 [[COND]], label %[[EXIT:.*]], label %[[LOOP_PREHEADER:.*]]773; CHECK:       [[LOOP_PREHEADER]]:774; CHECK-NEXT:    [[SUB:%.*]] = add nsw i16 [[N]], -1775; CHECK-NEXT:    [[EXT:%.*]] = zext nneg i16 [[SUB]] to i32776; CHECK-NEXT:    br label %[[LOOP:.*]]777; CHECK:       [[LOOP]]:778; CHECK-NEXT:    [[INDVAR:%.*]] = phi i32 [ [[INDVAR_INC:%.*]], %[[LOOP_LATCH:.*]] ], [ 0, %[[LOOP_PREHEADER]] ]779; CHECK-NEXT:    [[EXITCOND:%.*]] = icmp eq i32 [[INDVAR]], [[EXT]]780; CHECK-NEXT:    br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP_LATCH]]781; CHECK:       [[LOOP_LATCH]]:782; CHECK-NEXT:    [[INDVAR_INC]] = add nuw nsw i32 [[INDVAR]], 1783; CHECK-NEXT:    br label %[[LOOP]]784; CHECK:       [[EXIT]]:785; CHECK-NEXT:    [[CMP:%.*]] = icmp sgt i16 [[N]], 0786; CHECK-NEXT:    ret i1 [[CMP]]787;788entry:789  %cond = icmp slt i16 %n, 1790  br i1 %cond, label %exit, label %loop.preheader791 792loop.preheader:793  %sub = add nsw i16 %n, -1794  %ext = zext nneg i16 %sub to i32795  br label %loop796 797loop:798  %indvar = phi i32 [ %indvar.inc, %loop.latch ], [ 0, %loop.preheader ]799  %exitcond = icmp eq i32 %indvar, %ext800  br i1 %exitcond, label %exit, label %loop.latch801 802loop.latch:803  %indvar.inc = add nuw nsw i32 %indvar, 1804  br label %loop805 806exit:807  %cmp = icmp sgt i16 %n, 0808  ret i1 %cmp809}810