xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-select-safe.ll (revision 88f7dc17eb271e37caf381f02eb75b3493e2b4a5)
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)
15211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
16e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
1776a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
1882fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
19*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
206a563e25SRoman Lebedev;
216a563e25SRoman Lebedeventry:
226a563e25SRoman Lebedev  br label %loop
236a563e25SRoman Lebedevloop:
246a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
256a563e25SRoman Lebedev  %i.next = add i32 %i, 1
266a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
276a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
286a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
296a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
306a563e25SRoman Lebedevexit:
316a563e25SRoman Lebedev  ret i32 %i
326a563e25SRoman Lebedev}
336a563e25SRoman Lebedev
346a563e25SRoman Lebedevdefine i32 @logical_or_2ops(i32 %n, i32 %m) {
356a563e25SRoman Lebedev; CHECK-LABEL: 'logical_or_2ops'
366a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_2ops
376a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
3876a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
396a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
4076a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
416a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
4249d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
436a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_2ops
4476a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
45211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
46e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
4776a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
4882fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
49*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
506a563e25SRoman Lebedev;
516a563e25SRoman Lebedeventry:
526a563e25SRoman Lebedev  br label %loop
536a563e25SRoman Lebedevloop:
546a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
556a563e25SRoman Lebedev  %i.next = add i32 %i, 1
566a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
576a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
586a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
596a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
606a563e25SRoman Lebedevexit:
616a563e25SRoman Lebedev  ret i32 %i
626a563e25SRoman Lebedev}
636a563e25SRoman Lebedev
646a563e25SRoman Lebedevdefine i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
656a563e25SRoman Lebedev; CHECK-LABEL: 'logical_and_3ops'
666a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_3ops
676a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
6876a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
696a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
7076a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
716a563e25SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
7216bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
736a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
7416bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
756a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_3ops
7676a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
77211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
78e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
7976a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
8082fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
81*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
826a563e25SRoman Lebedev;
836a563e25SRoman Lebedeventry:
846a563e25SRoman Lebedev  br label %loop
856a563e25SRoman Lebedevloop:
866a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
876a563e25SRoman Lebedev  %i.next = add i32 %i, 1
886a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
896a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
906a563e25SRoman Lebedev  %cond_p2 = icmp ult i32 %i, %k
916a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
926a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
936a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
946a563e25SRoman Lebedevexit:
956a563e25SRoman Lebedev  ret i32 %i
966a563e25SRoman Lebedev}
976a563e25SRoman Lebedev
986a563e25SRoman Lebedevdefine i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
996a563e25SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops'
1006a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops
1016a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
10276a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
1036a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
10476a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
1056a563e25SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
10649d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1076a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
10849d9acc2SRoman 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 }
1096a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops
11076a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
111211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
112e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
11376a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
11482fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
115*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
1166a563e25SRoman Lebedev;
1176a563e25SRoman Lebedeventry:
1186a563e25SRoman Lebedev  br label %loop
1196a563e25SRoman Lebedevloop:
1206a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
1216a563e25SRoman Lebedev  %i.next = add i32 %i, 1
1226a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
1236a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
1246a563e25SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
1256a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
1266a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
1276a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
1286a563e25SRoman Lebedevexit:
1296a563e25SRoman Lebedev  ret i32 %i
1306a563e25SRoman Lebedev}
131e0772cf0SRoman Lebedev
13236075942SRoman Lebedevdefine i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) {
13336075942SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_duplicate'
13436075942SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_duplicate
13536075942SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1365e166507SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
13736075942SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1385e166507SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
13936075942SRoman Lebedev; CHECK-NEXT:    %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
14049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
14136075942SRoman Lebedev; CHECK-NEXT:    %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
1428a3efcd4SFlorian 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 }
14336075942SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
1448a3efcd4SFlorian 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 }
14536075942SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_duplicate
1465e166507SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
147211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
148e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k)
1495e166507SRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
15036075942SRoman Lebedev; CHECK-NEXT:   Predicates:
151*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
15236075942SRoman Lebedev;
15336075942SRoman Lebedeventry:
15436075942SRoman Lebedev  br label %loop
15536075942SRoman Lebedevloop:
15636075942SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
15736075942SRoman Lebedev  %i.next = add i32 %i, 1
15836075942SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
15936075942SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
16036075942SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %n
16136075942SRoman Lebedev  %cond_p3 = icmp uge i32 %i, %k
16236075942SRoman Lebedev  %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
16336075942SRoman Lebedev  %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
16436075942SRoman Lebedev  %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
16536075942SRoman Lebedev  br i1 %cond, label %exit, label %loop
16636075942SRoman Lebedevexit:
16736075942SRoman Lebedev  ret i32 %i
16836075942SRoman Lebedev}
16936075942SRoman Lebedev
170138d5c75SRoman Lebedevdefine i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) {
171138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand'
172138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand
173138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1745ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
175138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1765ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
177138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
178138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
179138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
18049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
181138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
18249d9acc2SRoman 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 }
183138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand
1845ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
185211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
186e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)
1875ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k)
188138d5c75SRoman Lebedev; CHECK-NEXT:   Predicates:
189*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
190138d5c75SRoman Lebedev;
191138d5c75SRoman Lebedeventry:
192138d5c75SRoman Lebedev  br label %loop
193138d5c75SRoman Lebedevloop:
194138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
195138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
196138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
197138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
198138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %n
199138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
200138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
201138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
202138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
203138d5c75SRoman Lebedevexit:
204138d5c75SRoman Lebedev  ret i32 %i
205138d5c75SRoman Lebedev}
206138d5c75SRoman Lebedev
207138d5c75SRoman Lebedevdefine i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) {
208138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand'
209138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_umin_operand
210138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2115ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable }
212138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2135ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable }
214138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
215138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
216138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
21749d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
218138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
21949d9acc2SRoman 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 }
220138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand
2215ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m)
222211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
223e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %k umin_seq %m)
2245ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %k umin_seq %m)
225138d5c75SRoman Lebedev; CHECK-NEXT:   Predicates:
226*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
227138d5c75SRoman Lebedev;
228138d5c75SRoman Lebedeventry:
229138d5c75SRoman Lebedev  br label %loop
230138d5c75SRoman Lebedevloop:
231138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
232138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
233138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
234138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
235138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
236138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin
237138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
238138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
239138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
240138d5c75SRoman Lebedevexit:
241138d5c75SRoman Lebedev  ret i32 %i
242138d5c75SRoman Lebedev}
243b2be7dcfSRoman Lebedev
244138d5c75SRoman Lebedevdefine i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) {
245138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins'
246138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins
247138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2485ceb070bSRoman 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 }
249138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2505ceb070bSRoman 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 }
251138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
252138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
253138d5c75SRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
254138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant }
255138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
25649d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
257138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
25849d9acc2SRoman 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 }
259138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins
2605ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
261211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
262e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
2635ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
264138d5c75SRoman Lebedev; CHECK-NEXT:   Predicates:
265*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
266138d5c75SRoman Lebedev;
267138d5c75SRoman Lebedeventry:
268138d5c75SRoman Lebedev  br label %loop
269138d5c75SRoman Lebedevloop:
270138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
271138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
272138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
273138d5c75SRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
274138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
275138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
276138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin2
277138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
278138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
279138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
280138d5c75SRoman Lebedevexit:
281138d5c75SRoman Lebedev  ret i32 %i
282138d5c75SRoman Lebedev}
283138d5c75SRoman Lebedev
284b2be7dcfSRoman Lebedevdefine i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) {
285b2be7dcfSRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin'
286b2be7dcfSRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin
287b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2885ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
289b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2905ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
291b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
292b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
293b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
294b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant }
295b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
29649d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
297b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
29849d9acc2SRoman 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 }
299b2be7dcfSRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin
3005ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
301211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
302e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k)
3035ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k)
304b2be7dcfSRoman Lebedev; CHECK-NEXT:   Predicates:
305*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
306b2be7dcfSRoman Lebedev;
307b2be7dcfSRoman Lebedeventry:
308b2be7dcfSRoman Lebedev  br label %loop
309b2be7dcfSRoman Lebedevloop:
310b2be7dcfSRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
311b2be7dcfSRoman Lebedev  %i.next = add i32 %i, 1
312b2be7dcfSRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
313b2be7dcfSRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
314b2be7dcfSRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
315b2be7dcfSRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
316b2be7dcfSRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin2
317b2be7dcfSRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
318b2be7dcfSRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
319b2be7dcfSRoman Lebedev  br i1 %cond, label %exit, label %loop
320b2be7dcfSRoman Lebedevexit:
321b2be7dcfSRoman Lebedev  ret i32 %i
322b2be7dcfSRoman Lebedev}
323b2be7dcfSRoman Lebedev
324b2be7dcfSRoman Lebedevdefine i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) {
325b2be7dcfSRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin'
326b2be7dcfSRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_partially_redundant_umin
327b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
3285ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable }
329b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
3305ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable }
331b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
332b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
333b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
334b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant }
335b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
33649d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
337b2be7dcfSRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin
3385ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k))
339211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
340e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%m umin %k))
3415ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq (%m umin %k))
342b2be7dcfSRoman Lebedev; CHECK-NEXT:   Predicates:
343*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
344b2be7dcfSRoman Lebedev;
345b2be7dcfSRoman Lebedeventry:
346b2be7dcfSRoman Lebedev  br label %loop
347b2be7dcfSRoman Lebedevloop:
348b2be7dcfSRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
349b2be7dcfSRoman Lebedev  %i.next = add i32 %i, 1
350b2be7dcfSRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
351b2be7dcfSRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
352b2be7dcfSRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
353b2be7dcfSRoman Lebedev  %cond_p1 = icmp uge i32 %i, %umin2
354b2be7dcfSRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
355b2be7dcfSRoman Lebedev  br i1 %cond, label %exit, label %loop
356b2be7dcfSRoman Lebedevexit:
357b2be7dcfSRoman Lebedev  ret i32 %i
358b2be7dcfSRoman Lebedev}
359b2be7dcfSRoman Lebedev
3602c0c6195SRoman Lebedevdefine i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
3612c0c6195SRoman Lebedev; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq'
3622c0c6195SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
3632c0c6195SRoman Lebedev; CHECK-NEXT:    %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ]
3642c0c6195SRoman 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 }
3652c0c6195SRoman Lebedev; CHECK-NEXT:    %first.i.next = add i32 %first.i, 1
3662c0c6195SRoman 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 }
3672c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
36849d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }
3692c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
37049d9acc2SRoman 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 }
3712c0c6195SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ]
372c86a982dSRoman 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 }
3732c0c6195SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
374c86a982dSRoman 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 }
3752c0c6195SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
3762c0c6195SRoman Lebedev; CHECK-NEXT:    --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant }
3772c0c6195SRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
3782c0c6195SRoman 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 }
3792c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
38049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
3812c0c6195SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
38249d9acc2SRoman 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 }
3832c0c6195SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
384c86a982dSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
385211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
386e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
387c86a982dSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
3882c0c6195SRoman Lebedev; CHECK-NEXT:   Predicates:
389*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
3902c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a)
391211d9411SMax Kazantsev; CHECK-NEXT:  Loop %first.loop: constant max backedge-taken count is -1
392e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %first.loop: symbolic max backedge-taken count is (%e umin_seq %d umin_seq %a)
3932c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %first.loop: Predicated backedge-taken count is (%e umin_seq %d umin_seq %a)
3942c0c6195SRoman Lebedev; CHECK-NEXT:   Predicates:
395*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %first.loop: Trip multiple is 1
3962c0c6195SRoman Lebedev;
3972c0c6195SRoman Lebedeventry:
3982c0c6195SRoman Lebedev  br label %first.loop
3992c0c6195SRoman Lebedevfirst.loop:
4002c0c6195SRoman Lebedev  %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop]
4012c0c6195SRoman Lebedev  %first.i.next = add i32 %first.i, 1
4022c0c6195SRoman Lebedev  %cond_p0 = icmp uge i32 %first.i, %e
4032c0c6195SRoman Lebedev  %cond_p1 = icmp uge i32 %first.i, %d
4042c0c6195SRoman Lebedev  %cond_p2 = icmp uge i32 %first.i, %a
4052c0c6195SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
4062c0c6195SRoman Lebedev  %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
4072c0c6195SRoman Lebedev  br i1 %cond_p4, label %first.loop.exit, label %first.loop
4082c0c6195SRoman Lebedevfirst.loop.exit:
4092c0c6195SRoman Lebedev  br label %loop
4102c0c6195SRoman Lebedevloop:
4112c0c6195SRoman Lebedev  %i = phi i32 [0, %first.loop.exit], [%i.next, %loop]
4122c0c6195SRoman Lebedev  %i.next = add i32 %i, 1
4132c0c6195SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
4142c0c6195SRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
4152c0c6195SRoman Lebedev  %cond_p5 = icmp uge i32 %i, %a
4162c0c6195SRoman Lebedev  %cond_p6 = icmp uge i32 %i, %b
4172c0c6195SRoman Lebedev  %cond_p7 = icmp uge i32 %i, %umin2
4182c0c6195SRoman Lebedev  %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
4192c0c6195SRoman Lebedev  %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
4202c0c6195SRoman Lebedev  br i1 %cond, label %exit, label %loop
4212c0c6195SRoman Lebedevexit:
4222c0c6195SRoman Lebedev  ret i32 %i
4232c0c6195SRoman Lebedev}
4242c0c6195SRoman Lebedev
425f34742d7SRoman Lebedevdefine i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) {
426f34742d7SRoman Lebedev; CHECK-LABEL: 'logical_and_2ops_and_constant'
427f34742d7SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops_and_constant
428f34742d7SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
4297019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable }
430f34742d7SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
4317019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable }
432f34742d7SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
433f34742d7SRoman Lebedev; CHECK-NEXT:    --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant }
434f34742d7SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
4358a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (true + ((true + %cond_p1) umin (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
436f34742d7SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops_and_constant
4378dcba206SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (42 umin %n)
438211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 42
439e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (42 umin %n)
4408dcba206SRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (42 umin %n)
441f34742d7SRoman Lebedev; CHECK-NEXT:   Predicates:
442*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
443f34742d7SRoman Lebedev;
444f34742d7SRoman Lebedeventry:
445f34742d7SRoman Lebedev  br label %loop
446f34742d7SRoman Lebedevloop:
447f34742d7SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
448f34742d7SRoman Lebedev  %i.next = add i32 %i, 1
449f34742d7SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
450f34742d7SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
451f34742d7SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %n
452f34742d7SRoman Lebedev  %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
453f34742d7SRoman Lebedev  br i1 %cond, label %exit, label %loop
454f34742d7SRoman Lebedevexit:
455f34742d7SRoman Lebedev  ret i32 %i
456f34742d7SRoman Lebedev}
457f34742d7SRoman Lebedev
458e0772cf0SRoman Lebedevdefine i32 @computeSCEVAtScope(i32 %d.0) {
459e0772cf0SRoman Lebedev; CHECK-LABEL: 'computeSCEVAtScope'
460e0772cf0SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @computeSCEVAtScope
461e0772cf0SRoman Lebedev; CHECK-NEXT:    %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
4625e166507SRoman Lebedev; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
463e0772cf0SRoman Lebedev; CHECK-NEXT:    %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
4645e166507SRoman Lebedev; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
465e0772cf0SRoman Lebedev; CHECK-NEXT:    %0 = select i1 %tobool1, i1 %tobool2, i1 false
46616bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant }
467e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc = add nsw i32 %d.1, 1
4685e166507SRoman 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 }
469e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc3 = add nsw i32 %e.1, 1
4705e166507SRoman 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 }
471e0772cf0SRoman Lebedev; CHECK-NEXT:    %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
4727019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
473e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc8 = add i32 %f.1, 1
4747019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
475e0772cf0SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @computeSCEVAtScope
4765e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond: backedge-taken count is (-1 * %d.0)
477211d9411SMax Kazantsev; CHECK-NEXT:  Loop %for.cond: constant max backedge-taken count is -1
478e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %for.cond: symbolic max backedge-taken count is (-1 * %d.0)
4795e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond: Predicated backedge-taken count is (-1 * %d.0)
480e0772cf0SRoman Lebedev; CHECK-NEXT:   Predicates:
481*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.cond: Trip multiple is 1
4825e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond4: backedge-taken count is 0
483211d9411SMax Kazantsev; CHECK-NEXT:  Loop %for.cond4: constant max backedge-taken count is 0
484e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %for.cond4: symbolic max backedge-taken count is 0
4855e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond4: Predicated backedge-taken count is 0
486e0772cf0SRoman Lebedev; CHECK-NEXT:   Predicates:
487*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %for.cond4: Trip multiple is 1
488e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %while.cond: <multiple exits> Unpredictable backedge-taken count.
489211d9411SMax Kazantsev; CHECK-NEXT:  Loop %while.cond: Unpredictable constant max backedge-taken count.
490e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %while.cond: Unpredictable symbolic max backedge-taken count.
491e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %while.cond: Unpredictable predicated backedge-taken count.
492e0772cf0SRoman Lebedev;
493e0772cf0SRoman Lebedeventry:
494e0772cf0SRoman Lebedev  br label %while.cond
495e0772cf0SRoman Lebedev
496e0772cf0SRoman Lebedevwhile.cond.loopexit:                              ; preds = %for.cond4
497e0772cf0SRoman Lebedev  br label %while.cond
498e0772cf0SRoman Lebedev
499e0772cf0SRoman Lebedevwhile.cond:                                       ; preds = %while.cond.loopexit, %entry
500e0772cf0SRoman Lebedev  br label %for.cond.preheader
501e0772cf0SRoman Lebedev
502e0772cf0SRoman Lebedevfor.cond.preheader:                               ; preds = %while.cond
503e0772cf0SRoman Lebedev  br label %for.cond
504e0772cf0SRoman Lebedev
505e0772cf0SRoman Lebedevfor.cond:                                         ; preds = %for.body, %for.cond.preheader
506e0772cf0SRoman Lebedev  %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
507e0772cf0SRoman Lebedev  %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
508e0772cf0SRoman Lebedev  %tobool1 = icmp ne i32 %e.1, 0
509e0772cf0SRoman Lebedev  %tobool2 = icmp ne i32 %d.1, 0
510e0772cf0SRoman Lebedev  %0 = select i1 %tobool1, i1 %tobool2, i1 false
511e0772cf0SRoman Lebedev  br i1 %0, label %for.body, label %for.cond4.preheader
512e0772cf0SRoman Lebedev
513e0772cf0SRoman Lebedevfor.cond4.preheader:                              ; preds = %for.cond
514e0772cf0SRoman Lebedev  br label %for.cond4
515e0772cf0SRoman Lebedev
516e0772cf0SRoman Lebedevfor.body:                                         ; preds = %for.cond
517e0772cf0SRoman Lebedev  %inc = add nsw i32 %d.1, 1
518e0772cf0SRoman Lebedev  %inc3 = add nsw i32 %e.1, 1
519e0772cf0SRoman Lebedev  br label %for.cond
520e0772cf0SRoman Lebedev
521e0772cf0SRoman Lebedevfor.cond4:                                        ; preds = %for.body5, %for.cond4.preheader
522e0772cf0SRoman Lebedev  %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
523e0772cf0SRoman Lebedev  %exitcond.not = icmp eq i32 %f.1, %e.1
524e0772cf0SRoman Lebedev  br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5
525e0772cf0SRoman Lebedev
526e0772cf0SRoman Lebedevfor.body5:                                        ; preds = %for.cond4
527e0772cf0SRoman Lebedev  %inc8 = add i32 %f.1, 1
528e0772cf0SRoman Lebedev  br label %for.cond4
529e0772cf0SRoman Lebedev}
530138d5c75SRoman Lebedev
53192619956SNikita Popovdefine i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, ptr %ptr) {
532f14b5751SRoman Lebedev; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity'
533f14b5751SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @uminseq_vs_ptrtoint_complexity
534f14b5751SRoman Lebedev; CHECK-NEXT:    %i = phi i64 [ 0, %entry ], [ %i.next, %loop ]
535f14b5751SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
536f14b5751SRoman Lebedev; CHECK-NEXT:    %i.next = add i64 %i, 1
537f14b5751SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
538f14b5751SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
53916bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
54092619956SNikita Popov; CHECK-NEXT:    %ptr.int = ptrtoint ptr %ptr to i64
54192619956SNikita Popov; CHECK-NEXT:    --> (ptrtoint ptr %ptr to i64) U: full-set S: full-set
542f14b5751SRoman Lebedev; CHECK-NEXT:    %r = add i64 %i, %ptr.int
54392619956SNikita 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
544f14b5751SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity
545f14b5751SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
546211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
547e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
548f14b5751SRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
549f14b5751SRoman Lebedev; CHECK-NEXT:   Predicates:
550*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
551f14b5751SRoman Lebedev;
552f14b5751SRoman Lebedeventry:
553f14b5751SRoman Lebedev  br label %loop
554f14b5751SRoman Lebedevloop:
555f14b5751SRoman Lebedev  %i = phi i64 [0, %entry], [%i.next, %loop]
556f14b5751SRoman Lebedev  %i.next = add i64 %i, 1
557f14b5751SRoman Lebedev  %cond_p0 = icmp ult i64 %i, %n
558f14b5751SRoman Lebedev  %cond_p1 = icmp ult i64 %i, %m
559f14b5751SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
560f14b5751SRoman Lebedev  br i1 %cond, label %loop, label %exit
561f14b5751SRoman Lebedevexit:
56292619956SNikita Popov  %ptr.int = ptrtoint ptr %ptr to i64
563f14b5751SRoman Lebedev  %r = add i64 %i, %ptr.int
564f14b5751SRoman Lebedev  ret i64 %r
565f14b5751SRoman Lebedev}
566f14b5751SRoman Lebedev
567b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison1(i32 %n) {
568b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison1'
569b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison1
570b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
571b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
572b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
57347c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
574b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
57547c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
576b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
5778a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
578b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison1
57947c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
580211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
581e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)
58247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n)
583b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
584*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
585b62e9f63SNikita Popov;
586b62e9f63SNikita Popoventry:
587b62e9f63SNikita Popov  %add = add i32 %n, 1
588b62e9f63SNikita Popov  br label %loop
589b62e9f63SNikita Popovloop:
590b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
591b62e9f63SNikita Popov  %i.next = add i32 %i, 1
592b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
593b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
594b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
595b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
596b62e9f63SNikita Popovexit:
597b62e9f63SNikita Popov  ret i32 %i
598b62e9f63SNikita Popov}
599b62e9f63SNikita Popov
600b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison2(i32 %n) {
601b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison2'
602b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison2
603b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
604b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
605b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
60647c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
607b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
60847c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
609b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
6108a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
611b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison2
61247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
613211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
614e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n)
61547c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n)
616b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
617*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
618b62e9f63SNikita Popov;
619b62e9f63SNikita Popoventry:
620b62e9f63SNikita Popov  %add = add i32 %n, 1
621b62e9f63SNikita Popov  br label %loop
622b62e9f63SNikita Popovloop:
623b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
624b62e9f63SNikita Popov  %i.next = add i32 %i, 1
625b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
626b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
627b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
628b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
629b62e9f63SNikita Popovexit:
630b62e9f63SNikita Popov  ret i32 %i
631b62e9f63SNikita Popov}
632b62e9f63SNikita Popov
633b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison3(i32 %n, i32 %m) {
634b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison3'
635b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison3
636b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
637b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
638b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
63947c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable }
640b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
64147c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable }
642b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
6438a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
644b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison3
64547c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin %n)
646211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
647e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin %n)
64847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin %n)
649b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
650*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
651b62e9f63SNikita Popov;
652b62e9f63SNikita Popoventry:
653b62e9f63SNikita Popov  %add = add i32 %n, %m
654b62e9f63SNikita Popov  br label %loop
655b62e9f63SNikita Popovloop:
656b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
657b62e9f63SNikita Popov  %i.next = add i32 %i, 1
658b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
659b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
660b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
661b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
662b62e9f63SNikita Popovexit:
663b62e9f63SNikita Popov  ret i32 %i
664b62e9f63SNikita Popov}
665b62e9f63SNikita Popov
666b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) {
667b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction'
668b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_wrong_direction
669b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
670b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
671b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
672b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable }
673b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
674b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable }
675b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
676b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
677b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_wrong_direction
678b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%n + %m))
679211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
680e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%n + %m))
681b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq (%n + %m))
682b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
683*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
684b62e9f63SNikita Popov;
685b62e9f63SNikita Popoventry:
686b62e9f63SNikita Popov  %add = add i32 %n, %m
687b62e9f63SNikita Popov  br label %loop
688b62e9f63SNikita Popovloop:
689b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
690b62e9f63SNikita Popov  %i.next = add i32 %i, 1
691b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
692b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
693b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
694b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
695b62e9f63SNikita Popovexit:
696b62e9f63SNikita Popov  ret i32 %i
697b62e9f63SNikita Popov}
698b62e9f63SNikita Popov
699b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) {
700b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_noundef'
701b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef
702b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
70347c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable }
704b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
70547c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable }
706b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7078a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
708b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef
70947c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin %m)
710211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
711e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin %m)
71247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin %m)
713b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
714*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
715b62e9f63SNikita Popov;
716b62e9f63SNikita Popoventry:
717b62e9f63SNikita Popov  br label %loop
718b62e9f63SNikita Popovloop:
719b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
720b62e9f63SNikita Popov  %i.next = add i32 %i, 1
721b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
722b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
723b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
724b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
725b62e9f63SNikita Popovexit:
726b62e9f63SNikita Popov  ret i32 %i
727b62e9f63SNikita Popov}
728b62e9f63SNikita Popov
729b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) {
730b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction'
731b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction
732b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
733b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable }
734b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
735b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable }
736b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
737b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
738b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction
739b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq %n)
740211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
741e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq %n)
742b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq %n)
743b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
744*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
745b62e9f63SNikita Popov;
746b62e9f63SNikita Popoventry:
747b62e9f63SNikita Popov  br label %loop
748b62e9f63SNikita Popovloop:
749b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
750b62e9f63SNikita Popov  %i.next = add i32 %i, 1
751b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
752b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
753b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
754b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
755b62e9f63SNikita Popovexit:
756b62e9f63SNikita Popov  ret i32 %i
757b62e9f63SNikita Popov}
758b62e9f63SNikita Popov
7592f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) {
7602f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex1'
7612f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex1
762b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
763b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
764b62e9f63SNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, 1
765b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n + %m) U: full-set S: full-set
766b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
76747c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable }
768b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
76947c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable }
770b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7718a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
7722f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex1
77347c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m))
774211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
775e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (1 + %n + %m))
77647c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (1 + %n + %m))
777b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
778*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
779b62e9f63SNikita Popov;
780b62e9f63SNikita Popoventry:
781b62e9f63SNikita Popov  %add = add i32 %n, %m
782b62e9f63SNikita Popov  %add1 = add i32 %add, 1
783b62e9f63SNikita Popov  br label %loop
784b62e9f63SNikita Popovloop:
785b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
786b62e9f63SNikita Popov  %i.next = add i32 %i, 1
7872f64a6cfSNikita Popov  %cond_p0 = icmp ult i32 %i, %add1
7882f64a6cfSNikita Popov  %cond_p1 = icmp ult i32 %i, %add
7892f64a6cfSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7902f64a6cfSNikita Popov  br i1 %cond, label %loop, label %exit
7912f64a6cfSNikita Popovexit:
7922f64a6cfSNikita Popov  ret i32 %i
7932f64a6cfSNikita Popov}
7942f64a6cfSNikita Popov
7952f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) {
7962f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex2'
7972f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex2
7982f64a6cfSNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
7992f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
8002f64a6cfSNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, %l
8012f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
8022f64a6cfSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
80347c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable }
8042f64a6cfSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
80547c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable }
8062f64a6cfSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8078a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
8082f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex2
80947c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l))
810211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
811e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (%n + %m + %l))
81247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (%n + %m + %l))
8132f64a6cfSNikita Popov; CHECK-NEXT:   Predicates:
814*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
8152f64a6cfSNikita Popov;
8162f64a6cfSNikita Popoventry:
8172f64a6cfSNikita Popov  %add = add i32 %n, %m
8182f64a6cfSNikita Popov  %add1 = add i32 %add, %l
8192f64a6cfSNikita Popov  br label %loop
8202f64a6cfSNikita Popovloop:
8212f64a6cfSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
8222f64a6cfSNikita Popov  %i.next = add i32 %i, 1
8232f64a6cfSNikita Popov  %cond_p0 = icmp ult i32 %i, %add1
8242f64a6cfSNikita Popov  %cond_p1 = icmp ult i32 %i, %add
8252f64a6cfSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8262f64a6cfSNikita Popov  br i1 %cond, label %loop, label %exit
8272f64a6cfSNikita Popovexit:
8282f64a6cfSNikita Popov  ret i32 %i
8292f64a6cfSNikita Popov}
8302f64a6cfSNikita Popov
8312f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) {
8322f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction'
8332f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction
8342f64a6cfSNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
8352f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
8362f64a6cfSNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, %l
8372f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
8382f64a6cfSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
8392f64a6cfSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable }
8402f64a6cfSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
8412f64a6cfSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable }
8422f64a6cfSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8432f64a6cfSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
8442f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction
8452f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
846211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
847e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
8482f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
8492f64a6cfSNikita Popov; CHECK-NEXT:   Predicates:
850*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
8512f64a6cfSNikita Popov;
8522f64a6cfSNikita Popoventry:
8532f64a6cfSNikita Popov  %add = add i32 %n, %m
8542f64a6cfSNikita Popov  %add1 = add i32 %add, %l
8552f64a6cfSNikita Popov  br label %loop
8562f64a6cfSNikita Popovloop:
8572f64a6cfSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
8582f64a6cfSNikita Popov  %i.next = add i32 %i, 1
859b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
860b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add1
861b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
862b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
863b62e9f63SNikita Popovexit:
864b62e9f63SNikita Popov  ret i32 %i
865b62e9f63SNikita Popov}
866b62e9f63SNikita Popov
867b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) {
868b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops'
869b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops
870b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
871b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
872b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
87347c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable }
874b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
87547c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable }
876b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8778a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
878b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
8798a3efcd4SFlorian Hahn; CHECK-NEXT:    --> ((%cond_p0 umin %cond_p1) umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
880b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops
88147c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
882211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
883e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
88447c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
885b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
886*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
887b62e9f63SNikita Popov;
888b62e9f63SNikita Popoventry:
889b62e9f63SNikita Popov  %add = add i32 %n, 1
890b62e9f63SNikita Popov  br label %loop
891b62e9f63SNikita Popovloop:
892b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
893b62e9f63SNikita Popov  %i.next = add i32 %i, 1
894b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
895b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
896b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %m
897b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
898b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
899b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
900b62e9f63SNikita Popovexit:
901b62e9f63SNikita Popov  ret i32 %i
902b62e9f63SNikita Popov}
903b62e9f63SNikita Popov
904b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) {
905b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops2'
906b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops2
907b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
908b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
909b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
9108a3efcd4SFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq ((1 + %n) umin %m)) LoopDispositions: { %loop: Computable }
911b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
9128a3efcd4SFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq ((1 + %n) umin %m))) LoopDispositions: { %loop: Computable }
913b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
914b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
915b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
9168a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p0 umin_seq (%cond_p1 umin %cond_p2)) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
917b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops2
9188a3efcd4SFlorian Hahn; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
919211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
9208a3efcd4SFlorian Hahn; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
9218a3efcd4SFlorian Hahn; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq ((1 + %n) umin %m))
922b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
923*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
924b62e9f63SNikita Popov;
925b62e9f63SNikita Popoventry:
926b62e9f63SNikita Popov  %add = add i32 %n, 1
927b62e9f63SNikita Popov  br label %loop
928b62e9f63SNikita Popovloop:
929b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
930b62e9f63SNikita Popov  %i.next = add i32 %i, 1
931b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
932b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
933b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %add
934b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
935b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
936b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
937b62e9f63SNikita Popovexit:
938b62e9f63SNikita Popov  ret i32 %i
939b62e9f63SNikita Popov}
940b62e9f63SNikita Popov
941b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) {
942b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops3'
943b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops3
944b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
945b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
946b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
94747c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
948b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
94947c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable }
950b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
951b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
952b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
953b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
954b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops3
95547c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
956211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
957e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
95847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
959b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
960*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
961b62e9f63SNikita Popov;
962b62e9f63SNikita Popoventry:
963b62e9f63SNikita Popov  %add = add i32 %n, 1
964b62e9f63SNikita Popov  br label %loop
965b62e9f63SNikita Popovloop:
966b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
967b62e9f63SNikita Popov  %i.next = add i32 %i, 1
968b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
969b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
970b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %add
971b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
972b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
973b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
974b62e9f63SNikita Popovexit:
975b62e9f63SNikita Popov  ret i32 %i
976b62e9f63SNikita Popov}
977b62e9f63SNikita Popov
97833f02de5SNikita Popovdefine i32 @logical_and_not_zero(i16 %n, i32 %m) {
97933f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero'
98033f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero
98133f02de5SNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
98233f02de5SNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
98333f02de5SNikita Popov; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
98433f02de5SNikita Popov; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
98533f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
9867019624eSFlorian 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 }
98733f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
9887019624eSFlorian 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 }
98933f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
99033f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
99133f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero
99218eaff15SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
993211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65536
994e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
99518eaff15SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
99633f02de5SNikita Popov; CHECK-NEXT:   Predicates:
997*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
99833f02de5SNikita Popov;
99933f02de5SNikita Popoventry:
100033f02de5SNikita Popov  %n.ext = zext i16 %n to i32
100133f02de5SNikita Popov  %n1 = add i32 %n.ext, 1
100233f02de5SNikita Popov  br label %loop
100333f02de5SNikita Popovloop:
100433f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
100533f02de5SNikita Popov  %i.next = add i32 %i, 1
100633f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %n1
100733f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
100833f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
100933f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
101033f02de5SNikita Popovexit:
101133f02de5SNikita Popov  ret i32 %i
101233f02de5SNikita Popov}
101333f02de5SNikita Popov
101433f02de5SNikita Popovdefine i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) {
101533f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero_wrong_order'
101633f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_wrong_order
101733f02de5SNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
101833f02de5SNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
101933f02de5SNikita Popov; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
102033f02de5SNikita Popov; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
102133f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
10227019624eSFlorian 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 }
102333f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
10247019624eSFlorian 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 }
102533f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
102633f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
102733f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_wrong_order
102833f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
1029211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65536
1030e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
103133f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
103233f02de5SNikita Popov; CHECK-NEXT:   Predicates:
1033*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
103433f02de5SNikita Popov;
103533f02de5SNikita Popoventry:
103633f02de5SNikita Popov  %n.ext = zext i16 %n to i32
103733f02de5SNikita Popov  %n1 = add i32 %n.ext, 1
103833f02de5SNikita Popov  br label %loop
103933f02de5SNikita Popovloop:
104033f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
104133f02de5SNikita Popov  %i.next = add i32 %i, 1
104233f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
104333f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %n1
104433f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
104533f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
104633f02de5SNikita Popovexit:
104733f02de5SNikita Popov  ret i32 %i
104833f02de5SNikita Popov}
104933f02de5SNikita Popov
105033f02de5SNikita Popovdefine i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) {
105133f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero_needs_context'
105233f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_needs_context
105333f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
105433f02de5SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
105533f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
105633f02de5SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
105733f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
105833f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
105933f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_needs_context
106033f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
1061211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is -1
1062e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m)
106333f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
106433f02de5SNikita Popov; CHECK-NEXT:   Predicates:
1065*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
106633f02de5SNikita Popov;
106733f02de5SNikita Popoventry:
106833f02de5SNikita Popov  %cmp = icmp ne i32 %n, 0
106933f02de5SNikita Popov  br i1 %cmp, label %loop, label %guard.fail
107033f02de5SNikita Popovloop:
107133f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
107233f02de5SNikita Popov  %i.next = add i32 %i, 1
107333f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
107433f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
107533f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
107633f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
107733f02de5SNikita Popovexit:
107833f02de5SNikita Popov  ret i32 %i
107933f02de5SNikita Popovguard.fail:
108033f02de5SNikita Popov  ret i32 -1
108133f02de5SNikita Popov}
108233f02de5SNikita Popov
10837dddf12fSNikita Popovdefine i32 @logical_and_known_smaller(i16 %n, i16 %m) {
10847dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_smaller'
10857dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller
10867dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
10877dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
10887dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
10897dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
10907dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
10917dddf12fSNikita Popov; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
10927dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
10937019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
10947dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
10957019624eSFlorian 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 }
10967dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10977dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
10987dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller
109968e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1100211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65535
1101e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
110268e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
11037dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1104*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
11057dddf12fSNikita Popov;
11067dddf12fSNikita Popoventry:
11077dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11087dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11097dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65536
11107dddf12fSNikita Popov  br label %loop
11117dddf12fSNikita Popovloop:
11127dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11137dddf12fSNikita Popov  %i.next = add i32 %i, 1
11147dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
11157dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
11167dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11177dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11187dddf12fSNikita Popovexit:
11197dddf12fSNikita Popov  ret i32 %i
11207dddf12fSNikita Popov}
11217dddf12fSNikita Popov
11227dddf12fSNikita Popovdefine i32 @logical_and_known_smaller_equal(i16 %n, i16 %m) {
11237dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_smaller_equal'
11247dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller_equal
11257dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
11267dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
11277dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11287dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11297dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
11307dddf12fSNikita Popov; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
11317dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11327019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
11337dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11347019624eSFlorian 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 }
11357dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11367dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11377dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller_equal
113868e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1139211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65535
1140e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
114168e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
11427dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1143*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
11447dddf12fSNikita Popov;
11457dddf12fSNikita Popoventry:
11467dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11477dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11487dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65535
11497dddf12fSNikita Popov  br label %loop
11507dddf12fSNikita Popovloop:
11517dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11527dddf12fSNikita Popov  %i.next = add i32 %i, 1
11537dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
11547dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
11557dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11567dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11577dddf12fSNikita Popovexit:
11587dddf12fSNikita Popov  ret i32 %i
11597dddf12fSNikita Popov}
11607dddf12fSNikita Popov
11617dddf12fSNikita Popovdefine i32 @logical_and_not_known_smaller_equal(i16 %n, i16 %m) {
11627dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_not_known_smaller_equal'
11637dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_smaller_equal
11647dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
11657dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
11667dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11677dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11687dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
11697dddf12fSNikita Popov; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
11707dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11717019624eSFlorian 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 }
11727dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11737019624eSFlorian 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 }
11747dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11757dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11767dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_smaller_equal
11777dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)
1178211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65535
1179e5fa7eb1SMax 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>)
11807dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)
11817dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1182*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
11837dddf12fSNikita Popov;
11847dddf12fSNikita Popoventry:
11857dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11867dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11877dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65534
11887dddf12fSNikita Popov  br label %loop
11897dddf12fSNikita Popovloop:
11907dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11917dddf12fSNikita Popov  %i.next = add i32 %i, 1
11927dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
11937dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
11947dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11957dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11967dddf12fSNikita Popovexit:
11977dddf12fSNikita Popov  ret i32 %i
11987dddf12fSNikita Popov}
11997dddf12fSNikita Popov
12007dddf12fSNikita Popovdefine i32 @logical_and_known_greater(i16 %n, i16 %m) {
12017dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_greater'
12027dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater
12037dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
12047dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
12057dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
12067dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
12077dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
12087dddf12fSNikita Popov; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
12097dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12107019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
12117dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12127019624eSFlorian 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 }
12137dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12147dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
12157dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater
12167dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1217211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65535
1218e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
12197dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
12207dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1221*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
12227dddf12fSNikita Popov;
12237dddf12fSNikita Popoventry:
12247dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
12257dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
12267dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65536
12277dddf12fSNikita Popov  br label %loop
12287dddf12fSNikita Popovloop:
12297dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12307dddf12fSNikita Popov  %i.next = add i32 %i, 1
12317dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
12327dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
12337dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12347dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12357dddf12fSNikita Popovexit:
12367dddf12fSNikita Popov  ret i32 %i
12377dddf12fSNikita Popov}
12387dddf12fSNikita Popov
12397dddf12fSNikita Popovdefine i32 @logical_and_known_greater_equal(i16 %n, i16 %m) {
12407dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_greater_equal'
12417dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater_equal
12427dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
12437dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
12447dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
12457dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
12467dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
12477dddf12fSNikita Popov; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
12487dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12497019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
12507dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12517019624eSFlorian 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 }
12527dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12537dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
12547dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater_equal
12557dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
1256211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65535
1257e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32)
12587dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
12597dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1260*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
12617dddf12fSNikita Popov;
12627dddf12fSNikita Popoventry:
12637dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
12647dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
12657dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65535
12667dddf12fSNikita Popov  br label %loop
12677dddf12fSNikita Popovloop:
12687dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12697dddf12fSNikita Popov  %i.next = add i32 %i, 1
12707dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
12717dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
12727dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12737dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12747dddf12fSNikita Popovexit:
12757dddf12fSNikita Popov  ret i32 %i
12767dddf12fSNikita Popov}
12777dddf12fSNikita Popov
12787dddf12fSNikita Popovdefine i32 @logical_and_not_known_greater_equal(i16 %n, i16 %m) {
12797dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_not_known_greater_equal'
12807dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_greater_equal
12817dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
12827dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
12837dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
12847dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
12857dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
12867dddf12fSNikita Popov; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
12877dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12887019624eSFlorian 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 }
12897dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12907019624eSFlorian 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 }
12917dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12927dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
12937dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_greater_equal
12947dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
1295211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 65535
1296e5fa7eb1SMax 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>)
12977dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
12987dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1299*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
13007dddf12fSNikita Popov;
13017dddf12fSNikita Popoventry:
13027dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
13037dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
13047dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65534
13057dddf12fSNikita Popov  br label %loop
13067dddf12fSNikita Popovloop:
13077dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
13087dddf12fSNikita Popov  %i.next = add i32 %i, 1
13097dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
13107dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
13117dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13127dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
13137dddf12fSNikita Popovexit:
13147dddf12fSNikita Popov  ret i32 %i
13157dddf12fSNikita Popov}
13167dddf12fSNikita Popov
13177dddf12fSNikita Popovdefine i32 @logical_and_zero_arg1(i32 %n) {
13187dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_zero_arg1'
13197dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg1
13207dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
13217019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
13227dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
13237019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
13247dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13257dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
13267dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg1
13277dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is 0
1328211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 0
1329e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is 0
13307dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is 0
13317dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1332*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
13337dddf12fSNikita Popov;
13347dddf12fSNikita Popoventry:
13357dddf12fSNikita Popov  br label %loop
13367dddf12fSNikita Popovloop:
13377dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
13387dddf12fSNikita Popov  %i.next = add i32 %i, 1
13397dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, 0
13407dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n
13417dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13427dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
13437dddf12fSNikita Popovexit:
13447dddf12fSNikita Popov  ret i32 %i
13457dddf12fSNikita Popov}
13467dddf12fSNikita Popov
13477dddf12fSNikita Popovdefine i32 @logical_and_zero_arg2(i32 %n) {
13487dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_zero_arg2'
13497dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg2
13507dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
13517019624eSFlorian Hahn; CHECK-NEXT:    --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
13527dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
13537019624eSFlorian Hahn; CHECK-NEXT:    --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
13547dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13558a3efcd4SFlorian Hahn; CHECK-NEXT:    --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
13567dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg2
13577dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is 0
1358211d9411SMax Kazantsev; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is 0
1359e5fa7eb1SMax Kazantsev; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is 0
13607dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is 0
13617dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
1362*88f7dc17SNikita Popov; CHECK-NEXT:  Loop %loop: Trip multiple is 1
13637dddf12fSNikita Popov;
13647dddf12fSNikita Popoventry:
13657dddf12fSNikita Popov  br label %loop
13667dddf12fSNikita Popovloop:
13677dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
13687dddf12fSNikita Popov  %i.next = add i32 %i, 1
13697dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n
13707dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, 0
13717dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13727dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
13737dddf12fSNikita Popovexit:
13747dddf12fSNikita Popov  ret i32 %i
13757dddf12fSNikita Popov}
13767dddf12fSNikita Popov
13777dddf12fSNikita Popov
1378138d5c75SRoman Lebedevdeclare i32 @llvm.umin.i32(i32, i32)
1379