xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-select-safe.ll (revision 18eaff1510525a2226e1fd0c31c6b176f07ae0a7)
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
2; RUN: opt -disable-output "-passes=print<scalar-evolution>" %s 2>&1 | FileCheck %s
3
4define i32 @logical_and_2ops(i32 %n, i32 %m) {
5; CHECK-LABEL: 'logical_and_2ops'
6; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops
7; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
8; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
9; CHECK-NEXT:    %i.next = add i32 %i, 1
10; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
11; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
13; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops
14; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
15; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
16; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
17; CHECK-NEXT:   Predicates:
18; CHECK:       Loop %loop: Trip multiple is 1
19;
20entry:
21  br label %loop
22loop:
23  %i = phi i32 [0, %entry], [%i.next, %loop]
24  %i.next = add i32 %i, 1
25  %cond_p0 = icmp ult i32 %i, %n
26  %cond_p1 = icmp ult i32 %i, %m
27  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
28  br i1 %cond, label %loop, label %exit
29exit:
30  ret i32 %i
31}
32
33define i32 @logical_or_2ops(i32 %n, i32 %m) {
34; CHECK-LABEL: 'logical_or_2ops'
35; CHECK-NEXT:  Classifying expressions for: @logical_or_2ops
36; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
37; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
38; CHECK-NEXT:    %i.next = add i32 %i, 1
39; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
40; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
41; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
42; CHECK-NEXT:  Determining loop execution counts for: @logical_or_2ops
43; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
44; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
45; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
46; CHECK-NEXT:   Predicates:
47; CHECK:       Loop %loop: Trip multiple is 1
48;
49entry:
50  br label %loop
51loop:
52  %i = phi i32 [0, %entry], [%i.next, %loop]
53  %i.next = add i32 %i, 1
54  %cond_p0 = icmp uge i32 %i, %n
55  %cond_p1 = icmp uge i32 %i, %m
56  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
57  br i1 %cond, label %exit, label %loop
58exit:
59  ret i32 %i
60}
61
62define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
63; CHECK-LABEL: 'logical_and_3ops'
64; CHECK-NEXT:  Classifying expressions for: @logical_and_3ops
65; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
66; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
67; CHECK-NEXT:    %i.next = add i32 %i, 1
68; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
69; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
70; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
71; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
72; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
73; CHECK-NEXT:  Determining loop execution counts for: @logical_and_3ops
74; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
75; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
76; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
77; CHECK-NEXT:   Predicates:
78; CHECK:       Loop %loop: Trip multiple is 1
79;
80entry:
81  br label %loop
82loop:
83  %i = phi i32 [0, %entry], [%i.next, %loop]
84  %i.next = add i32 %i, 1
85  %cond_p0 = icmp ult i32 %i, %n
86  %cond_p1 = icmp ult i32 %i, %m
87  %cond_p2 = icmp ult i32 %i, %k
88  %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
89  %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
90  br i1 %cond, label %loop, label %exit
91exit:
92  ret i32 %i
93}
94
95define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
96; CHECK-LABEL: 'logical_or_3ops'
97; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops
98; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
99; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
100; CHECK-NEXT:    %i.next = add i32 %i, 1
101; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
102; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
103; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
104; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
105; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
106; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops
107; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
108; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
109; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
110; CHECK-NEXT:   Predicates:
111; CHECK:       Loop %loop: Trip multiple is 1
112;
113entry:
114  br label %loop
115loop:
116  %i = phi i32 [0, %entry], [%i.next, %loop]
117  %i.next = add i32 %i, 1
118  %cond_p0 = icmp uge i32 %i, %n
119  %cond_p1 = icmp uge i32 %i, %m
120  %cond_p2 = icmp uge i32 %i, %k
121  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
122  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
123  br i1 %cond, label %exit, label %loop
124exit:
125  ret i32 %i
126}
127
128define i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) {
129; CHECK-LABEL: 'logical_or_3ops_duplicate'
130; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_duplicate
131; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
132; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
133; CHECK-NEXT:    %i.next = add i32 %i, 1
134; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
135; CHECK-NEXT:    %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
136; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
137; CHECK-NEXT:    %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
138; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
139; CHECK-NEXT:    %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
140; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2) umin_seq (true + %cond_p3))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
141; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_duplicate
142; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
143; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
144; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
145; CHECK-NEXT:   Predicates:
146; CHECK:       Loop %loop: Trip multiple is 1
147;
148entry:
149  br label %loop
150loop:
151  %i = phi i32 [0, %entry], [%i.next, %loop]
152  %i.next = add i32 %i, 1
153  %cond_p0 = icmp uge i32 %i, %n
154  %cond_p1 = icmp uge i32 %i, %m
155  %cond_p2 = icmp uge i32 %i, %n
156  %cond_p3 = icmp uge i32 %i, %k
157  %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
158  %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
159  %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
160  br i1 %cond, label %exit, label %loop
161exit:
162  ret i32 %i
163}
164
165define i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) {
166; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand'
167; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand
168; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
169; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
170; CHECK-NEXT:    %i.next = add i32 %i, 1
171; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
172; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
173; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
174; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
175; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
176; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
177; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
178; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand
179; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
180; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
181; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k)
182; CHECK-NEXT:   Predicates:
183; CHECK:       Loop %loop: Trip multiple is 1
184;
185entry:
186  br label %loop
187loop:
188  %i = phi i32 [0, %entry], [%i.next, %loop]
189  %i.next = add i32 %i, 1
190  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
191  %cond_p0 = icmp uge i32 %i, %umin
192  %cond_p1 = icmp uge i32 %i, %n
193  %cond_p2 = icmp uge i32 %i, %k
194  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
195  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
196  br i1 %cond, label %exit, label %loop
197exit:
198  ret i32 %i
199}
200
201define i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) {
202; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand'
203; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_umin_operand
204; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
205; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable }
206; CHECK-NEXT:    %i.next = add i32 %i, 1
207; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable }
208; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
209; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
210; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
211; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
212; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
213; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
214; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand
215; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m)
216; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
217; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %k umin_seq %m)
218; CHECK-NEXT:   Predicates:
219; CHECK:       Loop %loop: Trip multiple is 1
220;
221entry:
222  br label %loop
223loop:
224  %i = phi i32 [0, %entry], [%i.next, %loop]
225  %i.next = add i32 %i, 1
226  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
227  %cond_p0 = icmp uge i32 %i, %n
228  %cond_p1 = icmp uge i32 %i, %k
229  %cond_p2 = icmp uge i32 %i, %umin
230  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
231  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
232  br i1 %cond, label %exit, label %loop
233exit:
234  ret i32 %i
235}
236
237define i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) {
238; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins'
239; CHECK-NEXT:  Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins
240; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
241; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k umin_seq %q) LoopDispositions: { %loop: Computable }
242; CHECK-NEXT:    %i.next = add i32 %i, 1
243; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k umin_seq %q)) LoopDispositions: { %loop: Computable }
244; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
245; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
246; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
247; CHECK-NEXT:    --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant }
248; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
249; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
250; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
251; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
252; CHECK-NEXT:  Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins
253; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
254; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
255; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
256; CHECK-NEXT:   Predicates:
257; CHECK:       Loop %loop: Trip multiple is 1
258;
259entry:
260  br label %loop
261loop:
262  %i = phi i32 [0, %entry], [%i.next, %loop]
263  %i.next = add i32 %i, 1
264  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
265  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
266  %cond_p0 = icmp uge i32 %i, %umin
267  %cond_p1 = icmp uge i32 %i, %k
268  %cond_p2 = icmp uge i32 %i, %umin2
269  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
270  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
271  br i1 %cond, label %exit, label %loop
272exit:
273  ret i32 %i
274}
275
276define i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) {
277; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin'
278; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin
279; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
280; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
281; CHECK-NEXT:    %i.next = add i32 %i, 1
282; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
283; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
284; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
285; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
286; CHECK-NEXT:    --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant }
287; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
288; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
289; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
290; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
291; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin
292; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
293; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
294; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k)
295; CHECK-NEXT:   Predicates:
296; CHECK:       Loop %loop: Trip multiple is 1
297;
298entry:
299  br label %loop
300loop:
301  %i = phi i32 [0, %entry], [%i.next, %loop]
302  %i.next = add i32 %i, 1
303  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
304  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
305  %cond_p0 = icmp uge i32 %i, %umin
306  %cond_p1 = icmp uge i32 %i, %k
307  %cond_p2 = icmp uge i32 %i, %umin2
308  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
309  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
310  br i1 %cond, label %exit, label %loop
311exit:
312  ret i32 %i
313}
314
315define i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) {
316; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin'
317; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_partially_redundant_umin
318; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
319; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable }
320; CHECK-NEXT:    %i.next = add i32 %i, 1
321; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable }
322; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
323; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
324; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
325; CHECK-NEXT:    --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant }
326; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
327; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
328; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin
329; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k))
330; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
331; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq (%m umin %k))
332; CHECK-NEXT:   Predicates:
333; CHECK:       Loop %loop: Trip multiple is 1
334;
335entry:
336  br label %loop
337loop:
338  %i = phi i32 [0, %entry], [%i.next, %loop]
339  %i.next = add i32 %i, 1
340  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
341  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
342  %cond_p0 = icmp uge i32 %i, %n
343  %cond_p1 = icmp uge i32 %i, %umin2
344  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
345  br i1 %cond, label %exit, label %loop
346exit:
347  ret i32 %i
348}
349
350define i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
351; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq'
352; CHECK-NEXT:  Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
353; CHECK-NEXT:    %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ]
354; CHECK-NEXT:    --> {0,+,1}<%first.loop> U: full-set S: full-set Exits: (%e umin_seq %d umin_seq %a) LoopDispositions: { %first.loop: Computable }
355; CHECK-NEXT:    %first.i.next = add i32 %first.i, 1
356; CHECK-NEXT:    --> {1,+,1}<%first.loop> U: full-set S: full-set Exits: (1 + (%e umin_seq %d umin_seq %a)) LoopDispositions: { %first.loop: Computable }
357; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
358; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }
359; CHECK-NEXT:    %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
360; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }
361; CHECK-NEXT:    %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ]
362; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) LoopDispositions: { %loop: Computable }
363; CHECK-NEXT:    %i.next = add i32 %i, 1
364; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))) LoopDispositions: { %loop: Computable }
365; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
366; CHECK-NEXT:    --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant }
367; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
368; CHECK-NEXT:    --> ({0,+,1}<%first.loop> umin %c umin %d) U: full-set S: full-set --> ((%e umin_seq %d umin_seq %a) umin %c umin %d) U: full-set S: full-set Exits: ((%e umin_seq %d umin_seq %a) umin %c umin %d) LoopDispositions: { %loop: Invariant }
369; CHECK-NEXT:    %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
370; CHECK-NEXT:    --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
371; CHECK-NEXT:    %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
372; CHECK-NEXT:    --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6) umin_seq (true + %cond_p7))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
373; CHECK-NEXT:  Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
374; CHECK-NEXT:  Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
375; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
376; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
377; CHECK-NEXT:   Predicates:
378; CHECK:       Loop %loop: Trip multiple is 1
379; CHECK-NEXT:  Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a)
380; CHECK-NEXT:  Loop %first.loop: max backedge-taken count is -1
381; CHECK-NEXT:  Loop %first.loop: Predicated backedge-taken count is (%e umin_seq %d umin_seq %a)
382; CHECK-NEXT:   Predicates:
383; CHECK:       Loop %first.loop: Trip multiple is 1
384;
385entry:
386  br label %first.loop
387first.loop:
388  %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop]
389  %first.i.next = add i32 %first.i, 1
390  %cond_p0 = icmp uge i32 %first.i, %e
391  %cond_p1 = icmp uge i32 %first.i, %d
392  %cond_p2 = icmp uge i32 %first.i, %a
393  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
394  %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
395  br i1 %cond_p4, label %first.loop.exit, label %first.loop
396first.loop.exit:
397  br label %loop
398loop:
399  %i = phi i32 [0, %first.loop.exit], [%i.next, %loop]
400  %i.next = add i32 %i, 1
401  %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
402  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
403  %cond_p5 = icmp uge i32 %i, %a
404  %cond_p6 = icmp uge i32 %i, %b
405  %cond_p7 = icmp uge i32 %i, %umin2
406  %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
407  %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
408  br i1 %cond, label %exit, label %loop
409exit:
410  ret i32 %i
411}
412
413define i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) {
414; CHECK-LABEL: 'logical_and_2ops_and_constant'
415; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops_and_constant
416; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
417; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable }
418; CHECK-NEXT:    %i.next = add i32 %i, 1
419; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable }
420; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
421; CHECK-NEXT:    --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant }
422; CHECK-NEXT:    %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
423; CHECK-NEXT:    --> (true + ((true + %cond_p1) umin_seq (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
424; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops_and_constant
425; CHECK-NEXT:  Loop %loop: backedge-taken count is (42 umin %n)
426; CHECK-NEXT:  Loop %loop: max backedge-taken count is 42
427; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (42 umin %n)
428; CHECK-NEXT:   Predicates:
429; CHECK:       Loop %loop: Trip multiple is 1
430;
431entry:
432  br label %loop
433loop:
434  %i = phi i32 [0, %entry], [%i.next, %loop]
435  %i.next = add i32 %i, 1
436  %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
437  %cond_p0 = icmp uge i32 %i, %umin
438  %cond_p1 = icmp uge i32 %i, %n
439  %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
440  br i1 %cond, label %exit, label %loop
441exit:
442  ret i32 %i
443}
444
445define i32 @computeSCEVAtScope(i32 %d.0) {
446; CHECK-LABEL: 'computeSCEVAtScope'
447; CHECK-NEXT:  Classifying expressions for: @computeSCEVAtScope
448; CHECK-NEXT:    %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
449; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
450; CHECK-NEXT:    %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
451; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
452; CHECK-NEXT:    %0 = select i1 %tobool1, i1 %tobool2, i1 false
453; CHECK-NEXT:    --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant }
454; CHECK-NEXT:    %inc = add nsw i32 %d.1, 1
455; CHECK-NEXT:    --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
456; CHECK-NEXT:    %inc3 = add nsw i32 %e.1, 1
457; CHECK-NEXT:    --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
458; CHECK-NEXT:    %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
459; CHECK-NEXT:    --> {0,+,1}<%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
460; CHECK-NEXT:    %inc8 = add i32 %f.1, 1
461; CHECK-NEXT:    --> {1,+,1}<%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
462; CHECK-NEXT:  Determining loop execution counts for: @computeSCEVAtScope
463; CHECK-NEXT:  Loop %for.cond: backedge-taken count is (-1 * %d.0)
464; CHECK-NEXT:  Loop %for.cond: max backedge-taken count is -1
465; CHECK-NEXT:  Loop %for.cond: Predicated backedge-taken count is (-1 * %d.0)
466; CHECK-NEXT:   Predicates:
467; CHECK:       Loop %for.cond: Trip multiple is 1
468; CHECK-NEXT:  Loop %for.cond4: backedge-taken count is 0
469; CHECK-NEXT:  Loop %for.cond4: max backedge-taken count is 0
470; CHECK-NEXT:  Loop %for.cond4: Predicated backedge-taken count is 0
471; CHECK-NEXT:   Predicates:
472; CHECK:       Loop %for.cond4: Trip multiple is 1
473; CHECK-NEXT:  Loop %while.cond: <multiple exits> Unpredictable backedge-taken count.
474; CHECK-NEXT:  Loop %while.cond: Unpredictable max backedge-taken count.
475; CHECK-NEXT:  Loop %while.cond: Unpredictable predicated backedge-taken count.
476;
477entry:
478  br label %while.cond
479
480while.cond.loopexit:                              ; preds = %for.cond4
481  br label %while.cond
482
483while.cond:                                       ; preds = %while.cond.loopexit, %entry
484  br label %for.cond.preheader
485
486for.cond.preheader:                               ; preds = %while.cond
487  br label %for.cond
488
489for.cond:                                         ; preds = %for.body, %for.cond.preheader
490  %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
491  %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
492  %tobool1 = icmp ne i32 %e.1, 0
493  %tobool2 = icmp ne i32 %d.1, 0
494  %0 = select i1 %tobool1, i1 %tobool2, i1 false
495  br i1 %0, label %for.body, label %for.cond4.preheader
496
497for.cond4.preheader:                              ; preds = %for.cond
498  br label %for.cond4
499
500for.body:                                         ; preds = %for.cond
501  %inc = add nsw i32 %d.1, 1
502  %inc3 = add nsw i32 %e.1, 1
503  br label %for.cond
504
505for.cond4:                                        ; preds = %for.body5, %for.cond4.preheader
506  %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
507  %exitcond.not = icmp eq i32 %f.1, %e.1
508  br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5
509
510for.body5:                                        ; preds = %for.cond4
511  %inc8 = add i32 %f.1, 1
512  br label %for.cond4
513}
514
515define i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, i64* %ptr) {
516; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity'
517; CHECK-NEXT:  Classifying expressions for: @uminseq_vs_ptrtoint_complexity
518; CHECK-NEXT:    %i = phi i64 [ 0, %entry ], [ %i.next, %loop ]
519; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
520; CHECK-NEXT:    %i.next = add i64 %i, 1
521; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
522; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
523; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
524; CHECK-NEXT:    %ptr.int = ptrtoint i64* %ptr to i64
525; CHECK-NEXT:    --> (ptrtoint i64* %ptr to i64) U: full-set S: full-set
526; CHECK-NEXT:    %r = add i64 %i, %ptr.int
527; CHECK-NEXT:    --> {(ptrtoint i64* %ptr to i64),+,1}<%loop> U: full-set S: full-set --> ((%n umin_seq %m) + (ptrtoint i64* %ptr to i64)) U: full-set S: full-set
528; CHECK-NEXT:  Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity
529; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
530; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
531; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
532; CHECK-NEXT:   Predicates:
533; CHECK:       Loop %loop: Trip multiple is 1
534;
535entry:
536  br label %loop
537loop:
538  %i = phi i64 [0, %entry], [%i.next, %loop]
539  %i.next = add i64 %i, 1
540  %cond_p0 = icmp ult i64 %i, %n
541  %cond_p1 = icmp ult i64 %i, %m
542  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
543  br i1 %cond, label %loop, label %exit
544exit:
545  %ptr.int = ptrtoint i64* %ptr to i64
546  %r = add i64 %i, %ptr.int
547  ret i64 %r
548}
549
550define i32 @logical_and_implies_poison1(i32 %n) {
551; CHECK-LABEL: 'logical_and_implies_poison1'
552; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison1
553; CHECK-NEXT:    %add = add i32 %n, 1
554; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
555; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
556; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
557; CHECK-NEXT:    %i.next = add i32 %i, 1
558; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
559; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
560; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
561; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison1
562; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
563; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
564; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n)
565; CHECK-NEXT:   Predicates:
566; CHECK:       Loop %loop: Trip multiple is 1
567;
568entry:
569  %add = add i32 %n, 1
570  br label %loop
571loop:
572  %i = phi i32 [0, %entry], [%i.next, %loop]
573  %i.next = add i32 %i, 1
574  %cond_p0 = icmp ult i32 %i, %n
575  %cond_p1 = icmp ult i32 %i, %add
576  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
577  br i1 %cond, label %loop, label %exit
578exit:
579  ret i32 %i
580}
581
582define i32 @logical_and_implies_poison2(i32 %n) {
583; CHECK-LABEL: 'logical_and_implies_poison2'
584; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison2
585; CHECK-NEXT:    %add = add i32 %n, 1
586; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
587; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
588; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
589; CHECK-NEXT:    %i.next = add i32 %i, 1
590; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
591; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
592; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
593; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison2
594; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
595; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
596; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n)
597; CHECK-NEXT:   Predicates:
598; CHECK:       Loop %loop: Trip multiple is 1
599;
600entry:
601  %add = add i32 %n, 1
602  br label %loop
603loop:
604  %i = phi i32 [0, %entry], [%i.next, %loop]
605  %i.next = add i32 %i, 1
606  %cond_p0 = icmp ult i32 %i, %add
607  %cond_p1 = icmp ult i32 %i, %n
608  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
609  br i1 %cond, label %loop, label %exit
610exit:
611  ret i32 %i
612}
613
614define i32 @logical_and_implies_poison3(i32 %n, i32 %m) {
615; CHECK-LABEL: 'logical_and_implies_poison3'
616; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison3
617; CHECK-NEXT:    %add = add i32 %n, %m
618; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
619; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
620; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable }
621; CHECK-NEXT:    %i.next = add i32 %i, 1
622; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable }
623; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
624; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
625; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison3
626; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin %n)
627; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
628; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin %n)
629; CHECK-NEXT:   Predicates:
630; CHECK:       Loop %loop: Trip multiple is 1
631;
632entry:
633  %add = add i32 %n, %m
634  br label %loop
635loop:
636  %i = phi i32 [0, %entry], [%i.next, %loop]
637  %i.next = add i32 %i, 1
638  %cond_p0 = icmp ult i32 %i, %add
639  %cond_p1 = icmp ult i32 %i, %n
640  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
641  br i1 %cond, label %loop, label %exit
642exit:
643  ret i32 %i
644}
645
646define i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) {
647; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction'
648; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_wrong_direction
649; CHECK-NEXT:    %add = add i32 %n, %m
650; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
651; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
652; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable }
653; CHECK-NEXT:    %i.next = add i32 %i, 1
654; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable }
655; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
656; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
657; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_wrong_direction
658; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%n + %m))
659; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
660; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq (%n + %m))
661; CHECK-NEXT:   Predicates:
662; CHECK:       Loop %loop: Trip multiple is 1
663;
664entry:
665  %add = add i32 %n, %m
666  br label %loop
667loop:
668  %i = phi i32 [0, %entry], [%i.next, %loop]
669  %i.next = add i32 %i, 1
670  %cond_p0 = icmp ult i32 %i, %n
671  %cond_p1 = icmp ult i32 %i, %add
672  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
673  br i1 %cond, label %loop, label %exit
674exit:
675  ret i32 %i
676}
677
678define i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) {
679; CHECK-LABEL: 'logical_and_implies_poison_noundef'
680; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef
681; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
682; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable }
683; CHECK-NEXT:    %i.next = add i32 %i, 1
684; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable }
685; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
686; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
687; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef
688; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin %m)
689; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
690; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin %m)
691; CHECK-NEXT:   Predicates:
692; CHECK:       Loop %loop: Trip multiple is 1
693;
694entry:
695  br label %loop
696loop:
697  %i = phi i32 [0, %entry], [%i.next, %loop]
698  %i.next = add i32 %i, 1
699  %cond_p0 = icmp ult i32 %i, %n
700  %cond_p1 = icmp ult i32 %i, %m
701  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
702  br i1 %cond, label %loop, label %exit
703exit:
704  ret i32 %i
705}
706
707define i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) {
708; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction'
709; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction
710; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
711; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable }
712; CHECK-NEXT:    %i.next = add i32 %i, 1
713; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable }
714; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
715; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
716; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction
717; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq %n)
718; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
719; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq %n)
720; CHECK-NEXT:   Predicates:
721; CHECK:       Loop %loop: Trip multiple is 1
722;
723entry:
724  br label %loop
725loop:
726  %i = phi i32 [0, %entry], [%i.next, %loop]
727  %i.next = add i32 %i, 1
728  %cond_p0 = icmp ult i32 %i, %m
729  %cond_p1 = icmp ult i32 %i, %n
730  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
731  br i1 %cond, label %loop, label %exit
732exit:
733  ret i32 %i
734}
735
736define i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) {
737; CHECK-LABEL: 'logical_and_implies_poison_complex1'
738; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex1
739; CHECK-NEXT:    %add = add i32 %n, %m
740; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
741; CHECK-NEXT:    %add1 = add i32 %add, 1
742; CHECK-NEXT:    --> (1 + %n + %m) U: full-set S: full-set
743; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
744; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable }
745; CHECK-NEXT:    %i.next = add i32 %i, 1
746; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable }
747; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
748; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
749; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex1
750; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m))
751; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
752; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (1 + %n + %m))
753; CHECK-NEXT:   Predicates:
754; CHECK:       Loop %loop: Trip multiple is 1
755;
756entry:
757  %add = add i32 %n, %m
758  %add1 = add i32 %add, 1
759  br label %loop
760loop:
761  %i = phi i32 [0, %entry], [%i.next, %loop]
762  %i.next = add i32 %i, 1
763  %cond_p0 = icmp ult i32 %i, %add1
764  %cond_p1 = icmp ult i32 %i, %add
765  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
766  br i1 %cond, label %loop, label %exit
767exit:
768  ret i32 %i
769}
770
771define i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) {
772; CHECK-LABEL: 'logical_and_implies_poison_complex2'
773; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex2
774; CHECK-NEXT:    %add = add i32 %n, %m
775; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
776; CHECK-NEXT:    %add1 = add i32 %add, %l
777; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
778; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
779; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable }
780; CHECK-NEXT:    %i.next = add i32 %i, 1
781; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable }
782; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
783; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
784; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex2
785; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l))
786; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
787; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (%n + %m + %l))
788; CHECK-NEXT:   Predicates:
789; CHECK:       Loop %loop: Trip multiple is 1
790;
791entry:
792  %add = add i32 %n, %m
793  %add1 = add i32 %add, %l
794  br label %loop
795loop:
796  %i = phi i32 [0, %entry], [%i.next, %loop]
797  %i.next = add i32 %i, 1
798  %cond_p0 = icmp ult i32 %i, %add1
799  %cond_p1 = icmp ult i32 %i, %add
800  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
801  br i1 %cond, label %loop, label %exit
802exit:
803  ret i32 %i
804}
805
806define i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) {
807; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction'
808; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction
809; CHECK-NEXT:    %add = add i32 %n, %m
810; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
811; CHECK-NEXT:    %add1 = add i32 %add, %l
812; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
813; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
814; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable }
815; CHECK-NEXT:    %i.next = add i32 %i, 1
816; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable }
817; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
818; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
819; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction
820; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
821; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
822; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
823; CHECK-NEXT:   Predicates:
824; CHECK:       Loop %loop: Trip multiple is 1
825;
826entry:
827  %add = add i32 %n, %m
828  %add1 = add i32 %add, %l
829  br label %loop
830loop:
831  %i = phi i32 [0, %entry], [%i.next, %loop]
832  %i.next = add i32 %i, 1
833  %cond_p0 = icmp ult i32 %i, %add
834  %cond_p1 = icmp ult i32 %i, %add1
835  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
836  br i1 %cond, label %loop, label %exit
837exit:
838  ret i32 %i
839}
840
841define i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) {
842; CHECK-LABEL: 'logical_and_implies_multiple_ops'
843; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops
844; CHECK-NEXT:    %add = add i32 %n, 1
845; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
846; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
847; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable }
848; CHECK-NEXT:    %i.next = add i32 %i, 1
849; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable }
850; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
851; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
852; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
853; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
854; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops
855; CHECK-NEXT:  Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
856; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
857; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
858; CHECK-NEXT:   Predicates:
859; CHECK:       Loop %loop: Trip multiple is 1
860;
861entry:
862  %add = add i32 %n, 1
863  br label %loop
864loop:
865  %i = phi i32 [0, %entry], [%i.next, %loop]
866  %i.next = add i32 %i, 1
867  %cond_p0 = icmp ult i32 %i, %n
868  %cond_p1 = icmp ult i32 %i, %add
869  %cond_p2 = icmp ult i32 %i, %m
870  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
871  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
872  br i1 %cond2, label %loop, label %exit
873exit:
874  ret i32 %i
875}
876
877define i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) {
878; CHECK-LABEL: 'logical_and_implies_multiple_ops2'
879; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops2
880; CHECK-NEXT:    %add = add i32 %n, 1
881; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
882; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
883; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq (1 + %n)) LoopDispositions: { %loop: Computable }
884; CHECK-NEXT:    %i.next = add i32 %i, 1
885; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq (1 + %n))) LoopDispositions: { %loop: Computable }
886; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
887; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
888; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
889; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
890; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops2
891; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq (1 + %n))
892; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
893; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq (1 + %n))
894; CHECK-NEXT:   Predicates:
895; CHECK:       Loop %loop: Trip multiple is 1
896;
897entry:
898  %add = add i32 %n, 1
899  br label %loop
900loop:
901  %i = phi i32 [0, %entry], [%i.next, %loop]
902  %i.next = add i32 %i, 1
903  %cond_p0 = icmp ult i32 %i, %n
904  %cond_p1 = icmp ult i32 %i, %m
905  %cond_p2 = icmp ult i32 %i, %add
906  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
907  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
908  br i1 %cond2, label %loop, label %exit
909exit:
910  ret i32 %i
911}
912
913define i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) {
914; CHECK-LABEL: 'logical_and_implies_multiple_ops3'
915; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops3
916; CHECK-NEXT:    %add = add i32 %n, 1
917; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
918; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
919; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
920; CHECK-NEXT:    %i.next = add i32 %i, 1
921; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable }
922; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
923; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
924; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
925; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
926; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops3
927; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
928; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
929; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
930; CHECK-NEXT:   Predicates:
931; CHECK:       Loop %loop: Trip multiple is 1
932;
933entry:
934  %add = add i32 %n, 1
935  br label %loop
936loop:
937  %i = phi i32 [0, %entry], [%i.next, %loop]
938  %i.next = add i32 %i, 1
939  %cond_p0 = icmp ult i32 %i, %m
940  %cond_p1 = icmp ult i32 %i, %n
941  %cond_p2 = icmp ult i32 %i, %add
942  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
943  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
944  br i1 %cond2, label %loop, label %exit
945exit:
946  ret i32 %i
947}
948
949define i32 @logical_and_not_zero(i16 %n, i32 %m) {
950; CHECK-LABEL: 'logical_and_not_zero'
951; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero
952; CHECK-NEXT:    %n.ext = zext i16 %n to i32
953; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
954; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
955; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
956; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
957; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65537) S: [0,65537) Exits: ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) LoopDispositions: { %loop: Computable }
958; CHECK-NEXT:    %i.next = add i32 %i, 1
959; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65538) S: [1,65538) Exits: (1 + ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m))<nuw><nsw> LoopDispositions: { %loop: Computable }
960; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
961; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
962; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero
963; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
964; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65536
965; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
966; CHECK-NEXT:   Predicates:
967; CHECK:       Loop %loop: Trip multiple is 1
968;
969entry:
970  %n.ext = zext i16 %n to i32
971  %n1 = add i32 %n.ext, 1
972  br label %loop
973loop:
974  %i = phi i32 [0, %entry], [%i.next, %loop]
975  %i.next = add i32 %i, 1
976  %cond_p0 = icmp ult i32 %i, %n1
977  %cond_p1 = icmp ult i32 %i, %m
978  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
979  br i1 %cond, label %loop, label %exit
980exit:
981  ret i32 %i
982}
983
984define i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) {
985; CHECK-LABEL: 'logical_and_not_zero_wrong_order'
986; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_wrong_order
987; CHECK-NEXT:    %n.ext = zext i16 %n to i32
988; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
989; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
990; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
991; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
992; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65537) S: [0,65537) Exits: (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }
993; CHECK-NEXT:    %i.next = add i32 %i, 1
994; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65538) S: [1,65538) Exits: (1 + (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }
995; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
996; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
997; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_wrong_order
998; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
999; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65536
1000; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
1001; CHECK-NEXT:   Predicates:
1002; CHECK:       Loop %loop: Trip multiple is 1
1003;
1004entry:
1005  %n.ext = zext i16 %n to i32
1006  %n1 = add i32 %n.ext, 1
1007  br label %loop
1008loop:
1009  %i = phi i32 [0, %entry], [%i.next, %loop]
1010  %i.next = add i32 %i, 1
1011  %cond_p0 = icmp ult i32 %i, %m
1012  %cond_p1 = icmp ult i32 %i, %n1
1013  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1014  br i1 %cond, label %loop, label %exit
1015exit:
1016  ret i32 %i
1017}
1018
1019define i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) {
1020; CHECK-LABEL: 'logical_and_not_zero_needs_context'
1021; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_needs_context
1022; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1023; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
1024; CHECK-NEXT:    %i.next = add i32 %i, 1
1025; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
1026; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1027; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1028; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_needs_context
1029; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
1030; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
1031; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
1032; CHECK-NEXT:   Predicates:
1033; CHECK:       Loop %loop: Trip multiple is 1
1034;
1035entry:
1036  %cmp = icmp ne i32 %n, 0
1037  br i1 %cmp, label %loop, label %guard.fail
1038loop:
1039  %i = phi i32 [0, %entry], [%i.next, %loop]
1040  %i.next = add i32 %i, 1
1041  %cond_p0 = icmp ult i32 %i, %n
1042  %cond_p1 = icmp ult i32 %i, %m
1043  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1044  br i1 %cond, label %loop, label %exit
1045exit:
1046  ret i32 %i
1047guard.fail:
1048  ret i32 -1
1049}
1050
1051declare i32 @llvm.umin.i32(i32, i32)
1052