xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-select-safe.ll (revision 0d38f21e4ab7fe7cebe76a9d7c218ec54dba1e98)
16a563e25SRoman Lebedev; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
26a563e25SRoman Lebedev; RUN: opt -disable-output "-passes=print<scalar-evolution>" %s 2>&1 | FileCheck %s
36a563e25SRoman Lebedev
46a563e25SRoman Lebedevdefine i32 @logical_and_2ops(i32 %n, i32 %m) {
56a563e25SRoman Lebedev; CHECK-LABEL: 'logical_and_2ops'
66a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops
76a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
876a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
96a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1076a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
116a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
1216bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
136a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops
1476a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
157755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
16e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
1788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
186a563e25SRoman Lebedev;
196a563e25SRoman Lebedeventry:
206a563e25SRoman Lebedev  br label %loop
216a563e25SRoman Lebedevloop:
226a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
236a563e25SRoman Lebedev  %i.next = add i32 %i, 1
246a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
256a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
266a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
276a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
286a563e25SRoman Lebedevexit:
296a563e25SRoman Lebedev  ret i32 %i
306a563e25SRoman Lebedev}
316a563e25SRoman Lebedev
326a563e25SRoman Lebedevdefine i32 @logical_or_2ops(i32 %n, i32 %m) {
336a563e25SRoman Lebedev; CHECK-LABEL: 'logical_or_2ops'
346a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_2ops
356a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
3676a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
376a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
3876a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
396a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
4049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
416a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_2ops
4276a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
437755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
44e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
4588f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
466a563e25SRoman Lebedev;
476a563e25SRoman Lebedeventry:
486a563e25SRoman Lebedev  br label %loop
496a563e25SRoman Lebedevloop:
506a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
516a563e25SRoman Lebedev  %i.next = add i32 %i, 1
526a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
536a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
546a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
556a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
566a563e25SRoman Lebedevexit:
576a563e25SRoman Lebedev  ret i32 %i
586a563e25SRoman Lebedev}
596a563e25SRoman Lebedev
606a563e25SRoman Lebedevdefine i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
616a563e25SRoman Lebedev; CHECK-LABEL: 'logical_and_3ops'
626a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_3ops
636a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
6476a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
656a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
6676a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
676a563e25SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
6816bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
696a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
7016bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
716a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_3ops
7276a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
737755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
74e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
7588f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
766a563e25SRoman Lebedev;
776a563e25SRoman Lebedeventry:
786a563e25SRoman Lebedev  br label %loop
796a563e25SRoman Lebedevloop:
806a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
816a563e25SRoman Lebedev  %i.next = add i32 %i, 1
826a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
836a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
846a563e25SRoman Lebedev  %cond_p2 = icmp ult i32 %i, %k
856a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
866a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
876a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
886a563e25SRoman Lebedevexit:
896a563e25SRoman Lebedev  ret i32 %i
906a563e25SRoman Lebedev}
916a563e25SRoman Lebedev
926a563e25SRoman Lebedevdefine i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
936a563e25SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops'
946a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops
956a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
9676a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
976a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
9876a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
996a563e25SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
10049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1016a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
10249d9acc2SRoman Lebedev; 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 }
1036a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops
10476a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
1057755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
106e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
10788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1086a563e25SRoman Lebedev;
1096a563e25SRoman Lebedeventry:
1106a563e25SRoman Lebedev  br label %loop
1116a563e25SRoman Lebedevloop:
1126a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
1136a563e25SRoman Lebedev  %i.next = add i32 %i, 1
1146a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
1156a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
1166a563e25SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
1176a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
1186a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
1196a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
1206a563e25SRoman Lebedevexit:
1216a563e25SRoman Lebedev  ret i32 %i
1226a563e25SRoman Lebedev}
123e0772cf0SRoman Lebedev
12436075942SRoman Lebedevdefine i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) {
12536075942SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_duplicate'
12636075942SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_duplicate
12736075942SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1285e166507SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
12936075942SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1305e166507SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
13136075942SRoman Lebedev; CHECK-NEXT:    %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
13249d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
13336075942SRoman Lebedev; CHECK-NEXT:    %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
1348a3efcd4SFlorian Hahn; 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 }
13536075942SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
1368a3efcd4SFlorian Hahn; 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 }
13736075942SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_duplicate
1385e166507SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
1397755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
140e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
14188f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
14236075942SRoman Lebedev;
14336075942SRoman Lebedeventry:
14436075942SRoman Lebedev  br label %loop
14536075942SRoman Lebedevloop:
14636075942SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
14736075942SRoman Lebedev  %i.next = add i32 %i, 1
14836075942SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
14936075942SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
15036075942SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %n
15136075942SRoman Lebedev  %cond_p3 = icmp uge i32 %i, %k
15236075942SRoman Lebedev  %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
15336075942SRoman Lebedev  %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
15436075942SRoman Lebedev  %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
15536075942SRoman Lebedev  br i1 %cond, label %exit, label %loop
15636075942SRoman Lebedevexit:
15736075942SRoman Lebedev  ret i32 %i
15836075942SRoman Lebedev}
15936075942SRoman Lebedev
160138d5c75SRoman Lebedevdefine i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) {
161138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand'
162138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand
163138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1645ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
165138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1665ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
167138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
168138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
169138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
1703b70387cSYingwei Zheng; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
171138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
1723b70387cSYingwei Zheng; 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 }
173138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand
1745ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
1757755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
176e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)
17788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
178138d5c75SRoman Lebedev;
179138d5c75SRoman Lebedeventry:
180138d5c75SRoman Lebedev  br label %loop
181138d5c75SRoman Lebedevloop:
182138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
183138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
184138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
185138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
186138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %n
187138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
188138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
189138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
190138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
191138d5c75SRoman Lebedevexit:
192138d5c75SRoman Lebedev  ret i32 %i
193138d5c75SRoman Lebedev}
194138d5c75SRoman Lebedev
195138d5c75SRoman Lebedevdefine i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) {
196138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand'
197138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_umin_operand
198138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1995ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable }
200138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2015ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable }
202138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
203138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
204138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
20549d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
206138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
20749d9acc2SRoman Lebedev; 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 }
208138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand
2095ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m)
2107755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
211e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %k umin_seq %m)
21288f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
213138d5c75SRoman Lebedev;
214138d5c75SRoman Lebedeventry:
215138d5c75SRoman Lebedev  br label %loop
216138d5c75SRoman Lebedevloop:
217138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
218138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
219138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
220138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
221138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
222138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin
223138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
224138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
225138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
226138d5c75SRoman Lebedevexit:
227138d5c75SRoman Lebedev  ret i32 %i
228138d5c75SRoman Lebedev}
229b2be7dcfSRoman Lebedev
230138d5c75SRoman Lebedevdefine i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) {
231138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins'
232138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins
233138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2345ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k umin_seq %q) LoopDispositions: { %loop: Computable }
235138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2365ceb070bSRoman Lebedev; 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 }
237138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
238138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
239138d5c75SRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
240138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant }
241138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
24249d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
243138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
24449d9acc2SRoman Lebedev; 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 }
245138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins
2465ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
2477755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
248e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
24988f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
250138d5c75SRoman Lebedev;
251138d5c75SRoman Lebedeventry:
252138d5c75SRoman Lebedev  br label %loop
253138d5c75SRoman Lebedevloop:
254138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
255138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
256138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
257138d5c75SRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
258138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
259138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
260138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin2
261138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
262138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
263138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
264138d5c75SRoman Lebedevexit:
265138d5c75SRoman Lebedev  ret i32 %i
266138d5c75SRoman Lebedev}
267138d5c75SRoman Lebedev
268b2be7dcfSRoman Lebedevdefine i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) {
269b2be7dcfSRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin'
270b2be7dcfSRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin
271b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2725ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
273b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2745ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
275b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
276b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
277b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
278b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant }
279b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
28049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
281b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
28249d9acc2SRoman Lebedev; 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 }
283b2be7dcfSRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin
2845ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
2857755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
286e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)
28788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
288b2be7dcfSRoman Lebedev;
289b2be7dcfSRoman Lebedeventry:
290b2be7dcfSRoman Lebedev  br label %loop
291b2be7dcfSRoman Lebedevloop:
292b2be7dcfSRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
293b2be7dcfSRoman Lebedev  %i.next = add i32 %i, 1
294b2be7dcfSRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
295b2be7dcfSRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
296b2be7dcfSRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
297b2be7dcfSRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
298b2be7dcfSRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin2
299b2be7dcfSRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
300b2be7dcfSRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
301b2be7dcfSRoman Lebedev  br i1 %cond, label %exit, label %loop
302b2be7dcfSRoman Lebedevexit:
303b2be7dcfSRoman Lebedev  ret i32 %i
304b2be7dcfSRoman Lebedev}
305b2be7dcfSRoman Lebedev
306b2be7dcfSRoman Lebedevdefine i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) {
307b2be7dcfSRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin'
308b2be7dcfSRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_partially_redundant_umin
309b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
3105ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable }
311b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
3125ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable }
313b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
314b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
315b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
316b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant }
317b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
31849d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
319b2be7dcfSRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin
3205ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k))
3217755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
322e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%m umin %k))
32388f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
324b2be7dcfSRoman Lebedev;
325b2be7dcfSRoman Lebedeventry:
326b2be7dcfSRoman Lebedev  br label %loop
327b2be7dcfSRoman Lebedevloop:
328b2be7dcfSRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
329b2be7dcfSRoman Lebedev  %i.next = add i32 %i, 1
330b2be7dcfSRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
331b2be7dcfSRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
332b2be7dcfSRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
333b2be7dcfSRoman Lebedev  %cond_p1 = icmp uge i32 %i, %umin2
334b2be7dcfSRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
335b2be7dcfSRoman Lebedev  br i1 %cond, label %exit, label %loop
336b2be7dcfSRoman Lebedevexit:
337b2be7dcfSRoman Lebedev  ret i32 %i
338b2be7dcfSRoman Lebedev}
339b2be7dcfSRoman Lebedev
3402c0c6195SRoman Lebedevdefine i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
3412c0c6195SRoman Lebedev; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq'
3422c0c6195SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
3432c0c6195SRoman Lebedev; CHECK-NEXT:    %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ]
3442c0c6195SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%first.loop> U: full-set S: full-set Exits: (%e umin_seq %d umin_seq %a) LoopDispositions: { %first.loop: Computable }
3452c0c6195SRoman Lebedev; CHECK-NEXT:    %first.i.next = add i32 %first.i, 1
3462c0c6195SRoman Lebedev; 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 }
3472c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
34849d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }
3492c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
35049d9acc2SRoman Lebedev; 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 }
3512c0c6195SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ]
352c86a982dSRoman Lebedev; 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 }
3532c0c6195SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
354c86a982dSRoman Lebedev; 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 }
3552c0c6195SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
3562c0c6195SRoman Lebedev; CHECK-NEXT:    --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant }
3572c0c6195SRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
3582c0c6195SRoman Lebedev; 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 }
3592c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
36049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
3612c0c6195SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
36249d9acc2SRoman Lebedev; 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 }
3632c0c6195SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
364c86a982dSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
3657755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
366e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
36788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
3682c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a)
3697755c261SPhilip Reames; CHECK-NEXT:  Loop %first.loop: constant max backedge-taken count is i32 -1
370e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %first.loop: symbolic max backedge-taken count is (%e umin_seq %d umin_seq %a)
37188f7dc17SNikita Popov; CHECK-NEXT:  Loop %first.loop: Trip multiple is 1
3722c0c6195SRoman Lebedev;
3732c0c6195SRoman Lebedeventry:
3742c0c6195SRoman Lebedev  br label %first.loop
3752c0c6195SRoman Lebedevfirst.loop:
3762c0c6195SRoman Lebedev  %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop]
3772c0c6195SRoman Lebedev  %first.i.next = add i32 %first.i, 1
3782c0c6195SRoman Lebedev  %cond_p0 = icmp uge i32 %first.i, %e
3792c0c6195SRoman Lebedev  %cond_p1 = icmp uge i32 %first.i, %d
3802c0c6195SRoman Lebedev  %cond_p2 = icmp uge i32 %first.i, %a
3812c0c6195SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
3822c0c6195SRoman Lebedev  %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
3832c0c6195SRoman Lebedev  br i1 %cond_p4, label %first.loop.exit, label %first.loop
3842c0c6195SRoman Lebedevfirst.loop.exit:
3852c0c6195SRoman Lebedev  br label %loop
3862c0c6195SRoman Lebedevloop:
3872c0c6195SRoman Lebedev  %i = phi i32 [0, %first.loop.exit], [%i.next, %loop]
3882c0c6195SRoman Lebedev  %i.next = add i32 %i, 1
3892c0c6195SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
3902c0c6195SRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
3912c0c6195SRoman Lebedev  %cond_p5 = icmp uge i32 %i, %a
3922c0c6195SRoman Lebedev  %cond_p6 = icmp uge i32 %i, %b
3932c0c6195SRoman Lebedev  %cond_p7 = icmp uge i32 %i, %umin2
3942c0c6195SRoman Lebedev  %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
3952c0c6195SRoman Lebedev  %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
3962c0c6195SRoman Lebedev  br i1 %cond, label %exit, label %loop
3972c0c6195SRoman Lebedevexit:
3982c0c6195SRoman Lebedev  ret i32 %i
3992c0c6195SRoman Lebedev}
4002c0c6195SRoman Lebedev
401f34742d7SRoman Lebedevdefine i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) {
402f34742d7SRoman Lebedev; CHECK-LABEL: 'logical_and_2ops_and_constant'
403f34742d7SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops_and_constant
404f34742d7SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
4057019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable }
406f34742d7SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
4077019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable }
408f34742d7SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
409f34742d7SRoman Lebedev; CHECK-NEXT:    --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant }
410f34742d7SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
4118a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (true + ((true + %cond_p1) umin (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
412f34742d7SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops_and_constant
4138dcba206SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (42 umin %n)
4147755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 42
415e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (42 umin %n)
41688f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
417f34742d7SRoman Lebedev;
418f34742d7SRoman Lebedeventry:
419f34742d7SRoman Lebedev  br label %loop
420f34742d7SRoman Lebedevloop:
421f34742d7SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
422f34742d7SRoman Lebedev  %i.next = add i32 %i, 1
423f34742d7SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
424f34742d7SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
425f34742d7SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %n
426f34742d7SRoman Lebedev  %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
427f34742d7SRoman Lebedev  br i1 %cond, label %exit, label %loop
428f34742d7SRoman Lebedevexit:
429f34742d7SRoman Lebedev  ret i32 %i
430f34742d7SRoman Lebedev}
431f34742d7SRoman Lebedev
432e0772cf0SRoman Lebedevdefine i32 @computeSCEVAtScope(i32 %d.0) {
433e0772cf0SRoman Lebedev; CHECK-LABEL: 'computeSCEVAtScope'
434e0772cf0SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @computeSCEVAtScope
435e0772cf0SRoman Lebedev; CHECK-NEXT:    %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
4365e166507SRoman Lebedev; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
437e0772cf0SRoman Lebedev; CHECK-NEXT:    %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
4385e166507SRoman Lebedev; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
439e0772cf0SRoman Lebedev; CHECK-NEXT:    %0 = select i1 %tobool1, i1 %tobool2, i1 false
44016bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant }
441e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc = add nsw i32 %d.1, 1
4425e166507SRoman Lebedev; CHECK-NEXT:    --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
443e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc3 = add nsw i32 %e.1, 1
4445e166507SRoman Lebedev; CHECK-NEXT:    --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
445e0772cf0SRoman Lebedev; CHECK-NEXT:    %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
4467019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
447e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc8 = add i32 %f.1, 1
4487019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
449e0772cf0SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @computeSCEVAtScope
4505e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond: backedge-taken count is (-1 * %d.0)
4517755c261SPhilip Reames; CHECK-NEXT:  Loop %for.cond: constant max backedge-taken count is i32 -1
452e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %for.cond: symbolic max backedge-taken count is (-1 * %d.0)
45388f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.cond: Trip multiple is 1
454*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %for.cond4: backedge-taken count is i32 0
4557755c261SPhilip Reames; CHECK-NEXT:  Loop %for.cond4: constant max backedge-taken count is i32 0
456*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %for.cond4: symbolic max backedge-taken count is i32 0
45788f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.cond4: Trip multiple is 1
458e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %while.cond: <multiple exits> Unpredictable backedge-taken count.
459211d9411SMax Kazantsev; CHECK-NEXT:  Loop %while.cond: Unpredictable constant max backedge-taken count.
460e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %while.cond: Unpredictable symbolic max backedge-taken count.
461e0772cf0SRoman Lebedev;
462e0772cf0SRoman Lebedeventry:
463e0772cf0SRoman Lebedev  br label %while.cond
464e0772cf0SRoman Lebedev
465e0772cf0SRoman Lebedevwhile.cond.loopexit:                              ; preds = %for.cond4
466e0772cf0SRoman Lebedev  br label %while.cond
467e0772cf0SRoman Lebedev
468e0772cf0SRoman Lebedevwhile.cond:                                       ; preds = %while.cond.loopexit, %entry
469e0772cf0SRoman Lebedev  br label %for.cond.preheader
470e0772cf0SRoman Lebedev
471e0772cf0SRoman Lebedevfor.cond.preheader:                               ; preds = %while.cond
472e0772cf0SRoman Lebedev  br label %for.cond
473e0772cf0SRoman Lebedev
474e0772cf0SRoman Lebedevfor.cond:                                         ; preds = %for.body, %for.cond.preheader
475e0772cf0SRoman Lebedev  %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
476e0772cf0SRoman Lebedev  %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
477e0772cf0SRoman Lebedev  %tobool1 = icmp ne i32 %e.1, 0
478e0772cf0SRoman Lebedev  %tobool2 = icmp ne i32 %d.1, 0
479e0772cf0SRoman Lebedev  %0 = select i1 %tobool1, i1 %tobool2, i1 false
480e0772cf0SRoman Lebedev  br i1 %0, label %for.body, label %for.cond4.preheader
481e0772cf0SRoman Lebedev
482e0772cf0SRoman Lebedevfor.cond4.preheader:                              ; preds = %for.cond
483e0772cf0SRoman Lebedev  br label %for.cond4
484e0772cf0SRoman Lebedev
485e0772cf0SRoman Lebedevfor.body:                                         ; preds = %for.cond
486e0772cf0SRoman Lebedev  %inc = add nsw i32 %d.1, 1
487e0772cf0SRoman Lebedev  %inc3 = add nsw i32 %e.1, 1
488e0772cf0SRoman Lebedev  br label %for.cond
489e0772cf0SRoman Lebedev
490e0772cf0SRoman Lebedevfor.cond4:                                        ; preds = %for.body5, %for.cond4.preheader
491e0772cf0SRoman Lebedev  %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
492e0772cf0SRoman Lebedev  %exitcond.not = icmp eq i32 %f.1, %e.1
493e0772cf0SRoman Lebedev  br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5
494e0772cf0SRoman Lebedev
495e0772cf0SRoman Lebedevfor.body5:                                        ; preds = %for.cond4
496e0772cf0SRoman Lebedev  %inc8 = add i32 %f.1, 1
497e0772cf0SRoman Lebedev  br label %for.cond4
498e0772cf0SRoman Lebedev}
499138d5c75SRoman Lebedev
50092619956SNikita Popovdefine i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, ptr %ptr) {
501f14b5751SRoman Lebedev; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity'
502f14b5751SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @uminseq_vs_ptrtoint_complexity
503f14b5751SRoman Lebedev; CHECK-NEXT:    %i = phi i64 [ 0, %entry ], [ %i.next, %loop ]
504f14b5751SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
505f14b5751SRoman Lebedev; CHECK-NEXT:    %i.next = add i64 %i, 1
506f14b5751SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
507f14b5751SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
50816bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
50992619956SNikita Popov; CHECK-NEXT:    %ptr.int = ptrtoint ptr %ptr to i64
51092619956SNikita Popov; CHECK-NEXT:    --> (ptrtoint ptr %ptr to i64) U: full-set S: full-set
511f14b5751SRoman Lebedev; CHECK-NEXT:    %r = add i64 %i, %ptr.int
51292619956SNikita Popov; 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
513f14b5751SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity
514f14b5751SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
5157755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i64 -1
516e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
51788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
518f14b5751SRoman Lebedev;
519f14b5751SRoman Lebedeventry:
520f14b5751SRoman Lebedev  br label %loop
521f14b5751SRoman Lebedevloop:
522f14b5751SRoman Lebedev  %i = phi i64 [0, %entry], [%i.next, %loop]
523f14b5751SRoman Lebedev  %i.next = add i64 %i, 1
524f14b5751SRoman Lebedev  %cond_p0 = icmp ult i64 %i, %n
525f14b5751SRoman Lebedev  %cond_p1 = icmp ult i64 %i, %m
526f14b5751SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
527f14b5751SRoman Lebedev  br i1 %cond, label %loop, label %exit
528f14b5751SRoman Lebedevexit:
52992619956SNikita Popov  %ptr.int = ptrtoint ptr %ptr to i64
530f14b5751SRoman Lebedev  %r = add i64 %i, %ptr.int
531f14b5751SRoman Lebedev  ret i64 %r
532f14b5751SRoman Lebedev}
533f14b5751SRoman Lebedev
534b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison1(i32 %n) {
535b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison1'
536b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison1
537b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
538b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
539b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
54047c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
541b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
54247c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
543b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
5448a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
545b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison1
54647c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
5477755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
548e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)
54988f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
550b62e9f63SNikita Popov;
551b62e9f63SNikita Popoventry:
552b62e9f63SNikita Popov  %add = add i32 %n, 1
553b62e9f63SNikita Popov  br label %loop
554b62e9f63SNikita Popovloop:
555b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
556b62e9f63SNikita Popov  %i.next = add i32 %i, 1
557b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
558b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
559b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
560b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
561b62e9f63SNikita Popovexit:
562b62e9f63SNikita Popov  ret i32 %i
563b62e9f63SNikita Popov}
564b62e9f63SNikita Popov
565b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison2(i32 %n) {
566b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison2'
567b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison2
568b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
569b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
570b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
57147c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
572b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
57347c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
574b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
5758a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
576b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison2
57747c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
5787755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
579e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)
58088f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
581b62e9f63SNikita Popov;
582b62e9f63SNikita Popoventry:
583b62e9f63SNikita Popov  %add = add i32 %n, 1
584b62e9f63SNikita Popov  br label %loop
585b62e9f63SNikita Popovloop:
586b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
587b62e9f63SNikita Popov  %i.next = add i32 %i, 1
588b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
589b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
590b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
591b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
592b62e9f63SNikita Popovexit:
593b62e9f63SNikita Popov  ret i32 %i
594b62e9f63SNikita Popov}
595b62e9f63SNikita Popov
596b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison3(i32 %n, i32 %m) {
597b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison3'
598b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison3
599b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
600b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
601b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
60247c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable }
603b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
60447c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable }
605b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
6068a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
607b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison3
60847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin %n)
6097755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
610e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin %n)
61188f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
612b62e9f63SNikita Popov;
613b62e9f63SNikita Popoventry:
614b62e9f63SNikita Popov  %add = add i32 %n, %m
615b62e9f63SNikita Popov  br label %loop
616b62e9f63SNikita Popovloop:
617b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
618b62e9f63SNikita Popov  %i.next = add i32 %i, 1
619b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
620b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
621b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
622b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
623b62e9f63SNikita Popovexit:
624b62e9f63SNikita Popov  ret i32 %i
625b62e9f63SNikita Popov}
626b62e9f63SNikita Popov
627b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) {
628b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction'
629b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_wrong_direction
630b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
631b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
632b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
633b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable }
634b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
635b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable }
636b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
637b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
638b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_wrong_direction
639b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%n + %m))
6407755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
641e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%n + %m))
64288f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
643b62e9f63SNikita Popov;
644b62e9f63SNikita Popoventry:
645b62e9f63SNikita Popov  %add = add i32 %n, %m
646b62e9f63SNikita Popov  br label %loop
647b62e9f63SNikita Popovloop:
648b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
649b62e9f63SNikita Popov  %i.next = add i32 %i, 1
650b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
651b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
652b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
653b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
654b62e9f63SNikita Popovexit:
655b62e9f63SNikita Popov  ret i32 %i
656b62e9f63SNikita Popov}
657b62e9f63SNikita Popov
658b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) {
659b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_noundef'
660b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef
661b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
66247c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable }
663b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
66447c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable }
665b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
6668a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
667b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef
66847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin %m)
6697755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
670e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin %m)
67188f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
672b62e9f63SNikita Popov;
673b62e9f63SNikita Popoventry:
674b62e9f63SNikita Popov  br label %loop
675b62e9f63SNikita Popovloop:
676b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
677b62e9f63SNikita Popov  %i.next = add i32 %i, 1
678b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
679b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
680b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
681b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
682b62e9f63SNikita Popovexit:
683b62e9f63SNikita Popov  ret i32 %i
684b62e9f63SNikita Popov}
685b62e9f63SNikita Popov
686b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) {
687b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction'
688b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction
689b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
690b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable }
691b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
692b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable }
693b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
694b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
695b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction
696b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq %n)
6977755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
698e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq %n)
69988f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
700b62e9f63SNikita Popov;
701b62e9f63SNikita Popoventry:
702b62e9f63SNikita Popov  br label %loop
703b62e9f63SNikita Popovloop:
704b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
705b62e9f63SNikita Popov  %i.next = add i32 %i, 1
706b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
707b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
708b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
709b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
710b62e9f63SNikita Popovexit:
711b62e9f63SNikita Popov  ret i32 %i
712b62e9f63SNikita Popov}
713b62e9f63SNikita Popov
7142f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) {
7152f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex1'
7162f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex1
717b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
718b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
719b62e9f63SNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, 1
720b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n + %m) U: full-set S: full-set
721b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
72247c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable }
723b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
72447c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable }
725b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7268a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
7272f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex1
72847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m))
7297755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
730e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (1 + %n + %m))
73188f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
732b62e9f63SNikita Popov;
733b62e9f63SNikita Popoventry:
734b62e9f63SNikita Popov  %add = add i32 %n, %m
735b62e9f63SNikita Popov  %add1 = add i32 %add, 1
736b62e9f63SNikita Popov  br label %loop
737b62e9f63SNikita Popovloop:
738b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
739b62e9f63SNikita Popov  %i.next = add i32 %i, 1
7402f64a6cfSNikita Popov  %cond_p0 = icmp ult i32 %i, %add1
7412f64a6cfSNikita Popov  %cond_p1 = icmp ult i32 %i, %add
7422f64a6cfSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7432f64a6cfSNikita Popov  br i1 %cond, label %loop, label %exit
7442f64a6cfSNikita Popovexit:
7452f64a6cfSNikita Popov  ret i32 %i
7462f64a6cfSNikita Popov}
7472f64a6cfSNikita Popov
7482f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) {
7492f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex2'
7502f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex2
7512f64a6cfSNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
7522f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
7532f64a6cfSNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, %l
7542f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
7552f64a6cfSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
75647c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable }
7572f64a6cfSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
75847c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable }
7592f64a6cfSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7608a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
7612f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex2
76247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l))
7637755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
764e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (%n + %m + %l))
76588f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
7662f64a6cfSNikita Popov;
7672f64a6cfSNikita Popoventry:
7682f64a6cfSNikita Popov  %add = add i32 %n, %m
7692f64a6cfSNikita Popov  %add1 = add i32 %add, %l
7702f64a6cfSNikita Popov  br label %loop
7712f64a6cfSNikita Popovloop:
7722f64a6cfSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
7732f64a6cfSNikita Popov  %i.next = add i32 %i, 1
7742f64a6cfSNikita Popov  %cond_p0 = icmp ult i32 %i, %add1
7752f64a6cfSNikita Popov  %cond_p1 = icmp ult i32 %i, %add
7762f64a6cfSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7772f64a6cfSNikita Popov  br i1 %cond, label %loop, label %exit
7782f64a6cfSNikita Popovexit:
7792f64a6cfSNikita Popov  ret i32 %i
7802f64a6cfSNikita Popov}
7812f64a6cfSNikita Popov
7822f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) {
7832f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction'
7842f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction
7852f64a6cfSNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
7862f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
7872f64a6cfSNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, %l
7882f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
7892f64a6cfSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
7902f64a6cfSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable }
7912f64a6cfSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
7922f64a6cfSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable }
7932f64a6cfSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7942f64a6cfSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
7952f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction
7962f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
7977755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
798e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
79988f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
8002f64a6cfSNikita Popov;
8012f64a6cfSNikita Popoventry:
8022f64a6cfSNikita Popov  %add = add i32 %n, %m
8032f64a6cfSNikita Popov  %add1 = add i32 %add, %l
8042f64a6cfSNikita Popov  br label %loop
8052f64a6cfSNikita Popovloop:
8062f64a6cfSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
8072f64a6cfSNikita Popov  %i.next = add i32 %i, 1
808b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
809b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add1
810b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
811b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
812b62e9f63SNikita Popovexit:
813b62e9f63SNikita Popov  ret i32 %i
814b62e9f63SNikita Popov}
815b62e9f63SNikita Popov
816b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) {
817b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops'
818b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops
819b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
820b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
821b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
82247c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable }
823b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
82447c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable }
825b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8268a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
827b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
8288a3efcd4SFlorian Hahn; CHECK-NEXT:    --> ((%cond_p0 umin %cond_p1) umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
829b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops
83047c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
8317755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
832e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
83388f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
834b62e9f63SNikita Popov;
835b62e9f63SNikita Popoventry:
836b62e9f63SNikita Popov  %add = add i32 %n, 1
837b62e9f63SNikita Popov  br label %loop
838b62e9f63SNikita Popovloop:
839b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
840b62e9f63SNikita Popov  %i.next = add i32 %i, 1
841b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
842b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
843b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %m
844b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
845b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
846b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
847b62e9f63SNikita Popovexit:
848b62e9f63SNikita Popov  ret i32 %i
849b62e9f63SNikita Popov}
850b62e9f63SNikita Popov
851b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) {
852b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops2'
853b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops2
854b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
855b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
856b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
8578a3efcd4SFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq ((1 + %n) umin %m)) LoopDispositions: { %loop: Computable }
858b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
8598a3efcd4SFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq ((1 + %n) umin %m))) LoopDispositions: { %loop: Computable }
860b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
861b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
862b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
8638a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin_seq (%cond_p1 umin %cond_p2)) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
864b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops2
8658a3efcd4SFlorian Hahn; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
8667755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
8678a3efcd4SFlorian Hahn; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
86888f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
869b62e9f63SNikita Popov;
870b62e9f63SNikita Popoventry:
871b62e9f63SNikita Popov  %add = add i32 %n, 1
872b62e9f63SNikita Popov  br label %loop
873b62e9f63SNikita Popovloop:
874b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
875b62e9f63SNikita Popov  %i.next = add i32 %i, 1
876b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
877b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
878b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %add
879b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
880b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
881b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
882b62e9f63SNikita Popovexit:
883b62e9f63SNikita Popov  ret i32 %i
884b62e9f63SNikita Popov}
885b62e9f63SNikita Popov
886b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) {
887b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops3'
888b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops3
889b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
890b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
891b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
89247c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
893b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
89447c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable }
895b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
896b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
897b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
898b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
899b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops3
90047c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
9017755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
902e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
90388f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
904b62e9f63SNikita Popov;
905b62e9f63SNikita Popoventry:
906b62e9f63SNikita Popov  %add = add i32 %n, 1
907b62e9f63SNikita Popov  br label %loop
908b62e9f63SNikita Popovloop:
909b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
910b62e9f63SNikita Popov  %i.next = add i32 %i, 1
911b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
912b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
913b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %add
914b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
915b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
916b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
917b62e9f63SNikita Popovexit:
918b62e9f63SNikita Popov  ret i32 %i
919b62e9f63SNikita Popov}
920b62e9f63SNikita Popov
92133f02de5SNikita Popovdefine i32 @logical_and_not_zero(i16 %n, i32 %m) {
92233f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero'
92333f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero
92433f02de5SNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
92533f02de5SNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
92633f02de5SNikita Popov; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
92733f02de5SNikita Popov; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
92833f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
9297019624eSFlorian Hahn; 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 }
93033f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
9317019624eSFlorian Hahn; 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 }
93233f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
93333f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
93433f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero
93518eaff15SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
9367755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65536
937e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
93888f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
93933f02de5SNikita Popov;
94033f02de5SNikita Popoventry:
94133f02de5SNikita Popov  %n.ext = zext i16 %n to i32
94233f02de5SNikita Popov  %n1 = add i32 %n.ext, 1
94333f02de5SNikita Popov  br label %loop
94433f02de5SNikita Popovloop:
94533f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
94633f02de5SNikita Popov  %i.next = add i32 %i, 1
94733f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %n1
94833f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
94933f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
95033f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
95133f02de5SNikita Popovexit:
95233f02de5SNikita Popov  ret i32 %i
95333f02de5SNikita Popov}
95433f02de5SNikita Popov
95533f02de5SNikita Popovdefine i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) {
95633f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero_wrong_order'
95733f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_wrong_order
95833f02de5SNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
95933f02de5SNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
96033f02de5SNikita Popov; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
96133f02de5SNikita Popov; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
96233f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
9637019624eSFlorian Hahn; 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 }
96433f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
9657019624eSFlorian Hahn; 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 }
96633f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
96733f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
96833f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_wrong_order
96933f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
9707755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65536
971e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
97288f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
97333f02de5SNikita Popov;
97433f02de5SNikita Popoventry:
97533f02de5SNikita Popov  %n.ext = zext i16 %n to i32
97633f02de5SNikita Popov  %n1 = add i32 %n.ext, 1
97733f02de5SNikita Popov  br label %loop
97833f02de5SNikita Popovloop:
97933f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
98033f02de5SNikita Popov  %i.next = add i32 %i, 1
98133f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
98233f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %n1
98333f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
98433f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
98533f02de5SNikita Popovexit:
98633f02de5SNikita Popov  ret i32 %i
98733f02de5SNikita Popov}
98833f02de5SNikita Popov
98933f02de5SNikita Popovdefine i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) {
99033f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero_needs_context'
99133f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_needs_context
99233f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
99333f02de5SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
99433f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
99533f02de5SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
99633f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
99733f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
99833f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_needs_context
99933f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
10007755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 -1
1001e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
100288f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
100333f02de5SNikita Popov;
100433f02de5SNikita Popoventry:
100533f02de5SNikita Popov  %cmp = icmp ne i32 %n, 0
100633f02de5SNikita Popov  br i1 %cmp, label %loop, label %guard.fail
100733f02de5SNikita Popovloop:
100833f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
100933f02de5SNikita Popov  %i.next = add i32 %i, 1
101033f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
101133f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
101233f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
101333f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
101433f02de5SNikita Popovexit:
101533f02de5SNikita Popov  ret i32 %i
101633f02de5SNikita Popovguard.fail:
101733f02de5SNikita Popov  ret i32 -1
101833f02de5SNikita Popov}
101933f02de5SNikita Popov
10207dddf12fSNikita Popovdefine i32 @logical_and_known_smaller(i16 %n, i16 %m) {
10217dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_smaller'
10227dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller
10237dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
10247dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
10257dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
10267dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
10277dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
10287dddf12fSNikita Popov; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
10297dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
10307019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
10317dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
10327019624eSFlorian Hahn; 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 }
10337dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10347dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
10357dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller
103668e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
10377755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1038e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
103988f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
10407dddf12fSNikita Popov;
10417dddf12fSNikita Popoventry:
10427dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
10437dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
10447dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65536
10457dddf12fSNikita Popov  br label %loop
10467dddf12fSNikita Popovloop:
10477dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
10487dddf12fSNikita Popov  %i.next = add i32 %i, 1
10497dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
10507dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
10517dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10527dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
10537dddf12fSNikita Popovexit:
10547dddf12fSNikita Popov  ret i32 %i
10557dddf12fSNikita Popov}
10567dddf12fSNikita Popov
10577dddf12fSNikita Popovdefine i32 @logical_and_known_smaller_equal(i16 %n, i16 %m) {
10587dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_smaller_equal'
10597dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller_equal
10607dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
10617dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
10627dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
10637dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
10647dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
10657dddf12fSNikita Popov; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
10667dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
10677019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
10687dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
10697019624eSFlorian Hahn; 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 }
10707dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10717dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
10727dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller_equal
107368e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
10747755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1075e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
107688f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
10777dddf12fSNikita Popov;
10787dddf12fSNikita Popoventry:
10797dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
10807dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
10817dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65535
10827dddf12fSNikita Popov  br label %loop
10837dddf12fSNikita Popovloop:
10847dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
10857dddf12fSNikita Popov  %i.next = add i32 %i, 1
10867dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
10877dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
10887dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10897dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
10907dddf12fSNikita Popovexit:
10917dddf12fSNikita Popov  ret i32 %i
10927dddf12fSNikita Popov}
10937dddf12fSNikita Popov
10947dddf12fSNikita Popovdefine i32 @logical_and_not_known_smaller_equal(i16 %n, i16 %m) {
10957dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_not_known_smaller_equal'
10967dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_smaller_equal
10977dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
10987dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
10997dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11007dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11017dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
11027dddf12fSNikita Popov; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
11037dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11047019624eSFlorian Hahn; 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 }
11057dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11067019624eSFlorian Hahn; 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 }
11077dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11087dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11097dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_smaller_equal
11107dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)
11117755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1112e5fa7eb1SMax Kazantsev; 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>)
111388f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
11147dddf12fSNikita Popov;
11157dddf12fSNikita Popoventry:
11167dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11177dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11187dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65534
11197dddf12fSNikita Popov  br label %loop
11207dddf12fSNikita Popovloop:
11217dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11227dddf12fSNikita Popov  %i.next = add i32 %i, 1
11237dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
11247dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
11257dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11267dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11277dddf12fSNikita Popovexit:
11287dddf12fSNikita Popov  ret i32 %i
11297dddf12fSNikita Popov}
11307dddf12fSNikita Popov
11317dddf12fSNikita Popovdefine i32 @logical_and_known_greater(i16 %n, i16 %m) {
11327dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_greater'
11337dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater
11347dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
11357dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
11367dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11377dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11387dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
11397dddf12fSNikita Popov; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
11407dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11417019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
11427dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11437019624eSFlorian Hahn; 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 }
11447dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11457dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11467dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater
11477dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
11487755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1149e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
115088f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
11517dddf12fSNikita Popov;
11527dddf12fSNikita Popoventry:
11537dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11547dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11557dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65536
11567dddf12fSNikita Popov  br label %loop
11577dddf12fSNikita Popovloop:
11587dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11597dddf12fSNikita Popov  %i.next = add i32 %i, 1
11607dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
11617dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
11627dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11637dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11647dddf12fSNikita Popovexit:
11657dddf12fSNikita Popov  ret i32 %i
11667dddf12fSNikita Popov}
11677dddf12fSNikita Popov
11687dddf12fSNikita Popovdefine i32 @logical_and_known_greater_equal(i16 %n, i16 %m) {
11697dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_greater_equal'
11707dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater_equal
11717dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
11727dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
11737dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11747dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11757dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
11767dddf12fSNikita Popov; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
11777dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11787019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
11797dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11807019624eSFlorian Hahn; 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 }
11817dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11827dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11837dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater_equal
11847dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
11857755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1186e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
118788f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
11887dddf12fSNikita Popov;
11897dddf12fSNikita Popoventry:
11907dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11917dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11927dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65535
11937dddf12fSNikita Popov  br label %loop
11947dddf12fSNikita Popovloop:
11957dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11967dddf12fSNikita Popov  %i.next = add i32 %i, 1
11977dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
11987dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
11997dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12007dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12017dddf12fSNikita Popovexit:
12027dddf12fSNikita Popov  ret i32 %i
12037dddf12fSNikita Popov}
12047dddf12fSNikita Popov
12057dddf12fSNikita Popovdefine i32 @logical_and_not_known_greater_equal(i16 %n, i16 %m) {
12067dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_not_known_greater_equal'
12077dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_greater_equal
12087dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
12097dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
12107dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
12117dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
12127dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
12137dddf12fSNikita Popov; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
12147dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12157019624eSFlorian Hahn; 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 }
12167dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12177019624eSFlorian Hahn; 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 }
12187dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12197dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
12207dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_greater_equal
12217dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
12227755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 65535
1223e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
122488f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
12257dddf12fSNikita Popov;
12267dddf12fSNikita Popoventry:
12277dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
12287dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
12297dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65534
12307dddf12fSNikita Popov  br label %loop
12317dddf12fSNikita Popovloop:
12327dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12337dddf12fSNikita Popov  %i.next = add i32 %i, 1
12347dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
12357dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
12367dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12377dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12387dddf12fSNikita Popovexit:
12397dddf12fSNikita Popov  ret i32 %i
12407dddf12fSNikita Popov}
12417dddf12fSNikita Popov
12427dddf12fSNikita Popovdefine i32 @logical_and_zero_arg1(i32 %n) {
12437dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_zero_arg1'
12447dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg1
12457dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12467019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
12477dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12487019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
12497dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12507dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
12517dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg1
1252*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %loop: backedge-taken count is i32 0
12537755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 0
1254*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 0
125588f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
12567dddf12fSNikita Popov;
12577dddf12fSNikita Popoventry:
12587dddf12fSNikita Popov  br label %loop
12597dddf12fSNikita Popovloop:
12607dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12617dddf12fSNikita Popov  %i.next = add i32 %i, 1
12627dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, 0
12637dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n
12647dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12657dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12667dddf12fSNikita Popovexit:
12677dddf12fSNikita Popov  ret i32 %i
12687dddf12fSNikita Popov}
12697dddf12fSNikita Popov
12707dddf12fSNikita Popovdefine i32 @logical_and_zero_arg2(i32 %n) {
12717dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_zero_arg2'
12727dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg2
12737dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12747019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
12757dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12767019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
12777dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12788a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
12797dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg2
1280*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %loop: backedge-taken count is i32 0
12817755c261SPhilip Reames; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 0
1282*0d38f21eSPhilip Reames; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is i32 0
128388f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
12847dddf12fSNikita Popov;
12857dddf12fSNikita Popoventry:
12867dddf12fSNikita Popov  br label %loop
12877dddf12fSNikita Popovloop:
12887dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12897dddf12fSNikita Popov  %i.next = add i32 %i, 1
12907dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n
12917dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, 0
12927dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12937dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12947dddf12fSNikita Popovexit:
12957dddf12fSNikita Popov  ret i32 %i
12967dddf12fSNikita Popov}
12977dddf12fSNikita Popov
12987dddf12fSNikita Popov
1299138d5c75SRoman Lebedevdeclare i32 @llvm.umin.i32(i32, i32)
1300