141d73504SFlorian Hahn; NOTE: Assertions have been autogenerated by utils/update_test_checks.py UTC_ARGS: --version 5 241d73504SFlorian Hahn; RUN: opt -p constraint-elimination -S %s | FileCheck %s 341d73504SFlorian Hahn 4b7b8d028SFlorian Hahndeclare void @llvm.assume(i1) 5b7b8d028SFlorian Hahn 641d73504SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known(ptr %s) { 741d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known( 841d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 941d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 1041d73504SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 1141d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 1241d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 1341d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 1441d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 1541d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 1641d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 1741d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 1841d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 1941d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 2041d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 2141d73504SFlorian Hahn; CHECK: [[EXIT]]: 225b927130SFlorian Hahn; CHECK-NEXT: ret i1 true 2341d73504SFlorian Hahn; 2441d73504SFlorian Hahnentry: 2541d73504SFlorian Hahn br label %loop.header 2641d73504SFlorian Hahn 2741d73504SFlorian Hahnloop.header: 2841d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 2941d73504SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 3041d73504SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 3141d73504SFlorian Hahn 3241d73504SFlorian Hahnloop.latch: 3341d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 3441d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 3541d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 3641d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 3741d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 3841d73504SFlorian Hahn 3941d73504SFlorian Hahnexit: 4041d73504SFlorian Hahn %t = icmp ult i32 %iv, 1235 4141d73504SFlorian Hahn ret i1 %t 4241d73504SFlorian Hahn} 4341d73504SFlorian Hahn 44b7b8d028SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_start_value(ptr %s) { 45b7b8d028SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_start_value( 46b7b8d028SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 47b7b8d028SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 48b7b8d028SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 49b7b8d028SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 50b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1235, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 51b7b8d028SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 52b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 53b7b8d028SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 54b7b8d028SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 55b7b8d028SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 56b7b8d028SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 57b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 58b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 59b7b8d028SFlorian Hahn; CHECK: [[EXIT]]: 60b7b8d028SFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1235 61b7b8d028SFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 62b7b8d028SFlorian Hahn; 63b7b8d028SFlorian Hahnentry: 64b7b8d028SFlorian Hahn br label %loop.header 65b7b8d028SFlorian Hahn 66b7b8d028SFlorian Hahnloop.header: 67b7b8d028SFlorian Hahn %iv = phi i32 [ 1235, %entry ], [ %iv.next, %loop.latch ] 68b7b8d028SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 69b7b8d028SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 70b7b8d028SFlorian Hahn 71b7b8d028SFlorian Hahnloop.latch: 72b7b8d028SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 73b7b8d028SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 74b7b8d028SFlorian Hahn %latch.c = icmp ult i8 %0, 10 75b7b8d028SFlorian Hahn %iv.next = add i32 %iv, 1 76b7b8d028SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 77b7b8d028SFlorian Hahn 78b7b8d028SFlorian Hahnexit: 79b7b8d028SFlorian Hahn %t = icmp ult i32 %iv, 1235 80b7b8d028SFlorian Hahn ret i1 %t 81b7b8d028SFlorian Hahn} 82b7b8d028SFlorian Hahn 83b7b8d028SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known_due_to_precond_on_start_value(ptr %s, i32 %start) { 84b7b8d028SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_known_due_to_precond_on_start_value( 85b7b8d028SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) { 86b7b8d028SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 87b7b8d028SFlorian Hahn; CHECK-NEXT: [[PRE_C:%.*]] = icmp ule i32 [[START]], 1234 88b7b8d028SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[PRE_C]]) 89b7b8d028SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 90b7b8d028SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 91b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 92b7b8d028SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 93b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 94b7b8d028SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 95b7b8d028SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 96b7b8d028SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 97b7b8d028SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 98b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 99b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 100b7b8d028SFlorian Hahn; CHECK: [[EXIT]]: 1015b927130SFlorian Hahn; CHECK-NEXT: ret i1 true 102b7b8d028SFlorian Hahn; 103b7b8d028SFlorian Hahnentry: 104b7b8d028SFlorian Hahn %pre.c = icmp ule i32 %start, 1234 105b7b8d028SFlorian Hahn call void @llvm.assume(i1 %pre.c) 106b7b8d028SFlorian Hahn br label %loop.header 107b7b8d028SFlorian Hahn 108b7b8d028SFlorian Hahnloop.header: 109b7b8d028SFlorian Hahn %iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ] 110b7b8d028SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 111b7b8d028SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 112b7b8d028SFlorian Hahn 113b7b8d028SFlorian Hahnloop.latch: 114b7b8d028SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 115b7b8d028SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 116b7b8d028SFlorian Hahn %latch.c = icmp ult i8 %0, 10 117b7b8d028SFlorian Hahn %iv.next = add i32 %iv, 1 118b7b8d028SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 119b7b8d028SFlorian Hahn 120b7b8d028SFlorian Hahnexit: 121b7b8d028SFlorian Hahn %t = icmp ult i32 %iv, 1235 122b7b8d028SFlorian Hahn ret i1 %t 123b7b8d028SFlorian Hahn} 124b7b8d028SFlorian Hahn 125b7b8d028SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_precond_on_start_value(ptr %s, i32 %start) { 126b7b8d028SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_precond_on_start_value( 127b7b8d028SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) { 128b7b8d028SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 129b7b8d028SFlorian Hahn; CHECK-NEXT: [[PRE_C:%.*]] = icmp ule i32 [[START]], 1236 130b7b8d028SFlorian Hahn; CHECK-NEXT: call void @llvm.assume(i1 [[PRE_C]]) 131b7b8d028SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 132b7b8d028SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 133b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 134b7b8d028SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 135b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 136b7b8d028SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 137b7b8d028SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 138b7b8d028SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 139b7b8d028SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 140b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 141b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 142b7b8d028SFlorian Hahn; CHECK: [[EXIT]]: 143b7b8d028SFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1236 144b7b8d028SFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 145b7b8d028SFlorian Hahn; 146b7b8d028SFlorian Hahnentry: 147b7b8d028SFlorian Hahn %pre.c = icmp ule i32 %start, 1236 148b7b8d028SFlorian Hahn call void @llvm.assume(i1 %pre.c) 149b7b8d028SFlorian Hahn br label %loop.header 150b7b8d028SFlorian Hahn 151b7b8d028SFlorian Hahnloop.header: 152b7b8d028SFlorian Hahn %iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ] 153b7b8d028SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 154b7b8d028SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 155b7b8d028SFlorian Hahn 156b7b8d028SFlorian Hahnloop.latch: 157b7b8d028SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 158b7b8d028SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 159b7b8d028SFlorian Hahn %latch.c = icmp ult i8 %0, 10 160b7b8d028SFlorian Hahn %iv.next = add i32 %iv, 1 161b7b8d028SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 162b7b8d028SFlorian Hahn 163b7b8d028SFlorian Hahnexit: 164b7b8d028SFlorian Hahn %t = icmp ult i32 %iv, 1236 165b7b8d028SFlorian Hahn ret i1 %t 166b7b8d028SFlorian Hahn} 167b7b8d028SFlorian Hahn 168b7b8d028SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_missing_precond(ptr %s, i32 %start) { 169b7b8d028SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known_due_to_missing_precond( 170b7b8d028SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[START:%.*]]) { 171b7b8d028SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 172b7b8d028SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 173b7b8d028SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 174b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ [[START]], %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 175b7b8d028SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 176b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 177b7b8d028SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 178b7b8d028SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 179b7b8d028SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 180b7b8d028SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 181b7b8d028SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add i32 [[IV]], 1 182b7b8d028SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 183b7b8d028SFlorian Hahn; CHECK: [[EXIT]]: 184b7b8d028SFlorian Hahn; CHECK-NEXT: [[T:%.*]] = icmp ult i32 [[IV]], 1236 185b7b8d028SFlorian Hahn; CHECK-NEXT: ret i1 [[T]] 186b7b8d028SFlorian Hahn; 187b7b8d028SFlorian Hahnentry: 188b7b8d028SFlorian Hahn br label %loop.header 189b7b8d028SFlorian Hahn 190b7b8d028SFlorian Hahnloop.header: 191b7b8d028SFlorian Hahn %iv = phi i32 [ %start, %entry ], [ %iv.next, %loop.latch ] 192b7b8d028SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 193b7b8d028SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 194b7b8d028SFlorian Hahn 195b7b8d028SFlorian Hahnloop.latch: 196b7b8d028SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 197b7b8d028SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 198b7b8d028SFlorian Hahn %latch.c = icmp ult i8 %0, 10 199b7b8d028SFlorian Hahn %iv.next = add i32 %iv, 1 200b7b8d028SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 201b7b8d028SFlorian Hahn 202b7b8d028SFlorian Hahnexit: 203b7b8d028SFlorian Hahn %t = icmp ult i32 %iv, 1236 204b7b8d028SFlorian Hahn ret i1 %t 205b7b8d028SFlorian Hahn} 206b7b8d028SFlorian Hahn 20741d73504SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_exit_with_out_loop_preds_const_compare_not_known(ptr %s, i1 %pre.c, i32 %x) { 20841d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_exit_with_out_loop_preds_const_compare_not_known( 20941d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i1 [[PRE_C:%.*]], i32 [[X:%.*]]) { 21041d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 21141d73504SFlorian Hahn; CHECK-NEXT: br i1 [[PRE_C]], label %[[LOOP_HEADER:.*]], label %[[EXIT:.*]] 21241d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 21341d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 21441d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 21541d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT]], label %[[LOOP_LATCH]] 21641d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 21741d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 21841d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 21941d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 22041d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 22141d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 22241d73504SFlorian Hahn; CHECK: [[EXIT]]: 22341d73504SFlorian Hahn; CHECK-NEXT: [[P:%.*]] = phi i32 [ [[X]], %[[ENTRY]] ], [ [[IV]], %[[LOOP_HEADER]] ], [ [[IV]], %[[LOOP_LATCH]] ] 22441d73504SFlorian Hahn; CHECK-NEXT: [[U:%.*]] = icmp ult i32 [[P]], 1235 22541d73504SFlorian Hahn; CHECK-NEXT: ret i1 [[U]] 22641d73504SFlorian Hahn; 22741d73504SFlorian Hahnentry: 22841d73504SFlorian Hahn br i1 %pre.c, label %loop.header, label %exit 22941d73504SFlorian Hahn 23041d73504SFlorian Hahnloop.header: 23141d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 23241d73504SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 23341d73504SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 23441d73504SFlorian Hahn 23541d73504SFlorian Hahnloop.latch: 23641d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 23741d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 23841d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 23941d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 24041d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 24141d73504SFlorian Hahn 24241d73504SFlorian Hahnexit: 24341d73504SFlorian Hahn %p = phi i32 [ %x, %entry ], [ %iv, %loop.header ], [ %iv, %loop.latch ] 24441d73504SFlorian Hahn %u = icmp ult i32 %p, 1235 24541d73504SFlorian Hahn ret i1 %u 24641d73504SFlorian Hahn} 24741d73504SFlorian Hahn 24841d73504SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_successors_swapped(ptr %s) { 24941d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_successors_swapped( 25041d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 25141d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 25241d73504SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 25341d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 25441d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 25541d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 25641d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT:.*]] 25741d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 25841d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 25941d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 26041d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 26141d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 26241d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 26341d73504SFlorian Hahn; CHECK: [[EXIT]]: 26441d73504SFlorian Hahn; CHECK-NEXT: [[U:%.*]] = icmp ult i32 [[IV]], 1235 26541d73504SFlorian Hahn; CHECK-NEXT: ret i1 [[U]] 26641d73504SFlorian Hahn; 26741d73504SFlorian Hahnentry: 26841d73504SFlorian Hahn br label %loop.header 26941d73504SFlorian Hahn 27041d73504SFlorian Hahnloop.header: 27141d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 27241d73504SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 27341d73504SFlorian Hahn br i1 %exitcond.not, label %loop.latch, label %exit 27441d73504SFlorian Hahn 27541d73504SFlorian Hahnloop.latch: 27641d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 27741d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 27841d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 27941d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 28041d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 28141d73504SFlorian Hahn 28241d73504SFlorian Hahnexit: 28341d73504SFlorian Hahn %u = icmp ult i32 %iv, 1235 28441d73504SFlorian Hahn ret i1 %u 28541d73504SFlorian Hahn} 28641d73504SFlorian Hahn 28741d73504SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known(ptr %s) { 28841d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_const_compare_not_known( 28941d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 29041d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 29141d73504SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 29241d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 29341d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 29441d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 29541d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 29641d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 29741d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 29841d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 29941d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 30041d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 30141d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 30241d73504SFlorian Hahn; CHECK: [[EXIT]]: 30341d73504SFlorian Hahn; CHECK-NEXT: [[U:%.*]] = icmp ult i32 [[IV]], 1234 30441d73504SFlorian Hahn; CHECK-NEXT: ret i1 [[U]] 30541d73504SFlorian Hahn; 30641d73504SFlorian Hahnentry: 30741d73504SFlorian Hahn br label %loop.header 30841d73504SFlorian Hahn 30941d73504SFlorian Hahnloop.header: 31041d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 31141d73504SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 31241d73504SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 31341d73504SFlorian Hahn 31441d73504SFlorian Hahnloop.latch: 31541d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 31641d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 31741d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 31841d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 31941d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 32041d73504SFlorian Hahn 32141d73504SFlorian Hahnexit: 32241d73504SFlorian Hahn %u = icmp ult i32 %iv, 1234 32341d73504SFlorian Hahn ret i1 %u 32441d73504SFlorian Hahn} 32541d73504SFlorian Hahn 32641d73504SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_known(ptr %s, i32 %N) { 32741d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_known( 32841d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) { 32941d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 33041d73504SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 33141d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 33241d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 33341d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]] 33441d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 33541d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 33641d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 33741d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 33841d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 33941d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 34041d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 34141d73504SFlorian Hahn; CHECK: [[EXIT]]: 3425b927130SFlorian Hahn; CHECK-NEXT: ret i1 true 34341d73504SFlorian Hahn; 34441d73504SFlorian Hahnentry: 34541d73504SFlorian Hahn br label %loop.header 34641d73504SFlorian Hahn 34741d73504SFlorian Hahnloop.header: 34841d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 34941d73504SFlorian Hahn %exitcond.not = icmp eq i32 %iv, %N 35041d73504SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 35141d73504SFlorian Hahn 35241d73504SFlorian Hahnloop.latch: 35341d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 35441d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 35541d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 35641d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 35741d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 35841d73504SFlorian Hahn 35941d73504SFlorian Hahnexit: 36041d73504SFlorian Hahn %t = icmp ule i32 %iv, %N 36141d73504SFlorian Hahn ret i1 %t 36241d73504SFlorian Hahn} 36341d73504SFlorian Hahn 3643d11b3d7SFlorian Hahndefine i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_not_known_due_to_start(ptr %s, i32 %N) { 3653d11b3d7SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_same_unique_exit_var_compare_not_known_due_to_start( 3663d11b3d7SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) { 3673d11b3d7SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 3683d11b3d7SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 3693d11b3d7SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 3703d11b3d7SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 3713d11b3d7SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]] 3723d11b3d7SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 3733d11b3d7SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 3743d11b3d7SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 3753d11b3d7SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 3763d11b3d7SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 3773d11b3d7SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 3783d11b3d7SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 3793d11b3d7SFlorian Hahn; CHECK: [[EXIT]]: 3803d11b3d7SFlorian Hahn; CHECK-NEXT: [[C:%.*]] = icmp ule i32 [[IV]], [[N]] 3813d11b3d7SFlorian Hahn; CHECK-NEXT: ret i1 [[C]] 3823d11b3d7SFlorian Hahn; 3833d11b3d7SFlorian Hahnentry: 3843d11b3d7SFlorian Hahn br label %loop.header 3853d11b3d7SFlorian Hahn 3863d11b3d7SFlorian Hahnloop.header: 3873d11b3d7SFlorian Hahn %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ] 3883d11b3d7SFlorian Hahn %exitcond.not = icmp eq i32 %iv, %N 3893d11b3d7SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 3903d11b3d7SFlorian Hahn 3913d11b3d7SFlorian Hahnloop.latch: 3923d11b3d7SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 3933d11b3d7SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 3943d11b3d7SFlorian Hahn %latch.c = icmp ult i8 %0, 10 3953d11b3d7SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 3963d11b3d7SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 3973d11b3d7SFlorian Hahn 3983d11b3d7SFlorian Hahnexit: 3993d11b3d7SFlorian Hahn %c = icmp ule i32 %iv, %N 4003d11b3d7SFlorian Hahn ret i1 %c 4013d11b3d7SFlorian Hahn} 4023d11b3d7SFlorian Hahn 40341d73504SFlorian Hahndefine i1 @multi_exiting_loop_ne_same_unique_exit_const_compare_known(ptr %s) { 40441d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_ne_same_unique_exit_const_compare_known( 40541d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 40641d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 40741d73504SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 40841d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 40941d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 41041d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], 1234 41141d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT:.*]] 41241d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 41341d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 41441d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 41541d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 41641d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 41741d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 41841d73504SFlorian Hahn; CHECK: [[EXIT]]: 4195b927130SFlorian Hahn; CHECK-NEXT: ret i1 true 42041d73504SFlorian Hahn; 42141d73504SFlorian Hahnentry: 42241d73504SFlorian Hahn br label %loop.header 42341d73504SFlorian Hahn 42441d73504SFlorian Hahnloop.header: 42541d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 42641d73504SFlorian Hahn %exitcond.not = icmp ne i32 %iv, 1234 42741d73504SFlorian Hahn br i1 %exitcond.not, label %loop.latch, label %exit 42841d73504SFlorian Hahn 42941d73504SFlorian Hahnloop.latch: 43041d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 43141d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 43241d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 43341d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 43441d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 43541d73504SFlorian Hahn 43641d73504SFlorian Hahnexit: 43741d73504SFlorian Hahn %t = icmp ult i32 %iv, 1235 43841d73504SFlorian Hahn ret i1 %t 43941d73504SFlorian Hahn} 44041d73504SFlorian Hahn 44141d73504SFlorian Hahndefine i1 @multi_exiting_loop_ne_same_unique_exit_successors_swapped(ptr %s) { 44241d73504SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_ne_same_unique_exit_successors_swapped( 44341d73504SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 44441d73504SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 44541d73504SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 44641d73504SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 44741d73504SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 44841d73504SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], 1234 44941d73504SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT:.*]], label %[[LOOP_LATCH]] 45041d73504SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 45141d73504SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 45241d73504SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 45341d73504SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 45441d73504SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 45541d73504SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT]] 45641d73504SFlorian Hahn; CHECK: [[EXIT]]: 45741d73504SFlorian Hahn; CHECK-NEXT: [[U:%.*]] = icmp ult i32 [[IV]], 1235 45841d73504SFlorian Hahn; CHECK-NEXT: ret i1 [[U]] 45941d73504SFlorian Hahn; 46041d73504SFlorian Hahnentry: 46141d73504SFlorian Hahn br label %loop.header 46241d73504SFlorian Hahn 46341d73504SFlorian Hahnloop.header: 46441d73504SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 46541d73504SFlorian Hahn %exitcond.not = icmp ne i32 %iv, 1234 46641d73504SFlorian Hahn br i1 %exitcond.not, label %exit, label %loop.latch 46741d73504SFlorian Hahn 46841d73504SFlorian Hahnloop.latch: 46941d73504SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 47041d73504SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 47141d73504SFlorian Hahn %latch.c = icmp ult i8 %0, 10 47241d73504SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 47341d73504SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit 47441d73504SFlorian Hahn 47541d73504SFlorian Hahnexit: 47641d73504SFlorian Hahn %u = icmp ult i32 %iv, 1235 47741d73504SFlorian Hahn ret i1 %u 47841d73504SFlorian Hahn} 4793d11b3d7SFlorian Hahn 480798754f6SFlorian Hahndefine i1 @multi_exiting_loop_eq_different_exits_const_compare_known(ptr %s) { 481798754f6SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_const_compare_known( 482798754f6SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 483798754f6SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 484798754f6SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 485798754f6SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 486798754f6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 487798754f6SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 488798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[LOOP_LATCH]] 489798754f6SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 490798754f6SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 491798754f6SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 492798754f6SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 493798754f6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 494798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]] 495798754f6SFlorian Hahn; CHECK: [[EXIT_1]]: 496798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 497798754f6SFlorian Hahn; CHECK: [[EXIT_2]]: 498798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 499798754f6SFlorian Hahn; 500798754f6SFlorian Hahnentry: 501798754f6SFlorian Hahn br label %loop.header 5023d11b3d7SFlorian Hahn 503798754f6SFlorian Hahnloop.header: 504798754f6SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 505798754f6SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 506798754f6SFlorian Hahn br i1 %exitcond.not, label %exit.1, label %loop.latch 507798754f6SFlorian Hahn 508798754f6SFlorian Hahnloop.latch: 509798754f6SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 510798754f6SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 511798754f6SFlorian Hahn %latch.c = icmp ult i8 %0, 10 512798754f6SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 513798754f6SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit.2 514798754f6SFlorian Hahn 515798754f6SFlorian Hahnexit.1: 516798754f6SFlorian Hahn %t.1 = icmp ult i32 %iv, 1235 517798754f6SFlorian Hahn ret i1 %t.1 518798754f6SFlorian Hahn 519798754f6SFlorian Hahnexit.2: 520798754f6SFlorian Hahn %t.2 = icmp ult i32 %iv, 1235 521798754f6SFlorian Hahn ret i1 %t.2 522798754f6SFlorian Hahn} 523798754f6SFlorian Hahn 524798754f6SFlorian Hahndefine i1 @multi_exiting_loop_eq_different_exits_2_const_compare_known(ptr %s, i1 %c.1, i1 %c.2) { 525798754f6SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_2_const_compare_known( 526798754f6SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i1 [[C_1:%.*]], i1 [[C_2:%.*]]) { 527798754f6SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 528798754f6SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 529798754f6SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 530798754f6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 531798754f6SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], 1234 532798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[ELSE_1:.*]] 533798754f6SFlorian Hahn; CHECK: [[ELSE_1]]: 534798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label %[[EXIT_1]], label %[[ELSE_2:.*]] 535798754f6SFlorian Hahn; CHECK: [[ELSE_2]]: 536798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[C_2]], label %[[EXIT_2:.*]], label %[[LOOP_LATCH]] 537798754f6SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 538798754f6SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 539798754f6SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 540798754f6SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 541798754f6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 542798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2]] 543798754f6SFlorian Hahn; CHECK: [[EXIT_1]]: 5445b927130SFlorian Hahn; CHECK-NEXT: ret i1 true 545798754f6SFlorian Hahn; CHECK: [[EXIT_2]]: 546798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 547798754f6SFlorian Hahn; 548798754f6SFlorian Hahnentry: 549798754f6SFlorian Hahn br label %loop.header 550798754f6SFlorian Hahn 551798754f6SFlorian Hahnloop.header: 552798754f6SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 553798754f6SFlorian Hahn %exitcond.not = icmp eq i32 %iv, 1234 554798754f6SFlorian Hahn br i1 %exitcond.not, label %exit.1, label %else.1 555798754f6SFlorian Hahn 556798754f6SFlorian Hahnelse.1: 557798754f6SFlorian Hahn br i1 %c.1, label %exit.1, label %else.2 558798754f6SFlorian Hahn 559798754f6SFlorian Hahnelse.2: 560798754f6SFlorian Hahn br i1 %c.2, label %exit.2, label %loop.latch 561798754f6SFlorian Hahn 562798754f6SFlorian Hahnloop.latch: 563798754f6SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 564798754f6SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 565798754f6SFlorian Hahn %latch.c = icmp ult i8 %0, 10 566798754f6SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 567798754f6SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit.2 568798754f6SFlorian Hahn 569798754f6SFlorian Hahnexit.1: 570798754f6SFlorian Hahn %t.1 = icmp ult i32 %iv, 1235 571798754f6SFlorian Hahn ret i1 %t.1 572798754f6SFlorian Hahn 573798754f6SFlorian Hahnexit.2: 574798754f6SFlorian Hahn %t.2 = icmp ult i32 %iv, 1235 575798754f6SFlorian Hahn ret i1 %t.2 576798754f6SFlorian Hahn} 577798754f6SFlorian Hahn 578798754f6SFlorian Hahn 579798754f6SFlorian Hahndefine i1 @multi_exiting_loop_eq_different_exits_compare_not_known(ptr %s, i32 %N) { 580798754f6SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_compare_not_known( 581798754f6SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) { 582798754f6SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 583798754f6SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 584798754f6SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 585798754f6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 586798754f6SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]] 587798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[LOOP_LATCH]] 588798754f6SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 589798754f6SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 590798754f6SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 591798754f6SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 592798754f6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 593798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]] 594798754f6SFlorian Hahn; CHECK: [[EXIT_1]]: 595798754f6SFlorian Hahn; CHECK-NEXT: ret i1 false 596798754f6SFlorian Hahn; CHECK: [[EXIT_2]]: 597798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 598798754f6SFlorian Hahn; 599798754f6SFlorian Hahnentry: 600798754f6SFlorian Hahn br label %loop.header 601798754f6SFlorian Hahn 602798754f6SFlorian Hahnloop.header: 603798754f6SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 604798754f6SFlorian Hahn %exitcond.not = icmp eq i32 %iv, %N 605798754f6SFlorian Hahn br i1 %exitcond.not, label %exit.1, label %loop.latch 606798754f6SFlorian Hahn 607798754f6SFlorian Hahnloop.latch: 608798754f6SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 609798754f6SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 610798754f6SFlorian Hahn %latch.c = icmp ult i8 %0, 10 611798754f6SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 612798754f6SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit.2 613798754f6SFlorian Hahn 614798754f6SFlorian Hahnexit.1: 615798754f6SFlorian Hahn %t.1 = icmp ult i32 %iv, %N 616798754f6SFlorian Hahn ret i1 %t.1 617798754f6SFlorian Hahn 618798754f6SFlorian Hahnexit.2: 619798754f6SFlorian Hahn %t.2 = icmp ult i32 %iv, %N 620798754f6SFlorian Hahn ret i1 %t.2 621798754f6SFlorian Hahn} 622798754f6SFlorian Hahn 623798754f6SFlorian Hahndefine i1 @multi_exiting_loop_eq_different_exits_2_compare_not_known(ptr %s, i32 %N, i1 %c.1, i1 %c.2) { 624798754f6SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_eq_different_exits_2_compare_not_known( 625798754f6SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]], i1 [[C_1:%.*]], i1 [[C_2:%.*]]) { 626798754f6SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 627798754f6SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 628798754f6SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 629798754f6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 0, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 630798754f6SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp eq i32 [[IV]], [[N]] 631798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[EXIT_1:.*]], label %[[ELSE_1:.*]] 632798754f6SFlorian Hahn; CHECK: [[ELSE_1]]: 633798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[C_1]], label %[[EXIT_1]], label %[[ELSE_2:.*]] 634798754f6SFlorian Hahn; CHECK: [[ELSE_2]]: 635798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[C_2]], label %[[EXIT_2:.*]], label %[[LOOP_LATCH]] 636798754f6SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 637798754f6SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 638798754f6SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 639798754f6SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 640798754f6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 641798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2]] 642798754f6SFlorian Hahn; CHECK: [[EXIT_1]]: 643798754f6SFlorian Hahn; CHECK-NEXT: [[T_1:%.*]] = icmp ult i32 [[IV]], [[N]] 644798754f6SFlorian Hahn; CHECK-NEXT: ret i1 [[T_1]] 645798754f6SFlorian Hahn; CHECK: [[EXIT_2]]: 646798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 647798754f6SFlorian Hahn; 648798754f6SFlorian Hahnentry: 649798754f6SFlorian Hahn br label %loop.header 650798754f6SFlorian Hahn 651798754f6SFlorian Hahnloop.header: 652798754f6SFlorian Hahn %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop.latch ] 653798754f6SFlorian Hahn %exitcond.not = icmp eq i32 %iv, %N 654798754f6SFlorian Hahn br i1 %exitcond.not, label %exit.1, label %else.1 655798754f6SFlorian Hahn 656798754f6SFlorian Hahnelse.1: 657798754f6SFlorian Hahn br i1 %c.1, label %exit.1, label %else.2 658798754f6SFlorian Hahn 659798754f6SFlorian Hahnelse.2: 660798754f6SFlorian Hahn br i1 %c.2, label %exit.2, label %loop.latch 661798754f6SFlorian Hahn 662798754f6SFlorian Hahnloop.latch: 663798754f6SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 664798754f6SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 665798754f6SFlorian Hahn %latch.c = icmp ult i8 %0, 10 666798754f6SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 667798754f6SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit.2 668798754f6SFlorian Hahn 669798754f6SFlorian Hahnexit.1: 670798754f6SFlorian Hahn %t.1 = icmp ult i32 %iv, %N 671798754f6SFlorian Hahn ret i1 %t.1 672798754f6SFlorian Hahn 673798754f6SFlorian Hahnexit.2: 674798754f6SFlorian Hahn %t.2 = icmp ult i32 %iv, %N 675798754f6SFlorian Hahn ret i1 %t.2 676798754f6SFlorian Hahn} 677798754f6SFlorian Hahn 678798754f6SFlorian Hahndefine i1 @multi_exiting_loop_ne_different_exits_const_compare_known(ptr %s) { 679798754f6SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_ne_different_exits_const_compare_known( 680798754f6SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]]) { 681798754f6SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 682798754f6SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 683798754f6SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 684798754f6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 685798754f6SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], 1234 686798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT_1:.*]] 687798754f6SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 688798754f6SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 689798754f6SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 690798754f6SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 691798754f6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 692798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]] 693798754f6SFlorian Hahn; CHECK: [[EXIT_1]]: 694798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 695798754f6SFlorian Hahn; CHECK: [[EXIT_2]]: 696798754f6SFlorian Hahn; CHECK-NEXT: ret i1 true 697798754f6SFlorian Hahn; 698798754f6SFlorian Hahnentry: 699798754f6SFlorian Hahn br label %loop.header 700798754f6SFlorian Hahn 701798754f6SFlorian Hahnloop.header: 702798754f6SFlorian Hahn %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ] 703798754f6SFlorian Hahn %exitcond.not = icmp ne i32 %iv, 1234 704798754f6SFlorian Hahn br i1 %exitcond.not, label %loop.latch, label %exit.1 705798754f6SFlorian Hahn 706798754f6SFlorian Hahnloop.latch: 707798754f6SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 708798754f6SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 709798754f6SFlorian Hahn %latch.c = icmp ult i8 %0, 10 710798754f6SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 711798754f6SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit.2 712798754f6SFlorian Hahn 713798754f6SFlorian Hahnexit.1: 714798754f6SFlorian Hahn %t.1 = icmp ult i32 %iv, 1235 715798754f6SFlorian Hahn ret i1 %t.1 716798754f6SFlorian Hahn 717798754f6SFlorian Hahnexit.2: 718798754f6SFlorian Hahn %t.2 = icmp ult i32 %iv, 1235 719798754f6SFlorian Hahn ret i1 %t.2 720798754f6SFlorian Hahn} 721798754f6SFlorian Hahn 722798754f6SFlorian Hahndefine i1 @multi_exiting_loop_ne_different_exits_compare_not_known(ptr %s, i32 %N) { 723798754f6SFlorian Hahn; CHECK-LABEL: define i1 @multi_exiting_loop_ne_different_exits_compare_not_known( 724798754f6SFlorian Hahn; CHECK-SAME: ptr [[S:%.*]], i32 [[N:%.*]]) { 725798754f6SFlorian Hahn; CHECK-NEXT: [[ENTRY:.*]]: 726798754f6SFlorian Hahn; CHECK-NEXT: br label %[[LOOP_HEADER:.*]] 727798754f6SFlorian Hahn; CHECK: [[LOOP_HEADER]]: 728798754f6SFlorian Hahn; CHECK-NEXT: [[IV:%.*]] = phi i32 [ 1, %[[ENTRY]] ], [ [[IV_NEXT:%.*]], %[[LOOP_LATCH:.*]] ] 729798754f6SFlorian Hahn; CHECK-NEXT: [[EXITCOND_NOT:%.*]] = icmp ne i32 [[IV]], [[N]] 730798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[EXITCOND_NOT]], label %[[LOOP_LATCH]], label %[[EXIT_1:.*]] 731798754f6SFlorian Hahn; CHECK: [[LOOP_LATCH]]: 732798754f6SFlorian Hahn; CHECK-NEXT: [[ARRAYIDX:%.*]] = getelementptr inbounds i8, ptr [[S]], i32 [[IV]] 733798754f6SFlorian Hahn; CHECK-NEXT: [[TMP0:%.*]] = load i8, ptr [[ARRAYIDX]], align 1 734798754f6SFlorian Hahn; CHECK-NEXT: [[LATCH_C:%.*]] = icmp ult i8 [[TMP0]], 10 735798754f6SFlorian Hahn; CHECK-NEXT: [[IV_NEXT]] = add nuw nsw i32 [[IV]], 1 736798754f6SFlorian Hahn; CHECK-NEXT: br i1 [[LATCH_C]], label %[[LOOP_HEADER]], label %[[EXIT_2:.*]] 737798754f6SFlorian Hahn; CHECK: [[EXIT_1]]: 738798754f6SFlorian Hahn; CHECK-NEXT: ret i1 false 739798754f6SFlorian Hahn; CHECK: [[EXIT_2]]: 740798754f6SFlorian Hahn; CHECK-NEXT: [[T_2:%.*]] = icmp ult i32 [[IV]], [[N]] 741798754f6SFlorian Hahn; CHECK-NEXT: ret i1 [[T_2]] 742798754f6SFlorian Hahn; 743798754f6SFlorian Hahnentry: 744798754f6SFlorian Hahn br label %loop.header 745798754f6SFlorian Hahn 746798754f6SFlorian Hahnloop.header: 747798754f6SFlorian Hahn %iv = phi i32 [ 1, %entry ], [ %iv.next, %loop.latch ] 748798754f6SFlorian Hahn %exitcond.not = icmp ne i32 %iv, %N 749798754f6SFlorian Hahn br i1 %exitcond.not, label %loop.latch, label %exit.1 750798754f6SFlorian Hahn 751798754f6SFlorian Hahnloop.latch: 752798754f6SFlorian Hahn %arrayidx = getelementptr inbounds i8, ptr %s, i32 %iv 753798754f6SFlorian Hahn %0 = load i8, ptr %arrayidx, align 1 754798754f6SFlorian Hahn %latch.c = icmp ult i8 %0, 10 755798754f6SFlorian Hahn %iv.next = add nuw nsw i32 %iv, 1 756798754f6SFlorian Hahn br i1 %latch.c, label %loop.header, label %exit.2 757798754f6SFlorian Hahn 758798754f6SFlorian Hahnexit.1: 759798754f6SFlorian Hahn %t.1 = icmp ult i32 %iv, %N 760798754f6SFlorian Hahn ret i1 %t.1 761798754f6SFlorian Hahn 762798754f6SFlorian Hahnexit.2: 763798754f6SFlorian Hahn %t.2 = icmp ult i32 %iv, %N 764798754f6SFlorian Hahn ret i1 %t.2 765798754f6SFlorian Hahn} 766*52361d03SYingwei Zheng 767*52361d03SYingwei Zhengdefine i1 @test_non_dedicated_exit(i16 %n) { 768*52361d03SYingwei Zheng; CHECK-LABEL: define i1 @test_non_dedicated_exit( 769*52361d03SYingwei Zheng; CHECK-SAME: i16 [[N:%.*]]) { 770*52361d03SYingwei Zheng; CHECK-NEXT: [[ENTRY:.*:]] 771*52361d03SYingwei Zheng; CHECK-NEXT: [[COND:%.*]] = icmp slt i16 [[N]], 1 772*52361d03SYingwei Zheng; CHECK-NEXT: br i1 [[COND]], label %[[EXIT:.*]], label %[[LOOP_PREHEADER:.*]] 773*52361d03SYingwei Zheng; CHECK: [[LOOP_PREHEADER]]: 774*52361d03SYingwei Zheng; CHECK-NEXT: [[SUB:%.*]] = add nsw i16 [[N]], -1 775*52361d03SYingwei Zheng; CHECK-NEXT: [[EXT:%.*]] = zext nneg i16 [[SUB]] to i32 776*52361d03SYingwei Zheng; CHECK-NEXT: br label %[[LOOP:.*]] 777*52361d03SYingwei Zheng; CHECK: [[LOOP]]: 778*52361d03SYingwei Zheng; CHECK-NEXT: [[INDVAR:%.*]] = phi i32 [ [[INDVAR_INC:%.*]], %[[LOOP_LATCH:.*]] ], [ 0, %[[LOOP_PREHEADER]] ] 779*52361d03SYingwei Zheng; CHECK-NEXT: [[EXITCOND:%.*]] = icmp eq i32 [[INDVAR]], [[EXT]] 780*52361d03SYingwei Zheng; CHECK-NEXT: br i1 [[EXITCOND]], label %[[EXIT]], label %[[LOOP_LATCH]] 781*52361d03SYingwei Zheng; CHECK: [[LOOP_LATCH]]: 782*52361d03SYingwei Zheng; CHECK-NEXT: [[INDVAR_INC]] = add nuw nsw i32 [[INDVAR]], 1 783*52361d03SYingwei Zheng; CHECK-NEXT: br label %[[LOOP]] 784*52361d03SYingwei Zheng; CHECK: [[EXIT]]: 785*52361d03SYingwei Zheng; CHECK-NEXT: [[CMP:%.*]] = icmp sgt i16 [[N]], 0 786*52361d03SYingwei Zheng; CHECK-NEXT: ret i1 [[CMP]] 787*52361d03SYingwei Zheng; 788*52361d03SYingwei Zhengentry: 789*52361d03SYingwei Zheng %cond = icmp slt i16 %n, 1 790*52361d03SYingwei Zheng br i1 %cond, label %exit, label %loop.preheader 791*52361d03SYingwei Zheng 792*52361d03SYingwei Zhengloop.preheader: 793*52361d03SYingwei Zheng %sub = add nsw i16 %n, -1 794*52361d03SYingwei Zheng %ext = zext nneg i16 %sub to i32 795*52361d03SYingwei Zheng br label %loop 796*52361d03SYingwei Zheng 797*52361d03SYingwei Zhengloop: 798*52361d03SYingwei Zheng %indvar = phi i32 [ %indvar.inc, %loop.latch ], [ 0, %loop.preheader ] 799*52361d03SYingwei Zheng %exitcond = icmp eq i32 %indvar, %ext 800*52361d03SYingwei Zheng br i1 %exitcond, label %exit, label %loop.latch 801*52361d03SYingwei Zheng 802*52361d03SYingwei Zhengloop.latch: 803*52361d03SYingwei Zheng %indvar.inc = add nuw nsw i32 %indvar, 1 804*52361d03SYingwei Zheng br label %loop 805*52361d03SYingwei Zheng 806*52361d03SYingwei Zhengexit: 807*52361d03SYingwei Zheng %cmp = icmp sgt i16 %n, 0 808*52361d03SYingwei Zheng ret i1 %cmp 809*52361d03SYingwei Zheng} 810