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