xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-select-safe.ll (revision 0d38f21e4ab7fe7cebe76a9d7c218ec54dba1e98)
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: constant max backedge-taken count is i32 -1
16; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
17; CHECK-NEXT:  Loop %loop: Trip multiple is 1
18;
19entry:
20  br label %loop
21loop:
22  %i = phi i32 [0, %entry], [%i.next, %loop]
23  %i.next = add i32 %i, 1
24  %cond_p0 = icmp ult i32 %i, %n
25  %cond_p1 = icmp ult i32 %i, %m
26  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
27  br i1 %cond, label %loop, label %exit
28exit:
29  ret i32 %i
30}
31
32define i32 @logical_or_2ops(i32 %n, i32 %m) {
33; CHECK-LABEL: 'logical_or_2ops'
34; CHECK-NEXT:  Classifying expressions for: @logical_or_2ops
35; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
36; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
37; CHECK-NEXT:    %i.next = add i32 %i, 1
38; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
39; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
40; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
41; CHECK-NEXT:  Determining loop execution counts for: @logical_or_2ops
42; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
43; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
44; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
45; CHECK-NEXT:  Loop %loop: Trip multiple is 1
46;
47entry:
48  br label %loop
49loop:
50  %i = phi i32 [0, %entry], [%i.next, %loop]
51  %i.next = add i32 %i, 1
52  %cond_p0 = icmp uge i32 %i, %n
53  %cond_p1 = icmp uge i32 %i, %m
54  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
55  br i1 %cond, label %exit, label %loop
56exit:
57  ret i32 %i
58}
59
60define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
61; CHECK-LABEL: 'logical_and_3ops'
62; CHECK-NEXT:  Classifying expressions for: @logical_and_3ops
63; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
64; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
65; CHECK-NEXT:    %i.next = add i32 %i, 1
66; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
67; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
68; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
69; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
70; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
71; CHECK-NEXT:  Determining loop execution counts for: @logical_and_3ops
72; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
73; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
74; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
75; CHECK-NEXT:  Loop %loop: Trip multiple is 1
76;
77entry:
78  br label %loop
79loop:
80  %i = phi i32 [0, %entry], [%i.next, %loop]
81  %i.next = add i32 %i, 1
82  %cond_p0 = icmp ult i32 %i, %n
83  %cond_p1 = icmp ult i32 %i, %m
84  %cond_p2 = icmp ult i32 %i, %k
85  %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
86  %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
87  br i1 %cond, label %loop, label %exit
88exit:
89  ret i32 %i
90}
91
92define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
93; CHECK-LABEL: 'logical_or_3ops'
94; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops
95; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
96; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
97; CHECK-NEXT:    %i.next = add i32 %i, 1
98; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
99; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
100; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
101; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
102; 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 }
103; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops
104; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
105; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
106; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
107; CHECK-NEXT:  Loop %loop: Trip multiple is 1
108;
109entry:
110  br label %loop
111loop:
112  %i = phi i32 [0, %entry], [%i.next, %loop]
113  %i.next = add i32 %i, 1
114  %cond_p0 = icmp uge i32 %i, %n
115  %cond_p1 = icmp uge i32 %i, %m
116  %cond_p2 = icmp uge i32 %i, %k
117  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
118  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
119  br i1 %cond, label %exit, label %loop
120exit:
121  ret i32 %i
122}
123
124define i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) {
125; CHECK-LABEL: 'logical_or_3ops_duplicate'
126; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_duplicate
127; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
128; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
129; CHECK-NEXT:    %i.next = add i32 %i, 1
130; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
131; CHECK-NEXT:    %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
132; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
133; CHECK-NEXT:    %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
134; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq ((true + %cond_p1) umin (true + %cond_p2)))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
135; CHECK-NEXT:    %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
136; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq ((true + %cond_p1) umin (true + %cond_p2)) umin_seq (true + %cond_p3))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
137; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_duplicate
138; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
139; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
140; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
141; CHECK-NEXT:  Loop %loop: Trip multiple is 1
142;
143entry:
144  br label %loop
145loop:
146  %i = phi i32 [0, %entry], [%i.next, %loop]
147  %i.next = add i32 %i, 1
148  %cond_p0 = icmp uge i32 %i, %n
149  %cond_p1 = icmp uge i32 %i, %m
150  %cond_p2 = icmp uge i32 %i, %n
151  %cond_p3 = icmp uge i32 %i, %k
152  %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
153  %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
154  %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
155  br i1 %cond, label %exit, label %loop
156exit:
157  ret i32 %i
158}
159
160define i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) {
161; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand'
162; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand
163; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
164; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
165; CHECK-NEXT:    %i.next = add i32 %i, 1
166; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
167; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
168; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
169; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
170; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
171; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
172; CHECK-NEXT:    --> (true + (((true + %cond_p0) umin (true + %cond_p1)) umin_seq (true + %cond_p2))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
173; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand
174; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
175; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
176; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)
177; CHECK-NEXT:  Loop %loop: Trip multiple is 1
178;
179entry:
180  br label %loop
181loop:
182  %i = phi i32 [0, %entry], [%i.next, %loop]
183  %i.next = add i32 %i, 1
184  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
185  %cond_p0 = icmp uge i32 %i, %umin
186  %cond_p1 = icmp uge i32 %i, %n
187  %cond_p2 = icmp uge i32 %i, %k
188  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
189  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
190  br i1 %cond, label %exit, label %loop
191exit:
192  ret i32 %i
193}
194
195define i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) {
196; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand'
197; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_umin_operand
198; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
199; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable }
200; CHECK-NEXT:    %i.next = add i32 %i, 1
201; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable }
202; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
203; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
204; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
205; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
206; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
207; 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 }
208; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand
209; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m)
210; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
211; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %k umin_seq %m)
212; CHECK-NEXT:  Loop %loop: Trip multiple is 1
213;
214entry:
215  br label %loop
216loop:
217  %i = phi i32 [0, %entry], [%i.next, %loop]
218  %i.next = add i32 %i, 1
219  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
220  %cond_p0 = icmp uge i32 %i, %n
221  %cond_p1 = icmp uge i32 %i, %k
222  %cond_p2 = icmp uge i32 %i, %umin
223  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
224  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
225  br i1 %cond, label %exit, label %loop
226exit:
227  ret i32 %i
228}
229
230define i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) {
231; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins'
232; CHECK-NEXT:  Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins
233; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
234; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k umin_seq %q) LoopDispositions: { %loop: Computable }
235; CHECK-NEXT:    %i.next = add i32 %i, 1
236; 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 }
237; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
238; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
239; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
240; CHECK-NEXT:    --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant }
241; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
242; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
243; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
244; 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 }
245; CHECK-NEXT:  Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins
246; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
247; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
248; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
249; CHECK-NEXT:  Loop %loop: Trip multiple is 1
250;
251entry:
252  br label %loop
253loop:
254  %i = phi i32 [0, %entry], [%i.next, %loop]
255  %i.next = add i32 %i, 1
256  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
257  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
258  %cond_p0 = icmp uge i32 %i, %umin
259  %cond_p1 = icmp uge i32 %i, %k
260  %cond_p2 = icmp uge i32 %i, %umin2
261  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
262  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
263  br i1 %cond, label %exit, label %loop
264exit:
265  ret i32 %i
266}
267
268define i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) {
269; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin'
270; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin
271; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
272; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
273; CHECK-NEXT:    %i.next = add i32 %i, 1
274; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
275; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
276; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
277; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
278; CHECK-NEXT:    --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant }
279; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
280; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
281; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
282; 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 }
283; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin
284; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
285; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
286; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)
287; CHECK-NEXT:  Loop %loop: Trip multiple is 1
288;
289entry:
290  br label %loop
291loop:
292  %i = phi i32 [0, %entry], [%i.next, %loop]
293  %i.next = add i32 %i, 1
294  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
295  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
296  %cond_p0 = icmp uge i32 %i, %umin
297  %cond_p1 = icmp uge i32 %i, %k
298  %cond_p2 = icmp uge i32 %i, %umin2
299  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
300  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
301  br i1 %cond, label %exit, label %loop
302exit:
303  ret i32 %i
304}
305
306define i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) {
307; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin'
308; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_partially_redundant_umin
309; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
310; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable }
311; CHECK-NEXT:    %i.next = add i32 %i, 1
312; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable }
313; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
314; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
315; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
316; CHECK-NEXT:    --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant }
317; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
318; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
319; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin
320; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k))
321; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
322; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%m umin %k))
323; CHECK-NEXT:  Loop %loop: Trip multiple is 1
324;
325entry:
326  br label %loop
327loop:
328  %i = phi i32 [0, %entry], [%i.next, %loop]
329  %i.next = add i32 %i, 1
330  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
331  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
332  %cond_p0 = icmp uge i32 %i, %n
333  %cond_p1 = icmp uge i32 %i, %umin2
334  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
335  br i1 %cond, label %exit, label %loop
336exit:
337  ret i32 %i
338}
339
340define i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
341; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq'
342; CHECK-NEXT:  Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
343; CHECK-NEXT:    %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ]
344; CHECK-NEXT:    --> {0,+,1}<%first.loop> U: full-set S: full-set Exits: (%e umin_seq %d umin_seq %a) LoopDispositions: { %first.loop: Computable }
345; CHECK-NEXT:    %first.i.next = add i32 %first.i, 1
346; 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 }
347; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
348; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }
349; CHECK-NEXT:    %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
350; 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 }
351; CHECK-NEXT:    %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ]
352; 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 }
353; CHECK-NEXT:    %i.next = add i32 %i, 1
354; 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 }
355; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
356; CHECK-NEXT:    --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant }
357; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
358; 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 }
359; CHECK-NEXT:    %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
360; CHECK-NEXT:    --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
361; CHECK-NEXT:    %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
362; 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 }
363; CHECK-NEXT:  Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
364; CHECK-NEXT:  Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
365; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
366; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
367; CHECK-NEXT:  Loop %loop: Trip multiple is 1
368; CHECK-NEXT:  Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a)
369; CHECK-NEXT:  Loop %first.loop: constant max backedge-taken count is i32 -1
370; CHECK-NEXT:  Loop %first.loop: symbolic max backedge-taken count is (%e umin_seq %d umin_seq %a)
371; CHECK-NEXT:  Loop %first.loop: Trip multiple is 1
372;
373entry:
374  br label %first.loop
375first.loop:
376  %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop]
377  %first.i.next = add i32 %first.i, 1
378  %cond_p0 = icmp uge i32 %first.i, %e
379  %cond_p1 = icmp uge i32 %first.i, %d
380  %cond_p2 = icmp uge i32 %first.i, %a
381  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
382  %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
383  br i1 %cond_p4, label %first.loop.exit, label %first.loop
384first.loop.exit:
385  br label %loop
386loop:
387  %i = phi i32 [0, %first.loop.exit], [%i.next, %loop]
388  %i.next = add i32 %i, 1
389  %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
390  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
391  %cond_p5 = icmp uge i32 %i, %a
392  %cond_p6 = icmp uge i32 %i, %b
393  %cond_p7 = icmp uge i32 %i, %umin2
394  %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
395  %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
396  br i1 %cond, label %exit, label %loop
397exit:
398  ret i32 %i
399}
400
401define i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) {
402; CHECK-LABEL: 'logical_and_2ops_and_constant'
403; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops_and_constant
404; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
405; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable }
406; CHECK-NEXT:    %i.next = add i32 %i, 1
407; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable }
408; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
409; CHECK-NEXT:    --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant }
410; CHECK-NEXT:    %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
411; CHECK-NEXT:    --> (true + ((true + %cond_p1) umin (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
412; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops_and_constant
413; CHECK-NEXT:  Loop %loop: backedge-taken count is (42 umin %n)
414; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 42
415; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (42 umin %n)
416; CHECK-NEXT:  Loop %loop: Trip multiple is 1
417;
418entry:
419  br label %loop
420loop:
421  %i = phi i32 [0, %entry], [%i.next, %loop]
422  %i.next = add i32 %i, 1
423  %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
424  %cond_p0 = icmp uge i32 %i, %umin
425  %cond_p1 = icmp uge i32 %i, %n
426  %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
427  br i1 %cond, label %exit, label %loop
428exit:
429  ret i32 %i
430}
431
432define i32 @computeSCEVAtScope(i32 %d.0) {
433; CHECK-LABEL: 'computeSCEVAtScope'
434; CHECK-NEXT:  Classifying expressions for: @computeSCEVAtScope
435; CHECK-NEXT:    %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
436; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
437; CHECK-NEXT:    %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
438; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
439; CHECK-NEXT:    %0 = select i1 %tobool1, i1 %tobool2, i1 false
440; CHECK-NEXT:    --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant }
441; CHECK-NEXT:    %inc = add nsw i32 %d.1, 1
442; CHECK-NEXT:    --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
443; CHECK-NEXT:    %inc3 = add nsw i32 %e.1, 1
444; CHECK-NEXT:    --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
445; CHECK-NEXT:    %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
446; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
447; CHECK-NEXT:    %inc8 = add i32 %f.1, 1
448; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
449; CHECK-NEXT:  Determining loop execution counts for: @computeSCEVAtScope
450; CHECK-NEXT:  Loop %for.cond: backedge-taken count is (-1 * %d.0)
451; CHECK-NEXT:  Loop %for.cond: constant max backedge-taken count is i32 -1
452; CHECK-NEXT:  Loop %for.cond: symbolic max backedge-taken count is (-1 * %d.0)
453; CHECK-NEXT:  Loop %for.cond: Trip multiple is 1
454; CHECK-NEXT:  Loop %for.cond4: backedge-taken count is i32 0
455; CHECK-NEXT:  Loop %for.cond4: constant max backedge-taken count is i32 0
456; CHECK-NEXT:  Loop %for.cond4: symbolic max backedge-taken count is i32 0
457; CHECK-NEXT:  Loop %for.cond4: Trip multiple is 1
458; CHECK-NEXT:  Loop %while.cond: <multiple exits> Unpredictable backedge-taken count.
459; CHECK-NEXT:  Loop %while.cond: Unpredictable constant max backedge-taken count.
460; CHECK-NEXT:  Loop %while.cond: Unpredictable symbolic max backedge-taken count.
461;
462entry:
463  br label %while.cond
464
465while.cond.loopexit:                              ; preds = %for.cond4
466  br label %while.cond
467
468while.cond:                                       ; preds = %while.cond.loopexit, %entry
469  br label %for.cond.preheader
470
471for.cond.preheader:                               ; preds = %while.cond
472  br label %for.cond
473
474for.cond:                                         ; preds = %for.body, %for.cond.preheader
475  %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
476  %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
477  %tobool1 = icmp ne i32 %e.1, 0
478  %tobool2 = icmp ne i32 %d.1, 0
479  %0 = select i1 %tobool1, i1 %tobool2, i1 false
480  br i1 %0, label %for.body, label %for.cond4.preheader
481
482for.cond4.preheader:                              ; preds = %for.cond
483  br label %for.cond4
484
485for.body:                                         ; preds = %for.cond
486  %inc = add nsw i32 %d.1, 1
487  %inc3 = add nsw i32 %e.1, 1
488  br label %for.cond
489
490for.cond4:                                        ; preds = %for.body5, %for.cond4.preheader
491  %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
492  %exitcond.not = icmp eq i32 %f.1, %e.1
493  br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5
494
495for.body5:                                        ; preds = %for.cond4
496  %inc8 = add i32 %f.1, 1
497  br label %for.cond4
498}
499
500define i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, ptr %ptr) {
501; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity'
502; CHECK-NEXT:  Classifying expressions for: @uminseq_vs_ptrtoint_complexity
503; CHECK-NEXT:    %i = phi i64 [ 0, %entry ], [ %i.next, %loop ]
504; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
505; CHECK-NEXT:    %i.next = add i64 %i, 1
506; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
507; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
508; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
509; CHECK-NEXT:    %ptr.int = ptrtoint ptr %ptr to i64
510; CHECK-NEXT:    --> (ptrtoint ptr %ptr to i64) U: full-set S: full-set
511; CHECK-NEXT:    %r = add i64 %i, %ptr.int
512; CHECK-NEXT:    --> {(ptrtoint ptr %ptr to i64),+,1}<%loop> U: full-set S: full-set --> ((%n umin_seq %m) + (ptrtoint ptr %ptr to i64)) U: full-set S: full-set
513; CHECK-NEXT:  Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity
514; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
515; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 -1
516; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
517; CHECK-NEXT:  Loop %loop: Trip multiple is 1
518;
519entry:
520  br label %loop
521loop:
522  %i = phi i64 [0, %entry], [%i.next, %loop]
523  %i.next = add i64 %i, 1
524  %cond_p0 = icmp ult i64 %i, %n
525  %cond_p1 = icmp ult i64 %i, %m
526  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
527  br i1 %cond, label %loop, label %exit
528exit:
529  %ptr.int = ptrtoint ptr %ptr to i64
530  %r = add i64 %i, %ptr.int
531  ret i64 %r
532}
533
534define i32 @logical_and_implies_poison1(i32 %n) {
535; CHECK-LABEL: 'logical_and_implies_poison1'
536; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison1
537; CHECK-NEXT:    %add = add i32 %n, 1
538; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
539; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
540; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
541; CHECK-NEXT:    %i.next = add i32 %i, 1
542; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
543; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
544; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
545; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison1
546; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
547; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
548; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)
549; CHECK-NEXT:  Loop %loop: Trip multiple is 1
550;
551entry:
552  %add = add i32 %n, 1
553  br label %loop
554loop:
555  %i = phi i32 [0, %entry], [%i.next, %loop]
556  %i.next = add i32 %i, 1
557  %cond_p0 = icmp ult i32 %i, %n
558  %cond_p1 = icmp ult i32 %i, %add
559  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
560  br i1 %cond, label %loop, label %exit
561exit:
562  ret i32 %i
563}
564
565define i32 @logical_and_implies_poison2(i32 %n) {
566; CHECK-LABEL: 'logical_and_implies_poison2'
567; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison2
568; CHECK-NEXT:    %add = add i32 %n, 1
569; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
570; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
571; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
572; CHECK-NEXT:    %i.next = add i32 %i, 1
573; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
574; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
575; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
576; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison2
577; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
578; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
579; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)
580; CHECK-NEXT:  Loop %loop: Trip multiple is 1
581;
582entry:
583  %add = add i32 %n, 1
584  br label %loop
585loop:
586  %i = phi i32 [0, %entry], [%i.next, %loop]
587  %i.next = add i32 %i, 1
588  %cond_p0 = icmp ult i32 %i, %add
589  %cond_p1 = icmp ult i32 %i, %n
590  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
591  br i1 %cond, label %loop, label %exit
592exit:
593  ret i32 %i
594}
595
596define i32 @logical_and_implies_poison3(i32 %n, i32 %m) {
597; CHECK-LABEL: 'logical_and_implies_poison3'
598; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison3
599; CHECK-NEXT:    %add = add i32 %n, %m
600; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
601; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
602; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable }
603; CHECK-NEXT:    %i.next = add i32 %i, 1
604; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable }
605; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
606; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
607; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison3
608; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin %n)
609; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
610; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin %n)
611; CHECK-NEXT:  Loop %loop: Trip multiple is 1
612;
613entry:
614  %add = add i32 %n, %m
615  br label %loop
616loop:
617  %i = phi i32 [0, %entry], [%i.next, %loop]
618  %i.next = add i32 %i, 1
619  %cond_p0 = icmp ult i32 %i, %add
620  %cond_p1 = icmp ult i32 %i, %n
621  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
622  br i1 %cond, label %loop, label %exit
623exit:
624  ret i32 %i
625}
626
627define i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) {
628; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction'
629; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_wrong_direction
630; CHECK-NEXT:    %add = add i32 %n, %m
631; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
632; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
633; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable }
634; CHECK-NEXT:    %i.next = add i32 %i, 1
635; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable }
636; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
637; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
638; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_wrong_direction
639; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%n + %m))
640; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
641; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%n + %m))
642; CHECK-NEXT:  Loop %loop: Trip multiple is 1
643;
644entry:
645  %add = add i32 %n, %m
646  br label %loop
647loop:
648  %i = phi i32 [0, %entry], [%i.next, %loop]
649  %i.next = add i32 %i, 1
650  %cond_p0 = icmp ult i32 %i, %n
651  %cond_p1 = icmp ult i32 %i, %add
652  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
653  br i1 %cond, label %loop, label %exit
654exit:
655  ret i32 %i
656}
657
658define i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) {
659; CHECK-LABEL: 'logical_and_implies_poison_noundef'
660; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef
661; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
662; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable }
663; CHECK-NEXT:    %i.next = add i32 %i, 1
664; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable }
665; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
666; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
667; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef
668; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin %m)
669; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
670; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin %m)
671; CHECK-NEXT:  Loop %loop: Trip multiple is 1
672;
673entry:
674  br label %loop
675loop:
676  %i = phi i32 [0, %entry], [%i.next, %loop]
677  %i.next = add i32 %i, 1
678  %cond_p0 = icmp ult i32 %i, %n
679  %cond_p1 = icmp ult i32 %i, %m
680  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
681  br i1 %cond, label %loop, label %exit
682exit:
683  ret i32 %i
684}
685
686define i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) {
687; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction'
688; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction
689; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
690; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable }
691; CHECK-NEXT:    %i.next = add i32 %i, 1
692; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable }
693; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
694; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
695; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction
696; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq %n)
697; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
698; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq %n)
699; CHECK-NEXT:  Loop %loop: Trip multiple is 1
700;
701entry:
702  br label %loop
703loop:
704  %i = phi i32 [0, %entry], [%i.next, %loop]
705  %i.next = add i32 %i, 1
706  %cond_p0 = icmp ult i32 %i, %m
707  %cond_p1 = icmp ult i32 %i, %n
708  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
709  br i1 %cond, label %loop, label %exit
710exit:
711  ret i32 %i
712}
713
714define i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) {
715; CHECK-LABEL: 'logical_and_implies_poison_complex1'
716; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex1
717; CHECK-NEXT:    %add = add i32 %n, %m
718; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
719; CHECK-NEXT:    %add1 = add i32 %add, 1
720; CHECK-NEXT:    --> (1 + %n + %m) U: full-set S: full-set
721; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
722; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable }
723; CHECK-NEXT:    %i.next = add i32 %i, 1
724; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable }
725; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
726; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
727; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex1
728; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m))
729; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
730; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (1 + %n + %m))
731; CHECK-NEXT:  Loop %loop: Trip multiple is 1
732;
733entry:
734  %add = add i32 %n, %m
735  %add1 = add i32 %add, 1
736  br label %loop
737loop:
738  %i = phi i32 [0, %entry], [%i.next, %loop]
739  %i.next = add i32 %i, 1
740  %cond_p0 = icmp ult i32 %i, %add1
741  %cond_p1 = icmp ult i32 %i, %add
742  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
743  br i1 %cond, label %loop, label %exit
744exit:
745  ret i32 %i
746}
747
748define i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) {
749; CHECK-LABEL: 'logical_and_implies_poison_complex2'
750; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex2
751; CHECK-NEXT:    %add = add i32 %n, %m
752; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
753; CHECK-NEXT:    %add1 = add i32 %add, %l
754; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
755; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
756; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable }
757; CHECK-NEXT:    %i.next = add i32 %i, 1
758; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable }
759; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
760; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
761; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex2
762; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l))
763; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
764; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (%n + %m + %l))
765; CHECK-NEXT:  Loop %loop: Trip multiple is 1
766;
767entry:
768  %add = add i32 %n, %m
769  %add1 = add i32 %add, %l
770  br label %loop
771loop:
772  %i = phi i32 [0, %entry], [%i.next, %loop]
773  %i.next = add i32 %i, 1
774  %cond_p0 = icmp ult i32 %i, %add1
775  %cond_p1 = icmp ult i32 %i, %add
776  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
777  br i1 %cond, label %loop, label %exit
778exit:
779  ret i32 %i
780}
781
782define i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) {
783; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction'
784; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction
785; CHECK-NEXT:    %add = add i32 %n, %m
786; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
787; CHECK-NEXT:    %add1 = add i32 %add, %l
788; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
789; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
790; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable }
791; CHECK-NEXT:    %i.next = add i32 %i, 1
792; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable }
793; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
794; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
795; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction
796; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
797; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
798; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
799; CHECK-NEXT:  Loop %loop: Trip multiple is 1
800;
801entry:
802  %add = add i32 %n, %m
803  %add1 = add i32 %add, %l
804  br label %loop
805loop:
806  %i = phi i32 [0, %entry], [%i.next, %loop]
807  %i.next = add i32 %i, 1
808  %cond_p0 = icmp ult i32 %i, %add
809  %cond_p1 = icmp ult i32 %i, %add1
810  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
811  br i1 %cond, label %loop, label %exit
812exit:
813  ret i32 %i
814}
815
816define i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) {
817; CHECK-LABEL: 'logical_and_implies_multiple_ops'
818; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops
819; CHECK-NEXT:    %add = add i32 %n, 1
820; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
821; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
822; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable }
823; CHECK-NEXT:    %i.next = add i32 %i, 1
824; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable }
825; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
826; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
827; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
828; CHECK-NEXT:    --> ((%cond_p0 umin %cond_p1) umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
829; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops
830; CHECK-NEXT:  Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
831; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
832; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
833; CHECK-NEXT:  Loop %loop: Trip multiple is 1
834;
835entry:
836  %add = add i32 %n, 1
837  br label %loop
838loop:
839  %i = phi i32 [0, %entry], [%i.next, %loop]
840  %i.next = add i32 %i, 1
841  %cond_p0 = icmp ult i32 %i, %n
842  %cond_p1 = icmp ult i32 %i, %add
843  %cond_p2 = icmp ult i32 %i, %m
844  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
845  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
846  br i1 %cond2, label %loop, label %exit
847exit:
848  ret i32 %i
849}
850
851define i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) {
852; CHECK-LABEL: 'logical_and_implies_multiple_ops2'
853; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops2
854; CHECK-NEXT:    %add = add i32 %n, 1
855; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
856; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
857; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq ((1 + %n) umin %m)) LoopDispositions: { %loop: Computable }
858; CHECK-NEXT:    %i.next = add i32 %i, 1
859; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq ((1 + %n) umin %m))) LoopDispositions: { %loop: Computable }
860; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
861; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
862; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
863; CHECK-NEXT:    --> (%cond_p0 umin_seq (%cond_p1 umin %cond_p2)) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
864; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops2
865; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
866; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
867; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
868; CHECK-NEXT:  Loop %loop: Trip multiple is 1
869;
870entry:
871  %add = add i32 %n, 1
872  br label %loop
873loop:
874  %i = phi i32 [0, %entry], [%i.next, %loop]
875  %i.next = add i32 %i, 1
876  %cond_p0 = icmp ult i32 %i, %n
877  %cond_p1 = icmp ult i32 %i, %m
878  %cond_p2 = icmp ult i32 %i, %add
879  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
880  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
881  br i1 %cond2, label %loop, label %exit
882exit:
883  ret i32 %i
884}
885
886define i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) {
887; CHECK-LABEL: 'logical_and_implies_multiple_ops3'
888; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops3
889; CHECK-NEXT:    %add = add i32 %n, 1
890; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
891; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
892; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
893; CHECK-NEXT:    %i.next = add i32 %i, 1
894; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable }
895; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
896; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
897; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
898; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
899; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops3
900; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
901; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
902; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
903; CHECK-NEXT:  Loop %loop: Trip multiple is 1
904;
905entry:
906  %add = add i32 %n, 1
907  br label %loop
908loop:
909  %i = phi i32 [0, %entry], [%i.next, %loop]
910  %i.next = add i32 %i, 1
911  %cond_p0 = icmp ult i32 %i, %m
912  %cond_p1 = icmp ult i32 %i, %n
913  %cond_p2 = icmp ult i32 %i, %add
914  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
915  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
916  br i1 %cond2, label %loop, label %exit
917exit:
918  ret i32 %i
919}
920
921define i32 @logical_and_not_zero(i16 %n, i32 %m) {
922; CHECK-LABEL: 'logical_and_not_zero'
923; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero
924; CHECK-NEXT:    %n.ext = zext i16 %n to i32
925; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
926; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
927; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
928; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
929; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65537) S: [0,65537) Exits: ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) LoopDispositions: { %loop: Computable }
930; CHECK-NEXT:    %i.next = add i32 %i, 1
931; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65538) S: [1,65538) Exits: (1 + ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m))<nuw><nsw> LoopDispositions: { %loop: Computable }
932; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
933; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
934; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero
935; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
936; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65536
937; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
938; CHECK-NEXT:  Loop %loop: Trip multiple is 1
939;
940entry:
941  %n.ext = zext i16 %n to i32
942  %n1 = add i32 %n.ext, 1
943  br label %loop
944loop:
945  %i = phi i32 [0, %entry], [%i.next, %loop]
946  %i.next = add i32 %i, 1
947  %cond_p0 = icmp ult i32 %i, %n1
948  %cond_p1 = icmp ult i32 %i, %m
949  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
950  br i1 %cond, label %loop, label %exit
951exit:
952  ret i32 %i
953}
954
955define i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) {
956; CHECK-LABEL: 'logical_and_not_zero_wrong_order'
957; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_wrong_order
958; CHECK-NEXT:    %n.ext = zext i16 %n to i32
959; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
960; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
961; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
962; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
963; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65537) S: [0,65537) Exits: (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }
964; CHECK-NEXT:    %i.next = add i32 %i, 1
965; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%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 }
966; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
967; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
968; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_wrong_order
969; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
970; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65536
971; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
972; CHECK-NEXT:  Loop %loop: Trip multiple is 1
973;
974entry:
975  %n.ext = zext i16 %n to i32
976  %n1 = add i32 %n.ext, 1
977  br label %loop
978loop:
979  %i = phi i32 [0, %entry], [%i.next, %loop]
980  %i.next = add i32 %i, 1
981  %cond_p0 = icmp ult i32 %i, %m
982  %cond_p1 = icmp ult i32 %i, %n1
983  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
984  br i1 %cond, label %loop, label %exit
985exit:
986  ret i32 %i
987}
988
989define i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) {
990; CHECK-LABEL: 'logical_and_not_zero_needs_context'
991; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_needs_context
992; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
993; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
994; CHECK-NEXT:    %i.next = add i32 %i, 1
995; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
996; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
997; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
998; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_needs_context
999; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
1000; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
1001; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
1002; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1003;
1004entry:
1005  %cmp = icmp ne i32 %n, 0
1006  br i1 %cmp, label %loop, label %guard.fail
1007loop:
1008  %i = phi i32 [0, %entry], [%i.next, %loop]
1009  %i.next = add i32 %i, 1
1010  %cond_p0 = icmp ult i32 %i, %n
1011  %cond_p1 = icmp ult i32 %i, %m
1012  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1013  br i1 %cond, label %loop, label %exit
1014exit:
1015  ret i32 %i
1016guard.fail:
1017  ret i32 -1
1018}
1019
1020define i32 @logical_and_known_smaller(i16 %n, i16 %m) {
1021; CHECK-LABEL: 'logical_and_known_smaller'
1022; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller
1023; CHECK-NEXT:    %n.ext = zext i16 %n to i32
1024; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
1025; CHECK-NEXT:    %m.ext = zext i16 %m to i32
1026; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
1027; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
1028; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
1029; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1030; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
1031; CHECK-NEXT:    %i.next = add i32 %i, 1
1032; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
1033; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1034; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1035; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller
1036; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1037; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1038; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
1039; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1040;
1041entry:
1042  %n.ext = zext i16 %n to i32
1043  %m.ext = zext i16 %m to i32
1044  %m.add = add i32 %m.ext, 65536
1045  br label %loop
1046loop:
1047  %i = phi i32 [0, %entry], [%i.next, %loop]
1048  %i.next = add i32 %i, 1
1049  %cond_p0 = icmp ult i32 %i, %n.ext
1050  %cond_p1 = icmp ult i32 %i, %m.add
1051  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1052  br i1 %cond, label %loop, label %exit
1053exit:
1054  ret i32 %i
1055}
1056
1057define i32 @logical_and_known_smaller_equal(i16 %n, i16 %m) {
1058; CHECK-LABEL: 'logical_and_known_smaller_equal'
1059; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller_equal
1060; CHECK-NEXT:    %n.ext = zext i16 %n to i32
1061; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
1062; CHECK-NEXT:    %m.ext = zext i16 %m to i32
1063; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
1064; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
1065; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
1066; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1067; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
1068; CHECK-NEXT:    %i.next = add i32 %i, 1
1069; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
1070; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1071; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1072; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller_equal
1073; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1074; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1075; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
1076; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1077;
1078entry:
1079  %n.ext = zext i16 %n to i32
1080  %m.ext = zext i16 %m to i32
1081  %m.add = add i32 %m.ext, 65535
1082  br label %loop
1083loop:
1084  %i = phi i32 [0, %entry], [%i.next, %loop]
1085  %i.next = add i32 %i, 1
1086  %cond_p0 = icmp ult i32 %i, %n.ext
1087  %cond_p1 = icmp ult i32 %i, %m.add
1088  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1089  br i1 %cond, label %loop, label %exit
1090exit:
1091  ret i32 %i
1092}
1093
1094define i32 @logical_and_not_known_smaller_equal(i16 %n, i16 %m) {
1095; CHECK-LABEL: 'logical_and_not_known_smaller_equal'
1096; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_smaller_equal
1097; CHECK-NEXT:    %n.ext = zext i16 %n to i32
1098; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
1099; CHECK-NEXT:    %m.ext = zext i16 %m to i32
1100; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
1101; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
1102; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
1103; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1104; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }
1105; CHECK-NEXT:    %i.next = add i32 %i, 1
1106; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }
1107; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1108; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1109; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_smaller_equal
1110; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)
1111; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1112; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)
1113; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1114;
1115entry:
1116  %n.ext = zext i16 %n to i32
1117  %m.ext = zext i16 %m to i32
1118  %m.add = add i32 %m.ext, 65534
1119  br label %loop
1120loop:
1121  %i = phi i32 [0, %entry], [%i.next, %loop]
1122  %i.next = add i32 %i, 1
1123  %cond_p0 = icmp ult i32 %i, %n.ext
1124  %cond_p1 = icmp ult i32 %i, %m.add
1125  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1126  br i1 %cond, label %loop, label %exit
1127exit:
1128  ret i32 %i
1129}
1130
1131define i32 @logical_and_known_greater(i16 %n, i16 %m) {
1132; CHECK-LABEL: 'logical_and_known_greater'
1133; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater
1134; CHECK-NEXT:    %n.ext = zext i16 %n to i32
1135; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
1136; CHECK-NEXT:    %m.ext = zext i16 %m to i32
1137; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
1138; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
1139; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
1140; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1141; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
1142; CHECK-NEXT:    %i.next = add i32 %i, 1
1143; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
1144; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1145; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1146; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater
1147; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1148; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1149; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
1150; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1151;
1152entry:
1153  %n.ext = zext i16 %n to i32
1154  %m.ext = zext i16 %m to i32
1155  %m.add = add i32 %m.ext, 65536
1156  br label %loop
1157loop:
1158  %i = phi i32 [0, %entry], [%i.next, %loop]
1159  %i.next = add i32 %i, 1
1160  %cond_p0 = icmp ult i32 %i, %m.add
1161  %cond_p1 = icmp ult i32 %i, %n.ext
1162  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1163  br i1 %cond, label %loop, label %exit
1164exit:
1165  ret i32 %i
1166}
1167
1168define i32 @logical_and_known_greater_equal(i16 %n, i16 %m) {
1169; CHECK-LABEL: 'logical_and_known_greater_equal'
1170; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater_equal
1171; CHECK-NEXT:    %n.ext = zext i16 %n to i32
1172; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
1173; CHECK-NEXT:    %m.ext = zext i16 %m to i32
1174; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
1175; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
1176; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
1177; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1178; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
1179; CHECK-NEXT:    %i.next = add i32 %i, 1
1180; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
1181; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1182; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1183; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater_equal
1184; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1185; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1186; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
1187; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1188;
1189entry:
1190  %n.ext = zext i16 %n to i32
1191  %m.ext = zext i16 %m to i32
1192  %m.add = add i32 %m.ext, 65535
1193  br label %loop
1194loop:
1195  %i = phi i32 [0, %entry], [%i.next, %loop]
1196  %i.next = add i32 %i, 1
1197  %cond_p0 = icmp ult i32 %i, %m.add
1198  %cond_p1 = icmp ult i32 %i, %n.ext
1199  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1200  br i1 %cond, label %loop, label %exit
1201exit:
1202  ret i32 %i
1203}
1204
1205define i32 @logical_and_not_known_greater_equal(i16 %n, i16 %m) {
1206; CHECK-LABEL: 'logical_and_not_known_greater_equal'
1207; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_greater_equal
1208; CHECK-NEXT:    %n.ext = zext i16 %n to i32
1209; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
1210; CHECK-NEXT:    %m.ext = zext i16 %m to i32
1211; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
1212; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
1213; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
1214; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1215; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }
1216; CHECK-NEXT:    %i.next = add i32 %i, 1
1217; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,65537) S: [1,65537) Exits: (1 + ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }
1218; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1219; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1220; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_greater_equal
1221; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
1222; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1223; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
1224; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1225;
1226entry:
1227  %n.ext = zext i16 %n to i32
1228  %m.ext = zext i16 %m to i32
1229  %m.add = add i32 %m.ext, 65534
1230  br label %loop
1231loop:
1232  %i = phi i32 [0, %entry], [%i.next, %loop]
1233  %i.next = add i32 %i, 1
1234  %cond_p0 = icmp ult i32 %i, %m.add
1235  %cond_p1 = icmp ult i32 %i, %n.ext
1236  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1237  br i1 %cond, label %loop, label %exit
1238exit:
1239  ret i32 %i
1240}
1241
1242define i32 @logical_and_zero_arg1(i32 %n) {
1243; CHECK-LABEL: 'logical_and_zero_arg1'
1244; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg1
1245; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1246; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
1247; CHECK-NEXT:    %i.next = add i32 %i, 1
1248; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
1249; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1250; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
1251; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg1
1252; CHECK-NEXT:  Loop %loop: backedge-taken count is i32 0
1253; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 0
1254; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 0
1255; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1256;
1257entry:
1258  br label %loop
1259loop:
1260  %i = phi i32 [0, %entry], [%i.next, %loop]
1261  %i.next = add i32 %i, 1
1262  %cond_p0 = icmp ult i32 %i, 0
1263  %cond_p1 = icmp ult i32 %i, %n
1264  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1265  br i1 %cond, label %loop, label %exit
1266exit:
1267  ret i32 %i
1268}
1269
1270define i32 @logical_and_zero_arg2(i32 %n) {
1271; CHECK-LABEL: 'logical_and_zero_arg2'
1272; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg2
1273; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1274; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
1275; CHECK-NEXT:    %i.next = add i32 %i, 1
1276; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
1277; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1278; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
1279; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg2
1280; CHECK-NEXT:  Loop %loop: backedge-taken count is i32 0
1281; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 0
1282; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 0
1283; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1284;
1285entry:
1286  br label %loop
1287loop:
1288  %i = phi i32 [0, %entry], [%i.next, %loop]
1289  %i.next = add i32 %i, 1
1290  %cond_p0 = icmp ult i32 %i, %n
1291  %cond_p1 = icmp ult i32 %i, 0
1292  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1293  br i1 %cond, label %loop, label %exit
1294exit:
1295  ret i32 %i
1296}
1297
1298
1299declare i32 @llvm.umin.i32(i32, i32)
1300