xref: /llvm-project/llvm/test/Transforms/ConstraintElimination/induction-condition-in-loop-exit.ll (revision 52361d0368b79841be12156bf03cf8c1851e5df7)
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