xref: /llvm-project/llvm/test/Analysis/ScalarEvolution/exit-count-select-safe.ll (revision 68e1ba818869d6312a2774ccc320c0de86a8249c)
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)
156a563e25SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
1676a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
1782fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
1882fb4f4bSRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
196a563e25SRoman Lebedev;
206a563e25SRoman Lebedeventry:
216a563e25SRoman Lebedev  br label %loop
226a563e25SRoman Lebedevloop:
236a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
246a563e25SRoman Lebedev  %i.next = add i32 %i, 1
256a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
266a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
276a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
286a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
296a563e25SRoman Lebedevexit:
306a563e25SRoman Lebedev  ret i32 %i
316a563e25SRoman Lebedev}
326a563e25SRoman Lebedev
336a563e25SRoman Lebedevdefine i32 @logical_or_2ops(i32 %n, i32 %m) {
346a563e25SRoman Lebedev; CHECK-LABEL: 'logical_or_2ops'
356a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_2ops
366a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
3776a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
386a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
3976a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
406a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
4149d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
426a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_2ops
4376a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
446a563e25SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
4576a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
4682fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
4782fb4f4bSRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
486a563e25SRoman Lebedev;
496a563e25SRoman Lebedeventry:
506a563e25SRoman Lebedev  br label %loop
516a563e25SRoman Lebedevloop:
526a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
536a563e25SRoman Lebedev  %i.next = add i32 %i, 1
546a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
556a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
566a563e25SRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
576a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
586a563e25SRoman Lebedevexit:
596a563e25SRoman Lebedev  ret i32 %i
606a563e25SRoman Lebedev}
616a563e25SRoman Lebedev
626a563e25SRoman Lebedevdefine i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) {
636a563e25SRoman Lebedev; CHECK-LABEL: 'logical_and_3ops'
646a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_3ops
656a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
6676a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
676a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
6876a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
696a563e25SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
7016bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
716a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
7216bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
736a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_3ops
7476a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
756a563e25SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
7676a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
7782fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
7882fb4f4bSRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
796a563e25SRoman Lebedev;
806a563e25SRoman Lebedeventry:
816a563e25SRoman Lebedev  br label %loop
826a563e25SRoman Lebedevloop:
836a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
846a563e25SRoman Lebedev  %i.next = add i32 %i, 1
856a563e25SRoman Lebedev  %cond_p0 = icmp ult i32 %i, %n
866a563e25SRoman Lebedev  %cond_p1 = icmp ult i32 %i, %m
876a563e25SRoman Lebedev  %cond_p2 = icmp ult i32 %i, %k
886a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false
896a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 %cond_p2, i1 false
906a563e25SRoman Lebedev  br i1 %cond, label %loop, label %exit
916a563e25SRoman Lebedevexit:
926a563e25SRoman Lebedev  ret i32 %i
936a563e25SRoman Lebedev}
946a563e25SRoman Lebedev
956a563e25SRoman Lebedevdefine i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) {
966a563e25SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops'
976a563e25SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops
986a563e25SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
9976a0abbcSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
1006a563e25SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
10176a0abbcSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
1026a563e25SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
10349d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
1046a563e25SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
10549d9acc2SRoman 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 }
1066a563e25SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops
10776a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
1086a563e25SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
10976a0abbcSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
11082fb4f4bSRoman Lebedev; CHECK-NEXT:   Predicates:
11182fb4f4bSRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
1126a563e25SRoman Lebedev;
1136a563e25SRoman Lebedeventry:
1146a563e25SRoman Lebedev  br label %loop
1156a563e25SRoman Lebedevloop:
1166a563e25SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
1176a563e25SRoman Lebedev  %i.next = add i32 %i, 1
1186a563e25SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
1196a563e25SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
1206a563e25SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
1216a563e25SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
1226a563e25SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
1236a563e25SRoman Lebedev  br i1 %cond, label %exit, label %loop
1246a563e25SRoman Lebedevexit:
1256a563e25SRoman Lebedev  ret i32 %i
1266a563e25SRoman Lebedev}
127e0772cf0SRoman Lebedev
12836075942SRoman Lebedevdefine i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) {
12936075942SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_duplicate'
13036075942SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_duplicate
13136075942SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1325e166507SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable }
13336075942SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1345e166507SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable }
13536075942SRoman Lebedev; CHECK-NEXT:    %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
13649d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
13736075942SRoman Lebedev; CHECK-NEXT:    %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
13849d9acc2SRoman 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 }
13936075942SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
14049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2) umin_seq (true + %cond_p3))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
14136075942SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_duplicate
1425e166507SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k)
14336075942SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
1445e166507SRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k)
14536075942SRoman Lebedev; CHECK-NEXT:   Predicates:
14636075942SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
14736075942SRoman Lebedev;
14836075942SRoman Lebedeventry:
14936075942SRoman Lebedev  br label %loop
15036075942SRoman Lebedevloop:
15136075942SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
15236075942SRoman Lebedev  %i.next = add i32 %i, 1
15336075942SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
15436075942SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %m
15536075942SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %n
15636075942SRoman Lebedev  %cond_p3 = icmp uge i32 %i, %k
15736075942SRoman Lebedev  %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1
15836075942SRoman Lebedev  %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2
15936075942SRoman Lebedev  %cond = select i1 %cond_p5, i1 true, i1 %cond_p3
16036075942SRoman Lebedev  br i1 %cond, label %exit, label %loop
16136075942SRoman Lebedevexit:
16236075942SRoman Lebedev  ret i32 %i
16336075942SRoman Lebedev}
16436075942SRoman Lebedev
165138d5c75SRoman Lebedevdefine i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) {
166138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand'
167138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand
168138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1695ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
170138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
1715ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
172138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
173138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
174138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
17549d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
176138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
17749d9acc2SRoman 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 }
178138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand
1795ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
180138d5c75SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
1815ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k)
182138d5c75SRoman Lebedev; CHECK-NEXT:   Predicates:
183138d5c75SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
184138d5c75SRoman Lebedev;
185138d5c75SRoman Lebedeventry:
186138d5c75SRoman Lebedev  br label %loop
187138d5c75SRoman Lebedevloop:
188138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
189138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
190138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
191138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
192138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %n
193138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %k
194138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
195138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
196138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
197138d5c75SRoman Lebedevexit:
198138d5c75SRoman Lebedev  ret i32 %i
199138d5c75SRoman Lebedev}
200138d5c75SRoman Lebedev
201138d5c75SRoman Lebedevdefine i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) {
202138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand'
203138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_redundant_umin_operand
204138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2055ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable }
206138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2075ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable }
208138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
209138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
210138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
21149d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
212138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
21349d9acc2SRoman 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 }
214138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand
2155ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m)
216138d5c75SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
2175ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %k umin_seq %m)
218138d5c75SRoman Lebedev; CHECK-NEXT:   Predicates:
219138d5c75SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
220138d5c75SRoman Lebedev;
221138d5c75SRoman Lebedeventry:
222138d5c75SRoman Lebedev  br label %loop
223138d5c75SRoman Lebedevloop:
224138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
225138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
226138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
227138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
228138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
229138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin
230138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
231138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
232138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
233138d5c75SRoman Lebedevexit:
234138d5c75SRoman Lebedev  ret i32 %i
235138d5c75SRoman Lebedev}
236b2be7dcfSRoman Lebedev
237138d5c75SRoman Lebedevdefine i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) {
238138d5c75SRoman Lebedev; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins'
239138d5c75SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins
240138d5c75SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2415ceb070bSRoman 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 }
242138d5c75SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2435ceb070bSRoman 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 }
244138d5c75SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
245138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
246138d5c75SRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
247138d5c75SRoman Lebedev; CHECK-NEXT:    --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant }
248138d5c75SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
24949d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
250138d5c75SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
25149d9acc2SRoman 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 }
252138d5c75SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins
2535ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
254138d5c75SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
2555ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q)
256138d5c75SRoman Lebedev; CHECK-NEXT:   Predicates:
257138d5c75SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
258138d5c75SRoman Lebedev;
259138d5c75SRoman Lebedeventry:
260138d5c75SRoman Lebedev  br label %loop
261138d5c75SRoman Lebedevloop:
262138d5c75SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
263138d5c75SRoman Lebedev  %i.next = add i32 %i, 1
264138d5c75SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
265138d5c75SRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q)
266138d5c75SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
267138d5c75SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
268138d5c75SRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin2
269138d5c75SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
270138d5c75SRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
271138d5c75SRoman Lebedev  br i1 %cond, label %exit, label %loop
272138d5c75SRoman Lebedevexit:
273138d5c75SRoman Lebedev  ret i32 %i
274138d5c75SRoman Lebedev}
275138d5c75SRoman Lebedev
276b2be7dcfSRoman Lebedevdefine i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) {
277b2be7dcfSRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin'
278b2be7dcfSRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin
279b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
2805ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable }
281b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
2825ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable }
283b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
284b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
285b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
286b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant }
287b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
28849d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
289b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
29049d9acc2SRoman 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 }
291b2be7dcfSRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin
2925ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k)
293b2be7dcfSRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
2945ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k)
295b2be7dcfSRoman Lebedev; CHECK-NEXT:   Predicates:
296b2be7dcfSRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
297b2be7dcfSRoman Lebedev;
298b2be7dcfSRoman Lebedeventry:
299b2be7dcfSRoman Lebedev  br label %loop
300b2be7dcfSRoman Lebedevloop:
301b2be7dcfSRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
302b2be7dcfSRoman Lebedev  %i.next = add i32 %i, 1
303b2be7dcfSRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
304b2be7dcfSRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k)
305b2be7dcfSRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
306b2be7dcfSRoman Lebedev  %cond_p1 = icmp uge i32 %i, %k
307b2be7dcfSRoman Lebedev  %cond_p2 = icmp uge i32 %i, %umin2
308b2be7dcfSRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
309b2be7dcfSRoman Lebedev  %cond = select i1 %cond_p3, i1 true, i1 %cond_p2
310b2be7dcfSRoman Lebedev  br i1 %cond, label %exit, label %loop
311b2be7dcfSRoman Lebedevexit:
312b2be7dcfSRoman Lebedev  ret i32 %i
313b2be7dcfSRoman Lebedev}
314b2be7dcfSRoman Lebedev
315b2be7dcfSRoman Lebedevdefine i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) {
316b2be7dcfSRoman Lebedev; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin'
317b2be7dcfSRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_3ops_partially_redundant_umin
318b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
3195ceb070bSRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable }
320b2be7dcfSRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
3215ceb070bSRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable }
322b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
323b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant }
324b2be7dcfSRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
325b2be7dcfSRoman Lebedev; CHECK-NEXT:    --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant }
326b2be7dcfSRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
32749d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
328b2be7dcfSRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin
3295ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k))
330b2be7dcfSRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
3315ceb070bSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq (%m umin %k))
332b2be7dcfSRoman Lebedev; CHECK-NEXT:   Predicates:
333b2be7dcfSRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
334b2be7dcfSRoman Lebedev;
335b2be7dcfSRoman Lebedeventry:
336b2be7dcfSRoman Lebedev  br label %loop
337b2be7dcfSRoman Lebedevloop:
338b2be7dcfSRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
339b2be7dcfSRoman Lebedev  %i.next = add i32 %i, 1
340b2be7dcfSRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m)
341b2be7dcfSRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k)
342b2be7dcfSRoman Lebedev  %cond_p0 = icmp uge i32 %i, %n
343b2be7dcfSRoman Lebedev  %cond_p1 = icmp uge i32 %i, %umin2
344b2be7dcfSRoman Lebedev  %cond = select i1 %cond_p0, i1 true, i1 %cond_p1
345b2be7dcfSRoman Lebedev  br i1 %cond, label %exit, label %loop
346b2be7dcfSRoman Lebedevexit:
347b2be7dcfSRoman Lebedev  ret i32 %i
348b2be7dcfSRoman Lebedev}
349b2be7dcfSRoman Lebedev
3502c0c6195SRoman Lebedevdefine i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) {
3512c0c6195SRoman Lebedev; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq'
3522c0c6195SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
3532c0c6195SRoman Lebedev; CHECK-NEXT:    %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ]
3542c0c6195SRoman 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 }
3552c0c6195SRoman Lebedev; CHECK-NEXT:    %first.i.next = add i32 %first.i, 1
3562c0c6195SRoman 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 }
3572c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
35849d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant }
3592c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
36049d9acc2SRoman 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 }
3612c0c6195SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ]
362c86a982dSRoman 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 }
3632c0c6195SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
364c86a982dSRoman 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 }
3652c0c6195SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
3662c0c6195SRoman Lebedev; CHECK-NEXT:    --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant }
3672c0c6195SRoman Lebedev; CHECK-NEXT:    %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
3682c0c6195SRoman 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 }
3692c0c6195SRoman Lebedev; CHECK-NEXT:    %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
37049d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
3712c0c6195SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
37249d9acc2SRoman 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 }
3732c0c6195SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq
374c86a982dSRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
3752c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
376c86a982dSRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c))
3772c0c6195SRoman Lebedev; CHECK-NEXT:   Predicates:
3782c0c6195SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
3792c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a)
3802c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %first.loop: max backedge-taken count is -1
3812c0c6195SRoman Lebedev; CHECK-NEXT:  Loop %first.loop: Predicated backedge-taken count is (%e umin_seq %d umin_seq %a)
3822c0c6195SRoman Lebedev; CHECK-NEXT:   Predicates:
3832c0c6195SRoman Lebedev; CHECK:       Loop %first.loop: Trip multiple is 1
3842c0c6195SRoman Lebedev;
3852c0c6195SRoman Lebedeventry:
3862c0c6195SRoman Lebedev  br label %first.loop
3872c0c6195SRoman Lebedevfirst.loop:
3882c0c6195SRoman Lebedev  %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop]
3892c0c6195SRoman Lebedev  %first.i.next = add i32 %first.i, 1
3902c0c6195SRoman Lebedev  %cond_p0 = icmp uge i32 %first.i, %e
3912c0c6195SRoman Lebedev  %cond_p1 = icmp uge i32 %first.i, %d
3922c0c6195SRoman Lebedev  %cond_p2 = icmp uge i32 %first.i, %a
3932c0c6195SRoman Lebedev  %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1
3942c0c6195SRoman Lebedev  %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2
3952c0c6195SRoman Lebedev  br i1 %cond_p4, label %first.loop.exit, label %first.loop
3962c0c6195SRoman Lebedevfirst.loop.exit:
3972c0c6195SRoman Lebedev  br label %loop
3982c0c6195SRoman Lebedevloop:
3992c0c6195SRoman Lebedev  %i = phi i32 [0, %first.loop.exit], [%i.next, %loop]
4002c0c6195SRoman Lebedev  %i.next = add i32 %i, 1
4012c0c6195SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d)
4022c0c6195SRoman Lebedev  %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i)
4032c0c6195SRoman Lebedev  %cond_p5 = icmp uge i32 %i, %a
4042c0c6195SRoman Lebedev  %cond_p6 = icmp uge i32 %i, %b
4052c0c6195SRoman Lebedev  %cond_p7 = icmp uge i32 %i, %umin2
4062c0c6195SRoman Lebedev  %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6
4072c0c6195SRoman Lebedev  %cond = select i1 %cond_p8, i1 true, i1 %cond_p7
4082c0c6195SRoman Lebedev  br i1 %cond, label %exit, label %loop
4092c0c6195SRoman Lebedevexit:
4102c0c6195SRoman Lebedev  ret i32 %i
4112c0c6195SRoman Lebedev}
4122c0c6195SRoman Lebedev
413f34742d7SRoman Lebedevdefine i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) {
414f34742d7SRoman Lebedev; CHECK-LABEL: 'logical_and_2ops_and_constant'
415f34742d7SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @logical_and_2ops_and_constant
416f34742d7SRoman Lebedev; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
4178dcba206SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable }
418f34742d7SRoman Lebedev; CHECK-NEXT:    %i.next = add i32 %i, 1
4198dcba206SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable }
420f34742d7SRoman Lebedev; CHECK-NEXT:    %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
421f34742d7SRoman Lebedev; CHECK-NEXT:    --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant }
422f34742d7SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
42349d9acc2SRoman Lebedev; CHECK-NEXT:    --> (true + ((true + %cond_p1) umin_seq (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
424f34742d7SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @logical_and_2ops_and_constant
4258dcba206SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (42 umin %n)
426f34742d7SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is 42
4278dcba206SRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (42 umin %n)
428f34742d7SRoman Lebedev; CHECK-NEXT:   Predicates:
429f34742d7SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
430f34742d7SRoman Lebedev;
431f34742d7SRoman Lebedeventry:
432f34742d7SRoman Lebedev  br label %loop
433f34742d7SRoman Lebedevloop:
434f34742d7SRoman Lebedev  %i = phi i32 [0, %entry], [%i.next, %loop]
435f34742d7SRoman Lebedev  %i.next = add i32 %i, 1
436f34742d7SRoman Lebedev  %umin = call i32 @llvm.umin.i32(i32 %n, i32 42)
437f34742d7SRoman Lebedev  %cond_p0 = icmp uge i32 %i, %umin
438f34742d7SRoman Lebedev  %cond_p1 = icmp uge i32 %i, %n
439f34742d7SRoman Lebedev  %cond = select i1 %cond_p1, i1 true, i1 %cond_p0
440f34742d7SRoman Lebedev  br i1 %cond, label %exit, label %loop
441f34742d7SRoman Lebedevexit:
442f34742d7SRoman Lebedev  ret i32 %i
443f34742d7SRoman Lebedev}
444f34742d7SRoman Lebedev
445e0772cf0SRoman Lebedevdefine i32 @computeSCEVAtScope(i32 %d.0) {
446e0772cf0SRoman Lebedev; CHECK-LABEL: 'computeSCEVAtScope'
447e0772cf0SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @computeSCEVAtScope
448e0772cf0SRoman Lebedev; CHECK-NEXT:    %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
4495e166507SRoman Lebedev; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
450e0772cf0SRoman Lebedev; CHECK-NEXT:    %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
4515e166507SRoman Lebedev; CHECK-NEXT:    --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant }
452e0772cf0SRoman Lebedev; CHECK-NEXT:    %0 = select i1 %tobool1, i1 %tobool2, i1 false
45316bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant }
454e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc = add nsw i32 %d.1, 1
4555e166507SRoman 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 }
456e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc3 = add nsw i32 %e.1, 1
4575e166507SRoman 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 }
458e0772cf0SRoman Lebedev; CHECK-NEXT:    %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
4595e166507SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
460e0772cf0SRoman Lebedev; CHECK-NEXT:    %inc8 = add i32 %f.1, 1
4615e166507SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant }
462e0772cf0SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @computeSCEVAtScope
4635e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond: backedge-taken count is (-1 * %d.0)
464e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %for.cond: max backedge-taken count is -1
4655e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond: Predicated backedge-taken count is (-1 * %d.0)
466e0772cf0SRoman Lebedev; CHECK-NEXT:   Predicates:
467e0772cf0SRoman Lebedev; CHECK:       Loop %for.cond: Trip multiple is 1
4685e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond4: backedge-taken count is 0
4695e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond4: max backedge-taken count is 0
4705e166507SRoman Lebedev; CHECK-NEXT:  Loop %for.cond4: Predicated backedge-taken count is 0
471e0772cf0SRoman Lebedev; CHECK-NEXT:   Predicates:
472e0772cf0SRoman Lebedev; CHECK:       Loop %for.cond4: Trip multiple is 1
473e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %while.cond: <multiple exits> Unpredictable backedge-taken count.
474e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %while.cond: Unpredictable max backedge-taken count.
475e0772cf0SRoman Lebedev; CHECK-NEXT:  Loop %while.cond: Unpredictable predicated backedge-taken count.
476e0772cf0SRoman Lebedev;
477e0772cf0SRoman Lebedeventry:
478e0772cf0SRoman Lebedev  br label %while.cond
479e0772cf0SRoman Lebedev
480e0772cf0SRoman Lebedevwhile.cond.loopexit:                              ; preds = %for.cond4
481e0772cf0SRoman Lebedev  br label %while.cond
482e0772cf0SRoman Lebedev
483e0772cf0SRoman Lebedevwhile.cond:                                       ; preds = %while.cond.loopexit, %entry
484e0772cf0SRoman Lebedev  br label %for.cond.preheader
485e0772cf0SRoman Lebedev
486e0772cf0SRoman Lebedevfor.cond.preheader:                               ; preds = %while.cond
487e0772cf0SRoman Lebedev  br label %for.cond
488e0772cf0SRoman Lebedev
489e0772cf0SRoman Lebedevfor.cond:                                         ; preds = %for.body, %for.cond.preheader
490e0772cf0SRoman Lebedev  %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ]
491e0772cf0SRoman Lebedev  %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ]
492e0772cf0SRoman Lebedev  %tobool1 = icmp ne i32 %e.1, 0
493e0772cf0SRoman Lebedev  %tobool2 = icmp ne i32 %d.1, 0
494e0772cf0SRoman Lebedev  %0 = select i1 %tobool1, i1 %tobool2, i1 false
495e0772cf0SRoman Lebedev  br i1 %0, label %for.body, label %for.cond4.preheader
496e0772cf0SRoman Lebedev
497e0772cf0SRoman Lebedevfor.cond4.preheader:                              ; preds = %for.cond
498e0772cf0SRoman Lebedev  br label %for.cond4
499e0772cf0SRoman Lebedev
500e0772cf0SRoman Lebedevfor.body:                                         ; preds = %for.cond
501e0772cf0SRoman Lebedev  %inc = add nsw i32 %d.1, 1
502e0772cf0SRoman Lebedev  %inc3 = add nsw i32 %e.1, 1
503e0772cf0SRoman Lebedev  br label %for.cond
504e0772cf0SRoman Lebedev
505e0772cf0SRoman Lebedevfor.cond4:                                        ; preds = %for.body5, %for.cond4.preheader
506e0772cf0SRoman Lebedev  %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ]
507e0772cf0SRoman Lebedev  %exitcond.not = icmp eq i32 %f.1, %e.1
508e0772cf0SRoman Lebedev  br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5
509e0772cf0SRoman Lebedev
510e0772cf0SRoman Lebedevfor.body5:                                        ; preds = %for.cond4
511e0772cf0SRoman Lebedev  %inc8 = add i32 %f.1, 1
512e0772cf0SRoman Lebedev  br label %for.cond4
513e0772cf0SRoman Lebedev}
514138d5c75SRoman Lebedev
515f14b5751SRoman Lebedevdefine i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, i64* %ptr) {
516f14b5751SRoman Lebedev; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity'
517f14b5751SRoman Lebedev; CHECK-NEXT:  Classifying expressions for: @uminseq_vs_ptrtoint_complexity
518f14b5751SRoman Lebedev; CHECK-NEXT:    %i = phi i64 [ 0, %entry ], [ %i.next, %loop ]
519f14b5751SRoman Lebedev; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
520f14b5751SRoman Lebedev; CHECK-NEXT:    %i.next = add i64 %i, 1
521f14b5751SRoman Lebedev; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
522f14b5751SRoman Lebedev; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
52316bc24e7SRoman Lebedev; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
524f14b5751SRoman Lebedev; CHECK-NEXT:    %ptr.int = ptrtoint i64* %ptr to i64
525f14b5751SRoman Lebedev; CHECK-NEXT:    --> (ptrtoint i64* %ptr to i64) U: full-set S: full-set
526f14b5751SRoman Lebedev; CHECK-NEXT:    %r = add i64 %i, %ptr.int
527993792bdSRoman Lebedev; CHECK-NEXT:    --> {(ptrtoint i64* %ptr to i64),+,1}<%loop> U: full-set S: full-set --> ((%n umin_seq %m) + (ptrtoint i64* %ptr to i64)) U: full-set S: full-set
528f14b5751SRoman Lebedev; CHECK-NEXT:  Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity
529f14b5751SRoman Lebedev; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
530f14b5751SRoman Lebedev; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
531f14b5751SRoman Lebedev; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
532f14b5751SRoman Lebedev; CHECK-NEXT:   Predicates:
533f14b5751SRoman Lebedev; CHECK:       Loop %loop: Trip multiple is 1
534f14b5751SRoman Lebedev;
535f14b5751SRoman Lebedeventry:
536f14b5751SRoman Lebedev  br label %loop
537f14b5751SRoman Lebedevloop:
538f14b5751SRoman Lebedev  %i = phi i64 [0, %entry], [%i.next, %loop]
539f14b5751SRoman Lebedev  %i.next = add i64 %i, 1
540f14b5751SRoman Lebedev  %cond_p0 = icmp ult i64 %i, %n
541f14b5751SRoman Lebedev  %cond_p1 = icmp ult i64 %i, %m
542f14b5751SRoman Lebedev  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
543f14b5751SRoman Lebedev  br i1 %cond, label %loop, label %exit
544f14b5751SRoman Lebedevexit:
545f14b5751SRoman Lebedev  %ptr.int = ptrtoint i64* %ptr to i64
546f14b5751SRoman Lebedev  %r = add i64 %i, %ptr.int
547f14b5751SRoman Lebedev  ret i64 %r
548f14b5751SRoman Lebedev}
549f14b5751SRoman Lebedev
550b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison1(i32 %n) {
551b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison1'
552b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison1
553b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
554b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
555b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
55647c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
557b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
55847c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
559b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
560b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
561b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison1
56247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
563b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
56447c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n)
565b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
566b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
567b62e9f63SNikita Popov;
568b62e9f63SNikita Popoventry:
569b62e9f63SNikita Popov  %add = add i32 %n, 1
570b62e9f63SNikita Popov  br label %loop
571b62e9f63SNikita Popovloop:
572b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
573b62e9f63SNikita Popov  %i.next = add i32 %i, 1
574b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
575b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
576b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
577b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
578b62e9f63SNikita Popovexit:
579b62e9f63SNikita Popov  ret i32 %i
580b62e9f63SNikita Popov}
581b62e9f63SNikita Popov
582b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison2(i32 %n) {
583b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison2'
584b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison2
585b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
586b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
587b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
58847c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable }
589b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
59047c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
591b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
592b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
593b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison2
59447c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + %n) umin %n)
595b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
59647c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n)
597b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
598b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
599b62e9f63SNikita Popov;
600b62e9f63SNikita Popoventry:
601b62e9f63SNikita Popov  %add = add i32 %n, 1
602b62e9f63SNikita Popov  br label %loop
603b62e9f63SNikita Popovloop:
604b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
605b62e9f63SNikita Popov  %i.next = add i32 %i, 1
606b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
607b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
608b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
609b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
610b62e9f63SNikita Popovexit:
611b62e9f63SNikita Popov  ret i32 %i
612b62e9f63SNikita Popov}
613b62e9f63SNikita Popov
614b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison3(i32 %n, i32 %m) {
615b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison3'
616b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison3
617b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
618b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
619b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
62047c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable }
621b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
62247c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable }
623b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
624b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
625b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison3
62647c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin %n)
627b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
62847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin %n)
629b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
630b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
631b62e9f63SNikita Popov;
632b62e9f63SNikita Popoventry:
633b62e9f63SNikita Popov  %add = add i32 %n, %m
634b62e9f63SNikita Popov  br label %loop
635b62e9f63SNikita Popovloop:
636b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
637b62e9f63SNikita Popov  %i.next = add i32 %i, 1
638b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
639b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
640b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
641b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
642b62e9f63SNikita Popovexit:
643b62e9f63SNikita Popov  ret i32 %i
644b62e9f63SNikita Popov}
645b62e9f63SNikita Popov
646b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) {
647b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction'
648b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_wrong_direction
649b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
650b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
651b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
652b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable }
653b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
654b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable }
655b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
656b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
657b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_wrong_direction
658b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq (%n + %m))
659b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
660b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq (%n + %m))
661b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
662b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
663b62e9f63SNikita Popov;
664b62e9f63SNikita Popoventry:
665b62e9f63SNikita Popov  %add = add i32 %n, %m
666b62e9f63SNikita Popov  br label %loop
667b62e9f63SNikita Popovloop:
668b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
669b62e9f63SNikita Popov  %i.next = add i32 %i, 1
670b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
671b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
672b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
673b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
674b62e9f63SNikita Popovexit:
675b62e9f63SNikita Popov  ret i32 %i
676b62e9f63SNikita Popov}
677b62e9f63SNikita Popov
678b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) {
679b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_noundef'
680b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef
681b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
68247c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable }
683b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
68447c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable }
685b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
686b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
687b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef
68847c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin %m)
689b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
69047c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin %m)
691b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
692b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
693b62e9f63SNikita Popov;
694b62e9f63SNikita Popoventry:
695b62e9f63SNikita Popov  br label %loop
696b62e9f63SNikita Popovloop:
697b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
698b62e9f63SNikita Popov  %i.next = add i32 %i, 1
699b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
700b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
701b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
702b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
703b62e9f63SNikita Popovexit:
704b62e9f63SNikita Popov  ret i32 %i
705b62e9f63SNikita Popov}
706b62e9f63SNikita Popov
707b62e9f63SNikita Popovdefine i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) {
708b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction'
709b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction
710b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
711b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable }
712b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
713b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable }
714b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
715b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
716b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction
717b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq %n)
718b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
719b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq %n)
720b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
721b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
722b62e9f63SNikita Popov;
723b62e9f63SNikita Popoventry:
724b62e9f63SNikita Popov  br label %loop
725b62e9f63SNikita Popovloop:
726b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
727b62e9f63SNikita Popov  %i.next = add i32 %i, 1
728b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
729b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
730b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
731b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
732b62e9f63SNikita Popovexit:
733b62e9f63SNikita Popov  ret i32 %i
734b62e9f63SNikita Popov}
735b62e9f63SNikita Popov
7362f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) {
7372f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex1'
7382f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex1
739b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
740b62e9f63SNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
741b62e9f63SNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, 1
742b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n + %m) U: full-set S: full-set
743b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
74447c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable }
745b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
74647c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable }
747b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
748b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
7492f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex1
75047c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m))
751b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
75247c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (1 + %n + %m))
753b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
754b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
755b62e9f63SNikita Popov;
756b62e9f63SNikita Popoventry:
757b62e9f63SNikita Popov  %add = add i32 %n, %m
758b62e9f63SNikita Popov  %add1 = add i32 %add, 1
759b62e9f63SNikita Popov  br label %loop
760b62e9f63SNikita Popovloop:
761b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
762b62e9f63SNikita Popov  %i.next = add i32 %i, 1
7632f64a6cfSNikita Popov  %cond_p0 = icmp ult i32 %i, %add1
7642f64a6cfSNikita Popov  %cond_p1 = icmp ult i32 %i, %add
7652f64a6cfSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7662f64a6cfSNikita Popov  br i1 %cond, label %loop, label %exit
7672f64a6cfSNikita Popovexit:
7682f64a6cfSNikita Popov  ret i32 %i
7692f64a6cfSNikita Popov}
7702f64a6cfSNikita Popov
7712f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) {
7722f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex2'
7732f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex2
7742f64a6cfSNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
7752f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
7762f64a6cfSNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, %l
7772f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
7782f64a6cfSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
77947c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable }
7802f64a6cfSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
78147c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable }
7822f64a6cfSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
7832f64a6cfSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
7842f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex2
78547c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l))
7862f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
78747c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (%n + %m + %l))
7882f64a6cfSNikita Popov; CHECK-NEXT:   Predicates:
7892f64a6cfSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
7902f64a6cfSNikita Popov;
7912f64a6cfSNikita Popoventry:
7922f64a6cfSNikita Popov  %add = add i32 %n, %m
7932f64a6cfSNikita Popov  %add1 = add i32 %add, %l
7942f64a6cfSNikita Popov  br label %loop
7952f64a6cfSNikita Popovloop:
7962f64a6cfSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
7972f64a6cfSNikita Popov  %i.next = add i32 %i, 1
7982f64a6cfSNikita Popov  %cond_p0 = icmp ult i32 %i, %add1
7992f64a6cfSNikita Popov  %cond_p1 = icmp ult i32 %i, %add
8002f64a6cfSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8012f64a6cfSNikita Popov  br i1 %cond, label %loop, label %exit
8022f64a6cfSNikita Popovexit:
8032f64a6cfSNikita Popov  ret i32 %i
8042f64a6cfSNikita Popov}
8052f64a6cfSNikita Popov
8062f64a6cfSNikita Popovdefine i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) {
8072f64a6cfSNikita Popov; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction'
8082f64a6cfSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction
8092f64a6cfSNikita Popov; CHECK-NEXT:    %add = add i32 %n, %m
8102f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m) U: full-set S: full-set
8112f64a6cfSNikita Popov; CHECK-NEXT:    %add1 = add i32 %add, %l
8122f64a6cfSNikita Popov; CHECK-NEXT:    --> (%n + %m + %l) U: full-set S: full-set
8132f64a6cfSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
8142f64a6cfSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable }
8152f64a6cfSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
8162f64a6cfSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable }
8172f64a6cfSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
8182f64a6cfSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
8192f64a6cfSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction
8202f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
8212f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
8222f64a6cfSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l))
8232f64a6cfSNikita Popov; CHECK-NEXT:   Predicates:
8242f64a6cfSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
8252f64a6cfSNikita Popov;
8262f64a6cfSNikita Popoventry:
8272f64a6cfSNikita Popov  %add = add i32 %n, %m
8282f64a6cfSNikita Popov  %add1 = add i32 %add, %l
8292f64a6cfSNikita Popov  br label %loop
8302f64a6cfSNikita Popovloop:
8312f64a6cfSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
8322f64a6cfSNikita Popov  %i.next = add i32 %i, 1
833b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %add
834b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add1
835b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
836b62e9f63SNikita Popov  br i1 %cond, label %loop, label %exit
837b62e9f63SNikita Popovexit:
838b62e9f63SNikita Popov  ret i32 %i
839b62e9f63SNikita Popov}
840b62e9f63SNikita Popov
841b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) {
842b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops'
843b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops
844b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
845b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
846b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
84747c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable }
848b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
84947c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable }
850b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
851b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
852b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
853b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
854b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops
85547c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
856b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
85747c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (((1 + %n) umin %n) umin_seq %m)
858b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
859b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
860b62e9f63SNikita Popov;
861b62e9f63SNikita Popoventry:
862b62e9f63SNikita Popov  %add = add i32 %n, 1
863b62e9f63SNikita Popov  br label %loop
864b62e9f63SNikita Popovloop:
865b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
866b62e9f63SNikita Popov  %i.next = add i32 %i, 1
867b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
868b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %add
869b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %m
870b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
871b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
872b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
873b62e9f63SNikita Popovexit:
874b62e9f63SNikita Popov  ret i32 %i
875b62e9f63SNikita Popov}
876b62e9f63SNikita Popov
877b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) {
878b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops2'
879b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops2
880b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
881b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
882b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
883b62e9f63SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq (1 + %n)) LoopDispositions: { %loop: Computable }
884b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
885b62e9f63SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq (1 + %n))) LoopDispositions: { %loop: Computable }
886b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
887b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
888b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
889b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
890b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops2
891b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq (1 + %n))
892b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
893b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq (1 + %n))
894b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
895b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
896b62e9f63SNikita Popov;
897b62e9f63SNikita Popoventry:
898b62e9f63SNikita Popov  %add = add i32 %n, 1
899b62e9f63SNikita Popov  br label %loop
900b62e9f63SNikita Popovloop:
901b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
902b62e9f63SNikita Popov  %i.next = add i32 %i, 1
903b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
904b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
905b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %add
906b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
907b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
908b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
909b62e9f63SNikita Popovexit:
910b62e9f63SNikita Popov  ret i32 %i
911b62e9f63SNikita Popov}
912b62e9f63SNikita Popov
913b62e9f63SNikita Popovdefine i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) {
914b62e9f63SNikita Popov; CHECK-LABEL: 'logical_and_implies_multiple_ops3'
915b62e9f63SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_implies_multiple_ops3
916b62e9f63SNikita Popov; CHECK-NEXT:    %add = add i32 %n, 1
917b62e9f63SNikita Popov; CHECK-NEXT:    --> (1 + %n) U: full-set S: full-set
918b62e9f63SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
91947c559d6SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable }
920b62e9f63SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
92147c559d6SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable }
922b62e9f63SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
923b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
924b62e9f63SNikita Popov; CHECK-NEXT:    %cond2 = select i1 %cond, i1 %cond_p2, i1 false
925b62e9f63SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
926b62e9f63SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_implies_multiple_ops3
92747c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
928b62e9f63SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
92947c559d6SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq ((1 + %n) umin %n))
930b62e9f63SNikita Popov; CHECK-NEXT:   Predicates:
931b62e9f63SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
932b62e9f63SNikita Popov;
933b62e9f63SNikita Popoventry:
934b62e9f63SNikita Popov  %add = add i32 %n, 1
935b62e9f63SNikita Popov  br label %loop
936b62e9f63SNikita Popovloop:
937b62e9f63SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
938b62e9f63SNikita Popov  %i.next = add i32 %i, 1
939b62e9f63SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
940b62e9f63SNikita Popov  %cond_p1 = icmp ult i32 %i, %n
941b62e9f63SNikita Popov  %cond_p2 = icmp ult i32 %i, %add
942b62e9f63SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
943b62e9f63SNikita Popov  %cond2 = select i1 %cond, i1 %cond_p2, i1 false
944b62e9f63SNikita Popov  br i1 %cond2, label %loop, label %exit
945b62e9f63SNikita Popovexit:
946b62e9f63SNikita Popov  ret i32 %i
947b62e9f63SNikita Popov}
948b62e9f63SNikita Popov
94933f02de5SNikita Popovdefine i32 @logical_and_not_zero(i16 %n, i32 %m) {
95033f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero'
95133f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero
95233f02de5SNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
95333f02de5SNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
95433f02de5SNikita Popov; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
95533f02de5SNikita Popov; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
95633f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
95718eaff15SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65537) S: [0,65537) Exits: ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) LoopDispositions: { %loop: Computable }
95833f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
95918eaff15SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65538) S: [1,65538) Exits: (1 + ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m))<nuw><nsw> LoopDispositions: { %loop: Computable }
96033f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
96133f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
96233f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero
96318eaff15SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
96433f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65536
96518eaff15SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m)
96633f02de5SNikita Popov; CHECK-NEXT:   Predicates:
96733f02de5SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
96833f02de5SNikita Popov;
96933f02de5SNikita Popoventry:
97033f02de5SNikita Popov  %n.ext = zext i16 %n to i32
97133f02de5SNikita Popov  %n1 = add i32 %n.ext, 1
97233f02de5SNikita Popov  br label %loop
97333f02de5SNikita Popovloop:
97433f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
97533f02de5SNikita Popov  %i.next = add i32 %i, 1
97633f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %n1
97733f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
97833f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
97933f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
98033f02de5SNikita Popovexit:
98133f02de5SNikita Popov  ret i32 %i
98233f02de5SNikita Popov}
98333f02de5SNikita Popov
98433f02de5SNikita Popovdefine i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) {
98533f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero_wrong_order'
98633f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_wrong_order
98733f02de5SNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
98833f02de5SNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
98933f02de5SNikita Popov; CHECK-NEXT:    %n1 = add i32 %n.ext, 1
99033f02de5SNikita Popov; CHECK-NEXT:    --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537)
99133f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
99233f02de5SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65537) S: [0,65537) Exits: (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable }
99333f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
99433f02de5SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65538) S: [1,65538) Exits: (1 + (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable }
99533f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
99633f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
99733f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_wrong_order
99833f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
99933f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65536
100033f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>)
100133f02de5SNikita Popov; CHECK-NEXT:   Predicates:
100233f02de5SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
100333f02de5SNikita Popov;
100433f02de5SNikita Popoventry:
100533f02de5SNikita Popov  %n.ext = zext i16 %n to i32
100633f02de5SNikita Popov  %n1 = add i32 %n.ext, 1
100733f02de5SNikita Popov  br label %loop
100833f02de5SNikita Popovloop:
100933f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
101033f02de5SNikita Popov  %i.next = add i32 %i, 1
101133f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %m
101233f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %n1
101333f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
101433f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
101533f02de5SNikita Popovexit:
101633f02de5SNikita Popov  ret i32 %i
101733f02de5SNikita Popov}
101833f02de5SNikita Popov
101933f02de5SNikita Popovdefine i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) {
102033f02de5SNikita Popov; CHECK-LABEL: 'logical_and_not_zero_needs_context'
102133f02de5SNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_zero_needs_context
102233f02de5SNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
102333f02de5SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable }
102433f02de5SNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
102533f02de5SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable }
102633f02de5SNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
102733f02de5SNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
102833f02de5SNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_zero_needs_context
102933f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (%n umin_seq %m)
103033f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is -1
103133f02de5SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (%n umin_seq %m)
103233f02de5SNikita Popov; CHECK-NEXT:   Predicates:
103333f02de5SNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
103433f02de5SNikita Popov;
103533f02de5SNikita Popoventry:
103633f02de5SNikita Popov  %cmp = icmp ne i32 %n, 0
103733f02de5SNikita Popov  br i1 %cmp, label %loop, label %guard.fail
103833f02de5SNikita Popovloop:
103933f02de5SNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
104033f02de5SNikita Popov  %i.next = add i32 %i, 1
104133f02de5SNikita Popov  %cond_p0 = icmp ult i32 %i, %n
104233f02de5SNikita Popov  %cond_p1 = icmp ult i32 %i, %m
104333f02de5SNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
104433f02de5SNikita Popov  br i1 %cond, label %loop, label %exit
104533f02de5SNikita Popovexit:
104633f02de5SNikita Popov  ret i32 %i
104733f02de5SNikita Popovguard.fail:
104833f02de5SNikita Popov  ret i32 -1
104933f02de5SNikita Popov}
105033f02de5SNikita Popov
10517dddf12fSNikita Popovdefine i32 @logical_and_known_smaller(i16 %n, i16 %m) {
10527dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_smaller'
10537dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller
10547dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
10557dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
10567dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
10577dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
10587dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
10597dddf12fSNikita Popov; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
10607dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1061*68e1ba81SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
10627dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
1063*68e1ba81SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
10647dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10657dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
10667dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller
1067*68e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
10687dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65535
1069*68e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
10707dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
10717dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
10727dddf12fSNikita Popov;
10737dddf12fSNikita Popoventry:
10747dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
10757dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
10767dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65536
10777dddf12fSNikita Popov  br label %loop
10787dddf12fSNikita Popovloop:
10797dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
10807dddf12fSNikita Popov  %i.next = add i32 %i, 1
10817dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
10827dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
10837dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
10847dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
10857dddf12fSNikita Popovexit:
10867dddf12fSNikita Popov  ret i32 %i
10877dddf12fSNikita Popov}
10887dddf12fSNikita Popov
10897dddf12fSNikita Popovdefine i32 @logical_and_known_smaller_equal(i16 %n, i16 %m) {
10907dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_smaller_equal'
10917dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_smaller_equal
10927dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
10937dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
10947dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
10957dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
10967dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
10977dddf12fSNikita Popov; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
10987dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
1099*68e1ba81SNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
11007dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
1101*68e1ba81SNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
11027dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11037dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11047dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_smaller_equal
1105*68e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
11067dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65535
1107*68e1ba81SNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
11087dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
11097dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
11107dddf12fSNikita Popov;
11117dddf12fSNikita Popoventry:
11127dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11137dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11147dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65535
11157dddf12fSNikita Popov  br label %loop
11167dddf12fSNikita Popovloop:
11177dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11187dddf12fSNikita Popov  %i.next = add i32 %i, 1
11197dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
11207dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
11217dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11227dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11237dddf12fSNikita Popovexit:
11247dddf12fSNikita Popov  ret i32 %i
11257dddf12fSNikita Popov}
11267dddf12fSNikita Popov
11277dddf12fSNikita Popovdefine i32 @logical_and_not_known_smaller_equal(i16 %n, i16 %m) {
11287dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_not_known_smaller_equal'
11297dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_smaller_equal
11307dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
11317dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
11327dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11337dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11347dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
11357dddf12fSNikita Popov; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
11367dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11377dddf12fSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%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 }
11387dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11397dddf12fSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%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 }
11407dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11417dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11427dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_smaller_equal
11437dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>)
11447dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65535
11457dddf12fSNikita 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>)
11467dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
11477dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
11487dddf12fSNikita Popov;
11497dddf12fSNikita Popoventry:
11507dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11517dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11527dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65534
11537dddf12fSNikita Popov  br label %loop
11547dddf12fSNikita Popovloop:
11557dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11567dddf12fSNikita Popov  %i.next = add i32 %i, 1
11577dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n.ext
11587dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %m.add
11597dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11607dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11617dddf12fSNikita Popovexit:
11627dddf12fSNikita Popov  ret i32 %i
11637dddf12fSNikita Popov}
11647dddf12fSNikita Popov
11657dddf12fSNikita Popovdefine i32 @logical_and_known_greater(i16 %n, i16 %m) {
11667dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_greater'
11677dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater
11687dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
11697dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
11707dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
11717dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
11727dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65536
11737dddf12fSNikita Popov; CHECK-NEXT:    --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072)
11747dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
11757dddf12fSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
11767dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
11777dddf12fSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
11787dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11797dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
11807dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater
11817dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
11827dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65535
11837dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
11847dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
11857dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
11867dddf12fSNikita Popov;
11877dddf12fSNikita Popoventry:
11887dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
11897dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
11907dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65536
11917dddf12fSNikita Popov  br label %loop
11927dddf12fSNikita Popovloop:
11937dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
11947dddf12fSNikita Popov  %i.next = add i32 %i, 1
11957dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
11967dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
11977dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
11987dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
11997dddf12fSNikita Popovexit:
12007dddf12fSNikita Popov  ret i32 %i
12017dddf12fSNikita Popov}
12027dddf12fSNikita Popov
12037dddf12fSNikita Popovdefine i32 @logical_and_known_greater_equal(i16 %n, i16 %m) {
12047dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_known_greater_equal'
12057dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_known_greater_equal
12067dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
12077dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
12087dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
12097dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
12107dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65535
12117dddf12fSNikita Popov; CHECK-NEXT:    --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071)
12127dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12137dddf12fSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable }
12147dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12157dddf12fSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,65537) S: [1,65537) Exits: (1 + (zext i16 %n to i32))<nuw><nsw> LoopDispositions: { %loop: Computable }
12167dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12177dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
12187dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_known_greater_equal
12197dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is (zext i16 %n to i32)
12207dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65535
12217dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32)
12227dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
12237dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
12247dddf12fSNikita Popov;
12257dddf12fSNikita Popoventry:
12267dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
12277dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
12287dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65535
12297dddf12fSNikita Popov  br label %loop
12307dddf12fSNikita Popovloop:
12317dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12327dddf12fSNikita Popov  %i.next = add i32 %i, 1
12337dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
12347dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
12357dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12367dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12377dddf12fSNikita Popovexit:
12387dddf12fSNikita Popov  ret i32 %i
12397dddf12fSNikita Popov}
12407dddf12fSNikita Popov
12417dddf12fSNikita Popovdefine i32 @logical_and_not_known_greater_equal(i16 %n, i16 %m) {
12427dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_not_known_greater_equal'
12437dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_not_known_greater_equal
12447dddf12fSNikita Popov; CHECK-NEXT:    %n.ext = zext i16 %n to i32
12457dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %n to i32) U: [0,65536) S: [0,65536)
12467dddf12fSNikita Popov; CHECK-NEXT:    %m.ext = zext i16 %m to i32
12477dddf12fSNikita Popov; CHECK-NEXT:    --> (zext i16 %m to i32) U: [0,65536) S: [0,65536)
12487dddf12fSNikita Popov; CHECK-NEXT:    %m.add = add i32 %m.ext, 65534
12497dddf12fSNikita Popov; CHECK-NEXT:    --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070)
12507dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12517dddf12fSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%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 }
12527dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12537dddf12fSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%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 }
12547dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12557dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }
12567dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_not_known_greater_equal
12577dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
12587dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 65535
12597dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>)
12607dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
12617dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
12627dddf12fSNikita Popov;
12637dddf12fSNikita Popoventry:
12647dddf12fSNikita Popov  %n.ext = zext i16 %n to i32
12657dddf12fSNikita Popov  %m.ext = zext i16 %m to i32
12667dddf12fSNikita Popov  %m.add = add i32 %m.ext, 65534
12677dddf12fSNikita Popov  br label %loop
12687dddf12fSNikita Popovloop:
12697dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12707dddf12fSNikita Popov  %i.next = add i32 %i, 1
12717dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %m.add
12727dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n.ext
12737dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12747dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
12757dddf12fSNikita Popovexit:
12767dddf12fSNikita Popov  ret i32 %i
12777dddf12fSNikita Popov}
12787dddf12fSNikita Popov
12797dddf12fSNikita Popovdefine i32 @logical_and_zero_arg1(i32 %n) {
12807dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_zero_arg1'
12817dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg1
12827dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
12837dddf12fSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
12847dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
12857dddf12fSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
12867dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
12877dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
12887dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg1
12897dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is 0
12907dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 0
12917dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is 0
12927dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
12937dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
12947dddf12fSNikita Popov;
12957dddf12fSNikita Popoventry:
12967dddf12fSNikita Popov  br label %loop
12977dddf12fSNikita Popovloop:
12987dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
12997dddf12fSNikita Popov  %i.next = add i32 %i, 1
13007dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, 0
13017dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, %n
13027dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13037dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
13047dddf12fSNikita Popovexit:
13057dddf12fSNikita Popov  ret i32 %i
13067dddf12fSNikita Popov}
13077dddf12fSNikita Popov
13087dddf12fSNikita Popovdefine i32 @logical_and_zero_arg2(i32 %n) {
13097dddf12fSNikita Popov; CHECK-LABEL: 'logical_and_zero_arg2'
13107dddf12fSNikita Popov; CHECK-NEXT:  Classifying expressions for: @logical_and_zero_arg2
13117dddf12fSNikita Popov; CHECK-NEXT:    %i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
13127dddf12fSNikita Popov; CHECK-NEXT:    --> {0,+,1}<%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable }
13137dddf12fSNikita Popov; CHECK-NEXT:    %i.next = add i32 %i, 1
13147dddf12fSNikita Popov; CHECK-NEXT:    --> {1,+,1}<%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable }
13157dddf12fSNikita Popov; CHECK-NEXT:    %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13167dddf12fSNikita Popov; CHECK-NEXT:    --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant }
13177dddf12fSNikita Popov; CHECK-NEXT:  Determining loop execution counts for: @logical_and_zero_arg2
13187dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: backedge-taken count is 0
13197dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: max backedge-taken count is 0
13207dddf12fSNikita Popov; CHECK-NEXT:  Loop %loop: Predicated backedge-taken count is 0
13217dddf12fSNikita Popov; CHECK-NEXT:   Predicates:
13227dddf12fSNikita Popov; CHECK:       Loop %loop: Trip multiple is 1
13237dddf12fSNikita Popov;
13247dddf12fSNikita Popoventry:
13257dddf12fSNikita Popov  br label %loop
13267dddf12fSNikita Popovloop:
13277dddf12fSNikita Popov  %i = phi i32 [0, %entry], [%i.next, %loop]
13287dddf12fSNikita Popov  %i.next = add i32 %i, 1
13297dddf12fSNikita Popov  %cond_p0 = icmp ult i32 %i, %n
13307dddf12fSNikita Popov  %cond_p1 = icmp ult i32 %i, 0
13317dddf12fSNikita Popov  %cond = select i1 %cond_p0, i1 %cond_p1, i1 false
13327dddf12fSNikita Popov  br i1 %cond, label %loop, label %exit
13337dddf12fSNikita Popovexit:
13347dddf12fSNikita Popov  ret i32 %i
13357dddf12fSNikita Popov}
13367dddf12fSNikita Popov
13377dddf12fSNikita Popov
1338138d5c75SRoman Lebedevdeclare i32 @llvm.umin.i32(i32, i32)
1339