xref: /aosp_15_r20/external/llvm/test/Transforms/IndVarSimplify/eliminate-comparison.ll (revision 9880d6810fe72a1726cb53787c6711e909410d58)
1*9880d681SAndroid Build Coastguard Worker; RUN: opt -indvars -S < %s | FileCheck %s
2*9880d681SAndroid Build Coastguard Worker
3*9880d681SAndroid Build Coastguard Workertarget datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64-f32:32:32-f64:64:64-v64:64:64-v128:128:128-a0:0:64-s0:64:64-f80:128:128-n8:16:32:64"
4*9880d681SAndroid Build Coastguard Worker
5*9880d681SAndroid Build Coastguard Worker@X = external global [0 x double]
6*9880d681SAndroid Build Coastguard Worker
7*9880d681SAndroid Build Coastguard Worker; Indvars should be able to simplify simple comparisons involving
8*9880d681SAndroid Build Coastguard Worker; induction variables.
9*9880d681SAndroid Build Coastguard Worker
10*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @foo(
11*9880d681SAndroid Build Coastguard Worker; CHECK: %cond = and i1 %tobool.not, true
12*9880d681SAndroid Build Coastguard Worker
13*9880d681SAndroid Build Coastguard Workerdefine void @foo(i64 %n, i32* nocapture %p) nounwind {
14*9880d681SAndroid Build Coastguard Workerentry:
15*9880d681SAndroid Build Coastguard Worker  %cmp9 = icmp sgt i64 %n, 0
16*9880d681SAndroid Build Coastguard Worker  br i1 %cmp9, label %pre, label %return
17*9880d681SAndroid Build Coastguard Worker
18*9880d681SAndroid Build Coastguard Workerpre:
19*9880d681SAndroid Build Coastguard Worker  %t3 = load i32, i32* %p
20*9880d681SAndroid Build Coastguard Worker  %tobool.not = icmp ne i32 %t3, 0
21*9880d681SAndroid Build Coastguard Worker  br label %loop
22*9880d681SAndroid Build Coastguard Worker
23*9880d681SAndroid Build Coastguard Workerloop:
24*9880d681SAndroid Build Coastguard Worker  %i = phi i64 [ 0, %pre ], [ %inc, %for.inc ]
25*9880d681SAndroid Build Coastguard Worker  %cmp6 = icmp slt i64 %i, %n
26*9880d681SAndroid Build Coastguard Worker  %cond = and i1 %tobool.not, %cmp6
27*9880d681SAndroid Build Coastguard Worker  br i1 %cond, label %if.then, label %for.inc
28*9880d681SAndroid Build Coastguard Worker
29*9880d681SAndroid Build Coastguard Workerif.then:
30*9880d681SAndroid Build Coastguard Worker  %arrayidx = getelementptr [0 x double], [0 x double]* @X, i64 0, i64 %i
31*9880d681SAndroid Build Coastguard Worker  store double 3.200000e+00, double* %arrayidx
32*9880d681SAndroid Build Coastguard Worker  br label %for.inc
33*9880d681SAndroid Build Coastguard Worker
34*9880d681SAndroid Build Coastguard Workerfor.inc:
35*9880d681SAndroid Build Coastguard Worker  %inc = add nsw i64 %i, 1
36*9880d681SAndroid Build Coastguard Worker  %exitcond = icmp sge i64 %inc, %n
37*9880d681SAndroid Build Coastguard Worker  br i1 %exitcond, label %return, label %loop
38*9880d681SAndroid Build Coastguard Worker
39*9880d681SAndroid Build Coastguard Workerreturn:
40*9880d681SAndroid Build Coastguard Worker  ret void
41*9880d681SAndroid Build Coastguard Worker}
42*9880d681SAndroid Build Coastguard Worker
43*9880d681SAndroid Build Coastguard Worker; Don't eliminate an icmp that's contributing to the loop exit test though.
44*9880d681SAndroid Build Coastguard Worker
45*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @_ZNK4llvm5APInt3ultERKS0_(
46*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp99 = icmp sgt i32 %i, -1
47*9880d681SAndroid Build Coastguard Worker
48*9880d681SAndroid Build Coastguard Workerdefine i32 @_ZNK4llvm5APInt3ultERKS0_(i32 %tmp2.i1, i64** %tmp65, i64** %tmp73, i64** %tmp82, i64** %tmp90) {
49*9880d681SAndroid Build Coastguard Workerentry:
50*9880d681SAndroid Build Coastguard Worker  br label %bb18
51*9880d681SAndroid Build Coastguard Worker
52*9880d681SAndroid Build Coastguard Workerbb13:
53*9880d681SAndroid Build Coastguard Worker  %tmp66 = load i64*, i64** %tmp65, align 4
54*9880d681SAndroid Build Coastguard Worker  %tmp68 = getelementptr inbounds i64, i64* %tmp66, i32 %i
55*9880d681SAndroid Build Coastguard Worker  %tmp69 = load i64, i64* %tmp68, align 4
56*9880d681SAndroid Build Coastguard Worker  %tmp74 = load i64*, i64** %tmp73, align 4
57*9880d681SAndroid Build Coastguard Worker  %tmp76 = getelementptr inbounds i64, i64* %tmp74, i32 %i
58*9880d681SAndroid Build Coastguard Worker  %tmp77 = load i64, i64* %tmp76, align 4
59*9880d681SAndroid Build Coastguard Worker  %tmp78 = icmp ugt i64 %tmp69, %tmp77
60*9880d681SAndroid Build Coastguard Worker  br i1 %tmp78, label %bb20.loopexit, label %bb15
61*9880d681SAndroid Build Coastguard Worker
62*9880d681SAndroid Build Coastguard Workerbb15:
63*9880d681SAndroid Build Coastguard Worker  %tmp83 = load i64*, i64** %tmp82, align 4
64*9880d681SAndroid Build Coastguard Worker  %tmp85 = getelementptr inbounds i64, i64* %tmp83, i32 %i
65*9880d681SAndroid Build Coastguard Worker  %tmp86 = load i64, i64* %tmp85, align 4
66*9880d681SAndroid Build Coastguard Worker  %tmp91 = load i64*, i64** %tmp90, align 4
67*9880d681SAndroid Build Coastguard Worker  %tmp93 = getelementptr inbounds i64, i64* %tmp91, i32 %i
68*9880d681SAndroid Build Coastguard Worker  %tmp94 = load i64, i64* %tmp93, align 4
69*9880d681SAndroid Build Coastguard Worker  %tmp95 = icmp ult i64 %tmp86, %tmp94
70*9880d681SAndroid Build Coastguard Worker  br i1 %tmp95, label %bb20.loopexit, label %bb17
71*9880d681SAndroid Build Coastguard Worker
72*9880d681SAndroid Build Coastguard Workerbb17:
73*9880d681SAndroid Build Coastguard Worker  %tmp97 = add nsw i32 %i, -1
74*9880d681SAndroid Build Coastguard Worker  br label %bb18
75*9880d681SAndroid Build Coastguard Worker
76*9880d681SAndroid Build Coastguard Workerbb18:
77*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ %tmp2.i1, %entry ], [ %tmp97, %bb17 ]
78*9880d681SAndroid Build Coastguard Worker  %tmp99 = icmp sgt i32 %i, -1
79*9880d681SAndroid Build Coastguard Worker  br i1 %tmp99, label %bb13, label %bb20.loopexit
80*9880d681SAndroid Build Coastguard Worker
81*9880d681SAndroid Build Coastguard Workerbb20.loopexit:
82*9880d681SAndroid Build Coastguard Worker  %tmp.0.ph = phi i32 [ 0, %bb18 ], [ 1, %bb15 ], [ 0, %bb13 ]
83*9880d681SAndroid Build Coastguard Worker  ret i32 %tmp.0.ph
84*9880d681SAndroid Build Coastguard Worker}
85*9880d681SAndroid Build Coastguard Worker
86*9880d681SAndroid Build Coastguard Worker; Indvars should eliminate the icmp here.
87*9880d681SAndroid Build Coastguard Worker
88*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_10(
89*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: icmp
90*9880d681SAndroid Build Coastguard Worker; CHECK: ret void
91*9880d681SAndroid Build Coastguard Worker
92*9880d681SAndroid Build Coastguard Workerdefine void @func_10() nounwind {
93*9880d681SAndroid Build Coastguard Workerentry:
94*9880d681SAndroid Build Coastguard Worker  br label %loop
95*9880d681SAndroid Build Coastguard Worker
96*9880d681SAndroid Build Coastguard Workerloop:
97*9880d681SAndroid Build Coastguard Worker  %i = phi i32 [ %i.next, %loop ], [ 0, %entry ]
98*9880d681SAndroid Build Coastguard Worker  %t0 = icmp slt i32 %i, 0
99*9880d681SAndroid Build Coastguard Worker  %t1 = zext i1 %t0 to i32
100*9880d681SAndroid Build Coastguard Worker  %t2 = add i32 %t1, %i
101*9880d681SAndroid Build Coastguard Worker  %u3 = zext i32 %t2 to i64
102*9880d681SAndroid Build Coastguard Worker  store i64 %u3, i64* null
103*9880d681SAndroid Build Coastguard Worker  %i.next = add i32 %i, 1
104*9880d681SAndroid Build Coastguard Worker  br i1 undef, label %loop, label %return
105*9880d681SAndroid Build Coastguard Worker
106*9880d681SAndroid Build Coastguard Workerreturn:
107*9880d681SAndroid Build Coastguard Worker  ret void
108*9880d681SAndroid Build Coastguard Worker}
109*9880d681SAndroid Build Coastguard Worker
110*9880d681SAndroid Build Coastguard Worker; PR14432
111*9880d681SAndroid Build Coastguard Worker; Indvars should not turn the second loop into an infinite one.
112*9880d681SAndroid Build Coastguard Worker
113*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_11(
114*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10
115*9880d681SAndroid Build Coastguard Worker; CHECK-NOT: br i1 true, label %noassert68, label %unrolledend
116*9880d681SAndroid Build Coastguard Worker
117*9880d681SAndroid Build Coastguard Workerdefine i32 @func_11() nounwind uwtable {
118*9880d681SAndroid Build Coastguard Workerentry:
119*9880d681SAndroid Build Coastguard Worker  br label %forcond
120*9880d681SAndroid Build Coastguard Worker
121*9880d681SAndroid Build Coastguard Workerforcond:                                          ; preds = %noassert, %entry
122*9880d681SAndroid Build Coastguard Worker  %__key6.0 = phi i32 [ 2, %entry ], [ %tmp37, %noassert ]
123*9880d681SAndroid Build Coastguard Worker  %tmp5 = icmp slt i32 %__key6.0, 10
124*9880d681SAndroid Build Coastguard Worker  br i1 %tmp5, label %noassert, label %forcond38.preheader
125*9880d681SAndroid Build Coastguard Worker
126*9880d681SAndroid Build Coastguard Workerforcond38.preheader:                              ; preds = %forcond
127*9880d681SAndroid Build Coastguard Worker  br label %forcond38
128*9880d681SAndroid Build Coastguard Worker
129*9880d681SAndroid Build Coastguard Workernoassert:                                         ; preds = %forbody
130*9880d681SAndroid Build Coastguard Worker  %tmp13 = sdiv i32 -32768, %__key6.0
131*9880d681SAndroid Build Coastguard Worker  %tmp2936 = shl i32 %tmp13, 24
132*9880d681SAndroid Build Coastguard Worker  %sext23 = shl i32 %tmp13, 24
133*9880d681SAndroid Build Coastguard Worker  %tmp32 = icmp eq i32 %tmp2936, %sext23
134*9880d681SAndroid Build Coastguard Worker  %tmp37 = add i32 %__key6.0, 1
135*9880d681SAndroid Build Coastguard Worker  br i1 %tmp32, label %forcond, label %assert33
136*9880d681SAndroid Build Coastguard Worker
137*9880d681SAndroid Build Coastguard Workerassert33:                                         ; preds = %noassert
138*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.trap()
139*9880d681SAndroid Build Coastguard Worker  unreachable
140*9880d681SAndroid Build Coastguard Worker
141*9880d681SAndroid Build Coastguard Workerforcond38:                                        ; preds = %noassert68, %forcond38.preheader
142*9880d681SAndroid Build Coastguard Worker  %__key8.0 = phi i32 [ %tmp81, %noassert68 ], [ 2, %forcond38.preheader ]
143*9880d681SAndroid Build Coastguard Worker  %tmp46 = icmp slt i32 %__key8.0, 10
144*9880d681SAndroid Build Coastguard Worker  br i1 %tmp46, label %noassert68, label %unrolledend
145*9880d681SAndroid Build Coastguard Worker
146*9880d681SAndroid Build Coastguard Workernoassert68:                                       ; preds = %forbody39
147*9880d681SAndroid Build Coastguard Worker  %tmp57 = sdiv i32 -32768, %__key8.0
148*9880d681SAndroid Build Coastguard Worker  %sext34 = shl i32 %tmp57, 16
149*9880d681SAndroid Build Coastguard Worker  %sext21 = shl i32 %tmp57, 16
150*9880d681SAndroid Build Coastguard Worker  %tmp76 = icmp eq i32 %sext34, %sext21
151*9880d681SAndroid Build Coastguard Worker  %tmp81 = add i32 %__key8.0, 1
152*9880d681SAndroid Build Coastguard Worker  br i1 %tmp76, label %forcond38, label %assert77
153*9880d681SAndroid Build Coastguard Worker
154*9880d681SAndroid Build Coastguard Workerassert77:                                         ; preds = %noassert68
155*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.trap()
156*9880d681SAndroid Build Coastguard Worker  unreachable
157*9880d681SAndroid Build Coastguard Worker
158*9880d681SAndroid Build Coastguard Workerunrolledend:                                      ; preds = %forcond38
159*9880d681SAndroid Build Coastguard Worker  ret i32 0
160*9880d681SAndroid Build Coastguard Worker}
161*9880d681SAndroid Build Coastguard Worker
162*9880d681SAndroid Build Coastguard Workerdeclare void @llvm.trap() noreturn nounwind
163*9880d681SAndroid Build Coastguard Worker
164*9880d681SAndroid Build Coastguard Worker; In this case the second loop only has a single iteration, fold the header away
165*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_12(
166*9880d681SAndroid Build Coastguard Worker; CHECK: %tmp5 = icmp slt i32 %__key6.0, 10
167*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %noassert68, label %unrolledend
168*9880d681SAndroid Build Coastguard Workerdefine i32 @func_12() nounwind uwtable {
169*9880d681SAndroid Build Coastguard Workerentry:
170*9880d681SAndroid Build Coastguard Worker  br label %forcond
171*9880d681SAndroid Build Coastguard Worker
172*9880d681SAndroid Build Coastguard Workerforcond:                                          ; preds = %noassert, %entry
173*9880d681SAndroid Build Coastguard Worker  %__key6.0 = phi i32 [ 2, %entry ], [ %tmp37, %noassert ]
174*9880d681SAndroid Build Coastguard Worker  %tmp5 = icmp slt i32 %__key6.0, 10
175*9880d681SAndroid Build Coastguard Worker  br i1 %tmp5, label %noassert, label %forcond38.preheader
176*9880d681SAndroid Build Coastguard Worker
177*9880d681SAndroid Build Coastguard Workerforcond38.preheader:                              ; preds = %forcond
178*9880d681SAndroid Build Coastguard Worker  br label %forcond38
179*9880d681SAndroid Build Coastguard Worker
180*9880d681SAndroid Build Coastguard Workernoassert:                                         ; preds = %forbody
181*9880d681SAndroid Build Coastguard Worker  %tmp13 = sdiv i32 -32768, %__key6.0
182*9880d681SAndroid Build Coastguard Worker  %tmp2936 = shl i32 %tmp13, 24
183*9880d681SAndroid Build Coastguard Worker  %sext23 = shl i32 %tmp13, 24
184*9880d681SAndroid Build Coastguard Worker  %tmp32 = icmp eq i32 %tmp2936, %sext23
185*9880d681SAndroid Build Coastguard Worker  %tmp37 = add i32 %__key6.0, 1
186*9880d681SAndroid Build Coastguard Worker  br i1 %tmp32, label %forcond, label %assert33
187*9880d681SAndroid Build Coastguard Worker
188*9880d681SAndroid Build Coastguard Workerassert33:                                         ; preds = %noassert
189*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.trap()
190*9880d681SAndroid Build Coastguard Worker  unreachable
191*9880d681SAndroid Build Coastguard Worker
192*9880d681SAndroid Build Coastguard Workerforcond38:                                        ; preds = %noassert68, %forcond38.preheader
193*9880d681SAndroid Build Coastguard Worker  %__key8.0 = phi i32 [ %tmp81, %noassert68 ], [ 2, %forcond38.preheader ]
194*9880d681SAndroid Build Coastguard Worker  %tmp46 = icmp slt i32 %__key8.0, 10
195*9880d681SAndroid Build Coastguard Worker  br i1 %tmp46, label %noassert68, label %unrolledend
196*9880d681SAndroid Build Coastguard Worker
197*9880d681SAndroid Build Coastguard Workernoassert68:                                       ; preds = %forbody39
198*9880d681SAndroid Build Coastguard Worker  %tmp57 = sdiv i32 -32768, %__key8.0
199*9880d681SAndroid Build Coastguard Worker  %sext34 = shl i32 %tmp57, 16
200*9880d681SAndroid Build Coastguard Worker  %sext21 = shl i32 %tmp57, 16
201*9880d681SAndroid Build Coastguard Worker  %tmp76 = icmp ne i32 %sext34, %sext21
202*9880d681SAndroid Build Coastguard Worker  %tmp81 = add i32 %__key8.0, 1
203*9880d681SAndroid Build Coastguard Worker  br i1 %tmp76, label %forcond38, label %assert77
204*9880d681SAndroid Build Coastguard Worker
205*9880d681SAndroid Build Coastguard Workerassert77:                                         ; preds = %noassert68
206*9880d681SAndroid Build Coastguard Worker  tail call void @llvm.trap()
207*9880d681SAndroid Build Coastguard Worker  unreachable
208*9880d681SAndroid Build Coastguard Worker
209*9880d681SAndroid Build Coastguard Workerunrolledend:                                      ; preds = %forcond38
210*9880d681SAndroid Build Coastguard Worker  ret i32 0
211*9880d681SAndroid Build Coastguard Worker}
212*9880d681SAndroid Build Coastguard Worker
213*9880d681SAndroid Build Coastguard Workerdeclare void @side_effect()
214*9880d681SAndroid Build Coastguard Worker
215*9880d681SAndroid Build Coastguard Workerdefine void @func_13(i32* %len.ptr) {
216*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_13(
217*9880d681SAndroid Build Coastguard Worker entry:
218*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %len.ptr, !range !0
219*9880d681SAndroid Build Coastguard Worker  %len.sub.1 = add i32 %len, -1
220*9880d681SAndroid Build Coastguard Worker  %len.is.zero = icmp eq i32 %len, 0
221*9880d681SAndroid Build Coastguard Worker  br i1 %len.is.zero, label %leave, label %loop
222*9880d681SAndroid Build Coastguard Worker
223*9880d681SAndroid Build Coastguard Worker loop:
224*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
225*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
226*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
227*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
228*9880d681SAndroid Build Coastguard Worker  %iv.cmp = icmp ult i32 %iv, %len
229*9880d681SAndroid Build Coastguard Worker  br i1 %iv.cmp, label %be, label %leave
230*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave
231*9880d681SAndroid Build Coastguard Worker
232*9880d681SAndroid Build Coastguard Worker be:
233*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
234*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp ult i32 %iv, %len.sub.1
235*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
236*9880d681SAndroid Build Coastguard Worker
237*9880d681SAndroid Build Coastguard Worker leave:
238*9880d681SAndroid Build Coastguard Worker  ret void
239*9880d681SAndroid Build Coastguard Worker}
240*9880d681SAndroid Build Coastguard Worker
241*9880d681SAndroid Build Coastguard Workerdefine void @func_14(i32* %len.ptr) {
242*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_14(
243*9880d681SAndroid Build Coastguard Worker entry:
244*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %len.ptr, !range !0
245*9880d681SAndroid Build Coastguard Worker  %len.sub.1 = add i32 %len, -1
246*9880d681SAndroid Build Coastguard Worker  %len.is.zero = icmp eq i32 %len, 0
247*9880d681SAndroid Build Coastguard Worker  %len.is.int_min = icmp eq i32 %len, 2147483648
248*9880d681SAndroid Build Coastguard Worker  %no.entry = or i1 %len.is.zero, %len.is.int_min
249*9880d681SAndroid Build Coastguard Worker  br i1 %no.entry, label %leave, label %loop
250*9880d681SAndroid Build Coastguard Worker
251*9880d681SAndroid Build Coastguard Worker loop:
252*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
253*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
254*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
255*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
256*9880d681SAndroid Build Coastguard Worker  %iv.cmp = icmp slt i32 %iv, %len
257*9880d681SAndroid Build Coastguard Worker  br i1 %iv.cmp, label %be, label %leave
258*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave
259*9880d681SAndroid Build Coastguard Worker
260*9880d681SAndroid Build Coastguard Worker be:
261*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
262*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv, %len.sub.1
263*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
264*9880d681SAndroid Build Coastguard Worker
265*9880d681SAndroid Build Coastguard Worker leave:
266*9880d681SAndroid Build Coastguard Worker  ret void
267*9880d681SAndroid Build Coastguard Worker}
268*9880d681SAndroid Build Coastguard Worker
269*9880d681SAndroid Build Coastguard Workerdefine void @func_15(i32* %len.ptr) {
270*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_15(
271*9880d681SAndroid Build Coastguard Worker entry:
272*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %len.ptr, !range !0
273*9880d681SAndroid Build Coastguard Worker  %len.add.1 = add i32 %len, 1
274*9880d681SAndroid Build Coastguard Worker  %len.add.1.is.zero = icmp eq i32 %len.add.1, 0
275*9880d681SAndroid Build Coastguard Worker  br i1 %len.add.1.is.zero, label %leave, label %loop
276*9880d681SAndroid Build Coastguard Worker
277*9880d681SAndroid Build Coastguard Worker loop:
278*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
279*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
280*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
281*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
282*9880d681SAndroid Build Coastguard Worker  %iv.cmp = icmp ult i32 %iv, %len.add.1
283*9880d681SAndroid Build Coastguard Worker  br i1 %iv.cmp, label %be, label %leave
284*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave
285*9880d681SAndroid Build Coastguard Worker
286*9880d681SAndroid Build Coastguard Worker be:
287*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
288*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp ult i32 %iv, %len
289*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
290*9880d681SAndroid Build Coastguard Worker
291*9880d681SAndroid Build Coastguard Worker leave:
292*9880d681SAndroid Build Coastguard Worker  ret void
293*9880d681SAndroid Build Coastguard Worker}
294*9880d681SAndroid Build Coastguard Worker
295*9880d681SAndroid Build Coastguard Workerdefine void @func_16(i32* %len.ptr) {
296*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_16(
297*9880d681SAndroid Build Coastguard Worker entry:
298*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %len.ptr, !range !0
299*9880d681SAndroid Build Coastguard Worker  %len.add.5 = add i32 %len, 5
300*9880d681SAndroid Build Coastguard Worker  %entry.cond.0 = icmp slt i32 %len, 2147483643
301*9880d681SAndroid Build Coastguard Worker  %entry.cond.1 = icmp slt i32 4, %len.add.5
302*9880d681SAndroid Build Coastguard Worker  %entry.cond = and i1 %entry.cond.0, %entry.cond.1
303*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
304*9880d681SAndroid Build Coastguard Worker
305*9880d681SAndroid Build Coastguard Worker loop:
306*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
307*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
308*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
309*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
310*9880d681SAndroid Build Coastguard Worker  %iv.add.4 = add i32 %iv, 4
311*9880d681SAndroid Build Coastguard Worker  %iv.cmp = icmp slt i32 %iv.add.4, %len.add.5
312*9880d681SAndroid Build Coastguard Worker  br i1 %iv.cmp, label %be, label %leave
313*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave
314*9880d681SAndroid Build Coastguard Worker
315*9880d681SAndroid Build Coastguard Worker be:
316*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
317*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv, %len
318*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
319*9880d681SAndroid Build Coastguard Worker
320*9880d681SAndroid Build Coastguard Worker leave:
321*9880d681SAndroid Build Coastguard Worker  ret void
322*9880d681SAndroid Build Coastguard Worker}
323*9880d681SAndroid Build Coastguard Worker
324*9880d681SAndroid Build Coastguard Workerdefine void @func_17(i32* %len.ptr) {
325*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_17(
326*9880d681SAndroid Build Coastguard Worker entry:
327*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %len.ptr
328*9880d681SAndroid Build Coastguard Worker  %len.add.5 = add i32 %len, -5
329*9880d681SAndroid Build Coastguard Worker  %entry.cond.0 = icmp slt i32 %len, 2147483653 ;; 2147483653 == INT_MIN - (-5)
330*9880d681SAndroid Build Coastguard Worker  %entry.cond.1 = icmp slt i32 -6, %len.add.5
331*9880d681SAndroid Build Coastguard Worker  %entry.cond = and i1 %entry.cond.0, %entry.cond.1
332*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
333*9880d681SAndroid Build Coastguard Worker
334*9880d681SAndroid Build Coastguard Worker loop:
335*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
336*9880d681SAndroid Build Coastguard Worker  %iv.2 = phi i32 [ 0, %entry ], [ %iv.2.inc, %be ]
337*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ -6, %entry ], [ %iv.inc, %be ]
338*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
339*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
340*9880d681SAndroid Build Coastguard Worker  %iv.2.inc = add i32 %iv.2, 1
341*9880d681SAndroid Build Coastguard Worker  %iv.cmp = icmp slt i32 %iv, %len.add.5
342*9880d681SAndroid Build Coastguard Worker
343*9880d681SAndroid Build Coastguard Worker; Deduces {-5,+,1} s< (-5 + %len) from {0,+,1} < %len
344*9880d681SAndroid Build Coastguard Worker; since %len s< INT_MIN - (-5) from the entry condition
345*9880d681SAndroid Build Coastguard Worker
346*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %be, label %leave
347*9880d681SAndroid Build Coastguard Worker  br i1 %iv.cmp, label %be, label %leave
348*9880d681SAndroid Build Coastguard Worker
349*9880d681SAndroid Build Coastguard Worker be:
350*9880d681SAndroid Build Coastguard Worker; CHECK: be:
351*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
352*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv.2, %len
353*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
354*9880d681SAndroid Build Coastguard Worker
355*9880d681SAndroid Build Coastguard Worker leave:
356*9880d681SAndroid Build Coastguard Worker  ret void
357*9880d681SAndroid Build Coastguard Worker}
358*9880d681SAndroid Build Coastguard Worker
359*9880d681SAndroid Build Coastguard Workerdefine i1 @func_18(i16* %tmp20, i32* %len.addr) {
360*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_18(
361*9880d681SAndroid Build Coastguard Workerentry:
362*9880d681SAndroid Build Coastguard Worker  %len = load i32, i32* %len.addr, !range !0
363*9880d681SAndroid Build Coastguard Worker  %tmp18 = icmp eq i32 %len, 0
364*9880d681SAndroid Build Coastguard Worker  br i1 %tmp18, label %bb2, label %bb0.preheader
365*9880d681SAndroid Build Coastguard Worker
366*9880d681SAndroid Build Coastguard Workerbb0.preheader:
367*9880d681SAndroid Build Coastguard Worker  br label %bb0
368*9880d681SAndroid Build Coastguard Worker
369*9880d681SAndroid Build Coastguard Workerbb0:
370*9880d681SAndroid Build Coastguard Worker; CHECK: bb0:
371*9880d681SAndroid Build Coastguard Worker  %var_0.in = phi i32 [ %var_0, %bb1 ], [ %len, %bb0.preheader ]
372*9880d681SAndroid Build Coastguard Worker  %var_1 = phi i32 [ %tmp30, %bb1 ], [ 0, %bb0.preheader ]
373*9880d681SAndroid Build Coastguard Worker  %var_0 = add nsw i32 %var_0.in, -1
374*9880d681SAndroid Build Coastguard Worker  %tmp23 = icmp ult i32 %var_1, %len
375*9880d681SAndroid Build Coastguard Worker; CHECK: br i1 true, label %stay, label %bb2.loopexit
376*9880d681SAndroid Build Coastguard Worker  br i1 %tmp23, label %stay, label %bb2
377*9880d681SAndroid Build Coastguard Worker
378*9880d681SAndroid Build Coastguard Workerstay:
379*9880d681SAndroid Build Coastguard Worker; CHECK: stay:
380*9880d681SAndroid Build Coastguard Worker  %tmp25 = getelementptr inbounds i16, i16* %tmp20, i32 %var_1
381*9880d681SAndroid Build Coastguard Worker  %tmp26 = load i16, i16* %tmp25
382*9880d681SAndroid Build Coastguard Worker  %tmp29 = icmp eq i16 %tmp26, 0
383*9880d681SAndroid Build Coastguard Worker  br i1 %tmp29, label %bb1, label %bb2
384*9880d681SAndroid Build Coastguard Worker
385*9880d681SAndroid Build Coastguard Workerbb1:
386*9880d681SAndroid Build Coastguard Worker  %tmp30 = add i32 %var_1, 1
387*9880d681SAndroid Build Coastguard Worker  %tmp31 = icmp eq i32 %var_0, 0
388*9880d681SAndroid Build Coastguard Worker  br i1 %tmp31, label %bb3, label %bb0
389*9880d681SAndroid Build Coastguard Worker
390*9880d681SAndroid Build Coastguard Workerbb2:
391*9880d681SAndroid Build Coastguard Worker  ret i1 false
392*9880d681SAndroid Build Coastguard Worker
393*9880d681SAndroid Build Coastguard Workerbb3:
394*9880d681SAndroid Build Coastguard Worker  ret i1 true
395*9880d681SAndroid Build Coastguard Worker}
396*9880d681SAndroid Build Coastguard Worker
397*9880d681SAndroid Build Coastguard Workerdefine void @func_19(i32* %length.ptr) {
398*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_19(
399*9880d681SAndroid Build Coastguard Worker entry:
400*9880d681SAndroid Build Coastguard Worker  %length = load i32, i32* %length.ptr, !range !0
401*9880d681SAndroid Build Coastguard Worker  %length.is.nonzero = icmp ne i32 %length, 0
402*9880d681SAndroid Build Coastguard Worker  br i1 %length.is.nonzero, label %loop, label %leave
403*9880d681SAndroid Build Coastguard Worker
404*9880d681SAndroid Build Coastguard Worker loop:
405*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
406*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
407*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
408*9880d681SAndroid Build Coastguard Worker  %range.check = icmp ult i32 %iv, %length
409*9880d681SAndroid Build Coastguard Worker  br i1 %range.check, label %be, label %leave
410*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 true, label %be, label %leave.loopexit
411*9880d681SAndroid Build Coastguard Worker; CHECK: be:
412*9880d681SAndroid Build Coastguard Worker
413*9880d681SAndroid Build Coastguard Worker be:
414*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
415*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv.inc, %length
416*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
417*9880d681SAndroid Build Coastguard Worker
418*9880d681SAndroid Build Coastguard Worker leave:
419*9880d681SAndroid Build Coastguard Worker  ret void
420*9880d681SAndroid Build Coastguard Worker}
421*9880d681SAndroid Build Coastguard Worker
422*9880d681SAndroid Build Coastguard Workerdefine void @func_20(i32* %length.ptr) {
423*9880d681SAndroid Build Coastguard Worker; Like @func_19, but %length is no longer provably positive, so
424*9880d681SAndroid Build Coastguard Worker; %range.check cannot be proved to be always true.
425*9880d681SAndroid Build Coastguard Worker
426*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_20(
427*9880d681SAndroid Build Coastguard Worker entry:
428*9880d681SAndroid Build Coastguard Worker  %length = load i32, i32* %length.ptr
429*9880d681SAndroid Build Coastguard Worker  %length.is.nonzero = icmp ne i32 %length, 0
430*9880d681SAndroid Build Coastguard Worker  br i1 %length.is.nonzero, label %loop, label %leave
431*9880d681SAndroid Build Coastguard Worker
432*9880d681SAndroid Build Coastguard Worker loop:
433*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
434*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
435*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
436*9880d681SAndroid Build Coastguard Worker  %range.check = icmp ult i32 %iv, %length
437*9880d681SAndroid Build Coastguard Worker  br i1 %range.check, label %be, label %leave
438*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 %range.check, label %be, label %leave.loopexit
439*9880d681SAndroid Build Coastguard Worker; CHECK: be:
440*9880d681SAndroid Build Coastguard Worker
441*9880d681SAndroid Build Coastguard Worker be:
442*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
443*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv.inc, %length
444*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
445*9880d681SAndroid Build Coastguard Worker
446*9880d681SAndroid Build Coastguard Worker leave:
447*9880d681SAndroid Build Coastguard Worker  ret void
448*9880d681SAndroid Build Coastguard Worker}
449*9880d681SAndroid Build Coastguard Worker
450*9880d681SAndroid Build Coastguard Workerdefine void @func_21(i32* %length.ptr) {
451*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_21(
452*9880d681SAndroid Build Coastguard Worker
453*9880d681SAndroid Build Coastguard Worker; This checks that the backedge condition, (I + 1) < Length - 1 implies
454*9880d681SAndroid Build Coastguard Worker; (I + 1) < Length
455*9880d681SAndroid Build Coastguard Worker entry:
456*9880d681SAndroid Build Coastguard Worker  %length = load i32, i32* %length.ptr, !range !0
457*9880d681SAndroid Build Coastguard Worker  %lim = sub i32 %length, 1
458*9880d681SAndroid Build Coastguard Worker  %entry.cond = icmp sgt i32 %length, 1
459*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
460*9880d681SAndroid Build Coastguard Worker
461*9880d681SAndroid Build Coastguard Worker loop:
462*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
463*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
464*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
465*9880d681SAndroid Build Coastguard Worker  %range.check = icmp slt i32 %iv, %length
466*9880d681SAndroid Build Coastguard Worker  br i1 %range.check, label %be, label %leave
467*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 true, label %be, label %leave.loopexit
468*9880d681SAndroid Build Coastguard Worker; CHECK: be:
469*9880d681SAndroid Build Coastguard Worker
470*9880d681SAndroid Build Coastguard Worker be:
471*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
472*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv.inc, %lim
473*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
474*9880d681SAndroid Build Coastguard Worker
475*9880d681SAndroid Build Coastguard Worker leave:
476*9880d681SAndroid Build Coastguard Worker  ret void
477*9880d681SAndroid Build Coastguard Worker}
478*9880d681SAndroid Build Coastguard Worker
479*9880d681SAndroid Build Coastguard Workerdefine void @func_22(i32* %length.ptr) {
480*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_22(
481*9880d681SAndroid Build Coastguard Worker
482*9880d681SAndroid Build Coastguard Worker; This checks that the backedge condition, (I + 1) < Length - 1 implies
483*9880d681SAndroid Build Coastguard Worker; (I + 1) < Length
484*9880d681SAndroid Build Coastguard Worker entry:
485*9880d681SAndroid Build Coastguard Worker  %length = load i32, i32* %length.ptr, !range !0
486*9880d681SAndroid Build Coastguard Worker  %lim = sub i32 %length, 1
487*9880d681SAndroid Build Coastguard Worker  %entry.cond = icmp sgt i32 %length, 1
488*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
489*9880d681SAndroid Build Coastguard Worker
490*9880d681SAndroid Build Coastguard Worker loop:
491*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
492*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %be ]
493*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
494*9880d681SAndroid Build Coastguard Worker  %range.check = icmp sle i32 %iv, %length
495*9880d681SAndroid Build Coastguard Worker  br i1 %range.check, label %be, label %leave
496*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 true, label %be, label %leave.loopexit
497*9880d681SAndroid Build Coastguard Worker; CHECK: be:
498*9880d681SAndroid Build Coastguard Worker
499*9880d681SAndroid Build Coastguard Worker be:
500*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
501*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp sle i32 %iv.inc, %lim
502*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
503*9880d681SAndroid Build Coastguard Worker
504*9880d681SAndroid Build Coastguard Worker leave:
505*9880d681SAndroid Build Coastguard Worker  ret void
506*9880d681SAndroid Build Coastguard Worker}
507*9880d681SAndroid Build Coastguard Worker
508*9880d681SAndroid Build Coastguard Workerdefine void @func_23(i32* %length.ptr) {
509*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_23(
510*9880d681SAndroid Build Coastguard Worker entry:
511*9880d681SAndroid Build Coastguard Worker  %length = load i32, i32* %length.ptr, !range !0
512*9880d681SAndroid Build Coastguard Worker  %entry.cond = icmp ult i32 4, %length
513*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
514*9880d681SAndroid Build Coastguard Worker
515*9880d681SAndroid Build Coastguard Worker loop:
516*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
517*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ 4, %entry ], [ %iv.inc, %be ]
518*9880d681SAndroid Build Coastguard Worker  %iv.inc = add i32 %iv, 1
519*9880d681SAndroid Build Coastguard Worker  %range.check = icmp slt i32 %iv, %length
520*9880d681SAndroid Build Coastguard Worker  br i1 %range.check, label %be, label %leave
521*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 true, label %be, label %leave.loopexit
522*9880d681SAndroid Build Coastguard Worker; CHECK: be:
523*9880d681SAndroid Build Coastguard Worker
524*9880d681SAndroid Build Coastguard Worker be:
525*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
526*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp slt i32 %iv.inc, %length
527*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
528*9880d681SAndroid Build Coastguard Worker
529*9880d681SAndroid Build Coastguard Worker leave:
530*9880d681SAndroid Build Coastguard Worker  ret void
531*9880d681SAndroid Build Coastguard Worker}
532*9880d681SAndroid Build Coastguard Worker
533*9880d681SAndroid Build Coastguard Workerdefine void @func_24(i32* %init.ptr) {
534*9880d681SAndroid Build Coastguard Worker; CHECK-LABEL: @func_24(
535*9880d681SAndroid Build Coastguard Worker entry:
536*9880d681SAndroid Build Coastguard Worker  %init = load i32, i32* %init.ptr, !range !0
537*9880d681SAndroid Build Coastguard Worker  %entry.cond = icmp ugt i32 %init, 4
538*9880d681SAndroid Build Coastguard Worker  br i1 %entry.cond, label %loop, label %leave
539*9880d681SAndroid Build Coastguard Worker
540*9880d681SAndroid Build Coastguard Worker loop:
541*9880d681SAndroid Build Coastguard Worker; CHECK: loop:
542*9880d681SAndroid Build Coastguard Worker  %iv = phi i32 [ %init, %entry ], [ %iv.dec, %be ]
543*9880d681SAndroid Build Coastguard Worker  %iv.dec = add i32 %iv, -1
544*9880d681SAndroid Build Coastguard Worker  %range.check = icmp sgt i32 %iv, 4
545*9880d681SAndroid Build Coastguard Worker  br i1 %range.check, label %be, label %leave
546*9880d681SAndroid Build Coastguard Worker; CHECK:   br i1 true, label %be, label %leave.loopexit
547*9880d681SAndroid Build Coastguard Worker; CHECK: be:
548*9880d681SAndroid Build Coastguard Worker
549*9880d681SAndroid Build Coastguard Worker be:
550*9880d681SAndroid Build Coastguard Worker  call void @side_effect()
551*9880d681SAndroid Build Coastguard Worker  %be.cond = icmp sgt i32 %iv.dec, 4
552*9880d681SAndroid Build Coastguard Worker  br i1 %be.cond, label %loop, label %leave
553*9880d681SAndroid Build Coastguard Worker
554*9880d681SAndroid Build Coastguard Worker leave:
555*9880d681SAndroid Build Coastguard Worker  ret void
556*9880d681SAndroid Build Coastguard Worker}
557*9880d681SAndroid Build Coastguard Worker
558*9880d681SAndroid Build Coastguard Worker
559*9880d681SAndroid Build Coastguard Worker!0 = !{i32 0, i32 2147483647}
560