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