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