1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt -disable-output "-passes=print<scalar-evolution>" %s 2>&1 | FileCheck %s 3 4define i32 @logical_and_2ops(i32 %n, i32 %m) { 5; CHECK-LABEL: 'logical_and_2ops' 6; CHECK-NEXT: Classifying expressions for: @logical_and_2ops 7; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 8; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 9; CHECK-NEXT: %i.next = add i32 %i, 1 10; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 11; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 12; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 13; CHECK-NEXT: Determining loop execution counts for: @logical_and_2ops 14; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 15; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 16; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m) 17; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 18; CHECK-NEXT: Predicates: 19; CHECK-NEXT: Loop %loop: Trip multiple is 1 20; 21entry: 22 br label %loop 23loop: 24 %i = phi i32 [0, %entry], [%i.next, %loop] 25 %i.next = add i32 %i, 1 26 %cond_p0 = icmp ult i32 %i, %n 27 %cond_p1 = icmp ult i32 %i, %m 28 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 29 br i1 %cond, label %loop, label %exit 30exit: 31 ret i32 %i 32} 33 34define i32 @logical_or_2ops(i32 %n, i32 %m) { 35; CHECK-LABEL: 'logical_or_2ops' 36; CHECK-NEXT: Classifying expressions for: @logical_or_2ops 37; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 38; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 39; CHECK-NEXT: %i.next = add i32 %i, 1 40; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 41; CHECK-NEXT: %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 42; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 43; CHECK-NEXT: Determining loop execution counts for: @logical_or_2ops 44; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 45; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 46; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m) 47; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 48; CHECK-NEXT: Predicates: 49; CHECK-NEXT: Loop %loop: Trip multiple is 1 50; 51entry: 52 br label %loop 53loop: 54 %i = phi i32 [0, %entry], [%i.next, %loop] 55 %i.next = add i32 %i, 1 56 %cond_p0 = icmp uge i32 %i, %n 57 %cond_p1 = icmp uge i32 %i, %m 58 %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 59 br i1 %cond, label %exit, label %loop 60exit: 61 ret i32 %i 62} 63 64define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) { 65; CHECK-LABEL: 'logical_and_3ops' 66; CHECK-NEXT: Classifying expressions for: @logical_and_3ops 67; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 68; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable } 69; CHECK-NEXT: %i.next = add i32 %i, 1 70; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable } 71; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false 72; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 73; CHECK-NEXT: %cond = select i1 %cond_p3, i1 %cond_p2, i1 false 74; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 75; CHECK-NEXT: Determining loop execution counts for: @logical_and_3ops 76; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k) 77; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 78; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k) 79; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k) 80; CHECK-NEXT: Predicates: 81; CHECK-NEXT: Loop %loop: Trip multiple is 1 82; 83entry: 84 br label %loop 85loop: 86 %i = phi i32 [0, %entry], [%i.next, %loop] 87 %i.next = add i32 %i, 1 88 %cond_p0 = icmp ult i32 %i, %n 89 %cond_p1 = icmp ult i32 %i, %m 90 %cond_p2 = icmp ult i32 %i, %k 91 %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false 92 %cond = select i1 %cond_p3, i1 %cond_p2, i1 false 93 br i1 %cond, label %loop, label %exit 94exit: 95 ret i32 %i 96} 97 98define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) { 99; CHECK-LABEL: 'logical_or_3ops' 100; CHECK-NEXT: Classifying expressions for: @logical_or_3ops 101; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 102; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable } 103; CHECK-NEXT: %i.next = add i32 %i, 1 104; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable } 105; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 106; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 107; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 108; 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 } 109; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops 110; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k) 111; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 112; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k) 113; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k) 114; CHECK-NEXT: Predicates: 115; CHECK-NEXT: Loop %loop: Trip multiple is 1 116; 117entry: 118 br label %loop 119loop: 120 %i = phi i32 [0, %entry], [%i.next, %loop] 121 %i.next = add i32 %i, 1 122 %cond_p0 = icmp uge i32 %i, %n 123 %cond_p1 = icmp uge i32 %i, %m 124 %cond_p2 = icmp uge i32 %i, %k 125 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 126 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 127 br i1 %cond, label %exit, label %loop 128exit: 129 ret i32 %i 130} 131 132define i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) { 133; CHECK-LABEL: 'logical_or_3ops_duplicate' 134; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_duplicate 135; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 136; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable } 137; CHECK-NEXT: %i.next = add i32 %i, 1 138; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable } 139; CHECK-NEXT: %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1 140; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 141; CHECK-NEXT: %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2 142; 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 } 143; CHECK-NEXT: %cond = select i1 %cond_p5, i1 true, i1 %cond_p3 144; 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 } 145; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_duplicate 146; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k) 147; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 148; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m umin_seq %k) 149; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k) 150; CHECK-NEXT: Predicates: 151; CHECK-NEXT: Loop %loop: Trip multiple is 1 152; 153entry: 154 br label %loop 155loop: 156 %i = phi i32 [0, %entry], [%i.next, %loop] 157 %i.next = add i32 %i, 1 158 %cond_p0 = icmp uge i32 %i, %n 159 %cond_p1 = icmp uge i32 %i, %m 160 %cond_p2 = icmp uge i32 %i, %n 161 %cond_p3 = icmp uge i32 %i, %k 162 %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1 163 %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2 164 %cond = select i1 %cond_p5, i1 true, i1 %cond_p3 165 br i1 %cond, label %exit, label %loop 166exit: 167 ret i32 %i 168} 169 170define i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) { 171; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand' 172; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand 173; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 174; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable } 175; CHECK-NEXT: %i.next = add i32 %i, 1 176; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable } 177; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 178; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 179; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 180; CHECK-NEXT: --> (true + ((true + %cond_p0) umin (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 181; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 182; 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 } 183; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand 184; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k) 185; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 186; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k) 187; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k) 188; CHECK-NEXT: Predicates: 189; CHECK-NEXT: Loop %loop: Trip multiple is 1 190; 191entry: 192 br label %loop 193loop: 194 %i = phi i32 [0, %entry], [%i.next, %loop] 195 %i.next = add i32 %i, 1 196 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 197 %cond_p0 = icmp uge i32 %i, %umin 198 %cond_p1 = icmp uge i32 %i, %n 199 %cond_p2 = icmp uge i32 %i, %k 200 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 201 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 202 br i1 %cond, label %exit, label %loop 203exit: 204 ret i32 %i 205} 206 207define i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) { 208; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand' 209; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_redundant_umin_operand 210; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 211; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable } 212; CHECK-NEXT: %i.next = add i32 %i, 1 213; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable } 214; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 215; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 216; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 217; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 218; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 219; 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 } 220; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand 221; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m) 222; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 223; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %k umin_seq %m) 224; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %k umin_seq %m) 225; CHECK-NEXT: Predicates: 226; CHECK-NEXT: Loop %loop: Trip multiple is 1 227; 228entry: 229 br label %loop 230loop: 231 %i = phi i32 [0, %entry], [%i.next, %loop] 232 %i.next = add i32 %i, 1 233 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 234 %cond_p0 = icmp uge i32 %i, %n 235 %cond_p1 = icmp uge i32 %i, %k 236 %cond_p2 = icmp uge i32 %i, %umin 237 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 238 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 239 br i1 %cond, label %exit, label %loop 240exit: 241 ret i32 %i 242} 243 244define i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) { 245; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins' 246; CHECK-NEXT: Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins 247; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 248; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k umin_seq %q) LoopDispositions: { %loop: Computable } 249; CHECK-NEXT: %i.next = add i32 %i, 1 250; 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 } 251; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 252; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 253; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q) 254; CHECK-NEXT: --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant } 255; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 256; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 257; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 258; 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 } 259; CHECK-NEXT: Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins 260; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q) 261; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 262; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q) 263; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q) 264; CHECK-NEXT: Predicates: 265; CHECK-NEXT: Loop %loop: Trip multiple is 1 266; 267entry: 268 br label %loop 269loop: 270 %i = phi i32 [0, %entry], [%i.next, %loop] 271 %i.next = add i32 %i, 1 272 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 273 %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q) 274 %cond_p0 = icmp uge i32 %i, %umin 275 %cond_p1 = icmp uge i32 %i, %k 276 %cond_p2 = icmp uge i32 %i, %umin2 277 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 278 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 279 br i1 %cond, label %exit, label %loop 280exit: 281 ret i32 %i 282} 283 284define i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) { 285; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin' 286; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin 287; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 288; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable } 289; CHECK-NEXT: %i.next = add i32 %i, 1 290; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable } 291; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 292; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 293; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k) 294; CHECK-NEXT: --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant } 295; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 296; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 297; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 298; 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 } 299; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin 300; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k) 301; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 302; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n umin %m) umin_seq %k) 303; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k) 304; CHECK-NEXT: Predicates: 305; CHECK-NEXT: Loop %loop: Trip multiple is 1 306; 307entry: 308 br label %loop 309loop: 310 %i = phi i32 [0, %entry], [%i.next, %loop] 311 %i.next = add i32 %i, 1 312 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 313 %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k) 314 %cond_p0 = icmp uge i32 %i, %umin 315 %cond_p1 = icmp uge i32 %i, %k 316 %cond_p2 = icmp uge i32 %i, %umin2 317 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 318 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 319 br i1 %cond, label %exit, label %loop 320exit: 321 ret i32 %i 322} 323 324define i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) { 325; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin' 326; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_partially_redundant_umin 327; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 328; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable } 329; CHECK-NEXT: %i.next = add i32 %i, 1 330; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable } 331; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 332; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 333; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k) 334; CHECK-NEXT: --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant } 335; CHECK-NEXT: %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 336; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 337; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin 338; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k)) 339; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 340; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%m umin %k)) 341; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq (%m umin %k)) 342; CHECK-NEXT: Predicates: 343; CHECK-NEXT: Loop %loop: Trip multiple is 1 344; 345entry: 346 br label %loop 347loop: 348 %i = phi i32 [0, %entry], [%i.next, %loop] 349 %i.next = add i32 %i, 1 350 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 351 %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k) 352 %cond_p0 = icmp uge i32 %i, %n 353 %cond_p1 = icmp uge i32 %i, %umin2 354 %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 355 br i1 %cond, label %exit, label %loop 356exit: 357 ret i32 %i 358} 359 360define i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { 361; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq' 362; CHECK-NEXT: Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq 363; CHECK-NEXT: %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ] 364; CHECK-NEXT: --> {0,+,1}<%first.loop> U: full-set S: full-set Exits: (%e umin_seq %d umin_seq %a) LoopDispositions: { %first.loop: Computable } 365; CHECK-NEXT: %first.i.next = add i32 %first.i, 1 366; 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 } 367; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 368; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant } 369; CHECK-NEXT: %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2 370; 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 } 371; CHECK-NEXT: %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ] 372; 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 } 373; CHECK-NEXT: %i.next = add i32 %i, 1 374; 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 } 375; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d) 376; CHECK-NEXT: --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant } 377; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i) 378; 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 } 379; CHECK-NEXT: %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6 380; CHECK-NEXT: --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 381; CHECK-NEXT: %cond = select i1 %cond_p8, i1 true, i1 %cond_p7 382; 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 } 383; CHECK-NEXT: Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq 384; CHECK-NEXT: Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) 385; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 386; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) 387; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) 388; CHECK-NEXT: Predicates: 389; CHECK-NEXT: Loop %loop: Trip multiple is 1 390; CHECK-NEXT: Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a) 391; CHECK-NEXT: Loop %first.loop: constant max backedge-taken count is i32 -1 392; CHECK-NEXT: Loop %first.loop: symbolic max backedge-taken count is (%e umin_seq %d umin_seq %a) 393; CHECK-NEXT: Loop %first.loop: Predicated backedge-taken count is (%e umin_seq %d umin_seq %a) 394; CHECK-NEXT: Predicates: 395; CHECK-NEXT: Loop %first.loop: Trip multiple is 1 396; 397entry: 398 br label %first.loop 399first.loop: 400 %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop] 401 %first.i.next = add i32 %first.i, 1 402 %cond_p0 = icmp uge i32 %first.i, %e 403 %cond_p1 = icmp uge i32 %first.i, %d 404 %cond_p2 = icmp uge i32 %first.i, %a 405 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 406 %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2 407 br i1 %cond_p4, label %first.loop.exit, label %first.loop 408first.loop.exit: 409 br label %loop 410loop: 411 %i = phi i32 [0, %first.loop.exit], [%i.next, %loop] 412 %i.next = add i32 %i, 1 413 %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d) 414 %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i) 415 %cond_p5 = icmp uge i32 %i, %a 416 %cond_p6 = icmp uge i32 %i, %b 417 %cond_p7 = icmp uge i32 %i, %umin2 418 %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6 419 %cond = select i1 %cond_p8, i1 true, i1 %cond_p7 420 br i1 %cond, label %exit, label %loop 421exit: 422 ret i32 %i 423} 424 425define i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) { 426; CHECK-LABEL: 'logical_and_2ops_and_constant' 427; CHECK-NEXT: Classifying expressions for: @logical_and_2ops_and_constant 428; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 429; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable } 430; CHECK-NEXT: %i.next = add i32 %i, 1 431; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable } 432; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 42) 433; CHECK-NEXT: --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant } 434; CHECK-NEXT: %cond = select i1 %cond_p1, i1 true, i1 %cond_p0 435; CHECK-NEXT: --> (true + ((true + %cond_p1) umin (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 436; CHECK-NEXT: Determining loop execution counts for: @logical_and_2ops_and_constant 437; CHECK-NEXT: Loop %loop: backedge-taken count is (42 umin %n) 438; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 42 439; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (42 umin %n) 440; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (42 umin %n) 441; CHECK-NEXT: Predicates: 442; CHECK-NEXT: Loop %loop: Trip multiple is 1 443; 444entry: 445 br label %loop 446loop: 447 %i = phi i32 [0, %entry], [%i.next, %loop] 448 %i.next = add i32 %i, 1 449 %umin = call i32 @llvm.umin.i32(i32 %n, i32 42) 450 %cond_p0 = icmp uge i32 %i, %umin 451 %cond_p1 = icmp uge i32 %i, %n 452 %cond = select i1 %cond_p1, i1 true, i1 %cond_p0 453 br i1 %cond, label %exit, label %loop 454exit: 455 ret i32 %i 456} 457 458define i32 @computeSCEVAtScope(i32 %d.0) { 459; CHECK-LABEL: 'computeSCEVAtScope' 460; CHECK-NEXT: Classifying expressions for: @computeSCEVAtScope 461; CHECK-NEXT: %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ] 462; CHECK-NEXT: --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 463; CHECK-NEXT: %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ] 464; CHECK-NEXT: --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 465; CHECK-NEXT: %0 = select i1 %tobool1, i1 %tobool2, i1 false 466; CHECK-NEXT: --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant } 467; CHECK-NEXT: %inc = add nsw i32 %d.1, 1 468; CHECK-NEXT: --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 469; CHECK-NEXT: %inc3 = add nsw i32 %e.1, 1 470; CHECK-NEXT: --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 471; CHECK-NEXT: %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ] 472; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant } 473; CHECK-NEXT: %inc8 = add i32 %f.1, 1 474; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant } 475; CHECK-NEXT: Determining loop execution counts for: @computeSCEVAtScope 476; CHECK-NEXT: Loop %for.cond: backedge-taken count is (-1 * %d.0) 477; CHECK-NEXT: Loop %for.cond: constant max backedge-taken count is i32 -1 478; CHECK-NEXT: Loop %for.cond: symbolic max backedge-taken count is (-1 * %d.0) 479; CHECK-NEXT: Loop %for.cond: Predicated backedge-taken count is (-1 * %d.0) 480; CHECK-NEXT: Predicates: 481; CHECK-NEXT: Loop %for.cond: Trip multiple is 1 482; CHECK-NEXT: Loop %for.cond4: backedge-taken count is 0 483; CHECK-NEXT: Loop %for.cond4: constant max backedge-taken count is i32 0 484; CHECK-NEXT: Loop %for.cond4: symbolic max backedge-taken count is 0 485; CHECK-NEXT: Loop %for.cond4: Predicated backedge-taken count is 0 486; CHECK-NEXT: Predicates: 487; CHECK-NEXT: Loop %for.cond4: Trip multiple is 1 488; CHECK-NEXT: Loop %while.cond: <multiple exits> Unpredictable backedge-taken count. 489; CHECK-NEXT: Loop %while.cond: Unpredictable constant max backedge-taken count. 490; CHECK-NEXT: Loop %while.cond: Unpredictable symbolic max backedge-taken count. 491; CHECK-NEXT: Loop %while.cond: Unpredictable predicated backedge-taken count. 492; 493entry: 494 br label %while.cond 495 496while.cond.loopexit: ; preds = %for.cond4 497 br label %while.cond 498 499while.cond: ; preds = %while.cond.loopexit, %entry 500 br label %for.cond.preheader 501 502for.cond.preheader: ; preds = %while.cond 503 br label %for.cond 504 505for.cond: ; preds = %for.body, %for.cond.preheader 506 %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ] 507 %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ] 508 %tobool1 = icmp ne i32 %e.1, 0 509 %tobool2 = icmp ne i32 %d.1, 0 510 %0 = select i1 %tobool1, i1 %tobool2, i1 false 511 br i1 %0, label %for.body, label %for.cond4.preheader 512 513for.cond4.preheader: ; preds = %for.cond 514 br label %for.cond4 515 516for.body: ; preds = %for.cond 517 %inc = add nsw i32 %d.1, 1 518 %inc3 = add nsw i32 %e.1, 1 519 br label %for.cond 520 521for.cond4: ; preds = %for.body5, %for.cond4.preheader 522 %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ] 523 %exitcond.not = icmp eq i32 %f.1, %e.1 524 br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5 525 526for.body5: ; preds = %for.cond4 527 %inc8 = add i32 %f.1, 1 528 br label %for.cond4 529} 530 531define i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, ptr %ptr) { 532; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity' 533; CHECK-NEXT: Classifying expressions for: @uminseq_vs_ptrtoint_complexity 534; CHECK-NEXT: %i = phi i64 [ 0, %entry ], [ %i.next, %loop ] 535; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 536; CHECK-NEXT: %i.next = add i64 %i, 1 537; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 538; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 539; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 540; CHECK-NEXT: %ptr.int = ptrtoint ptr %ptr to i64 541; CHECK-NEXT: --> (ptrtoint ptr %ptr to i64) U: full-set S: full-set 542; CHECK-NEXT: %r = add i64 %i, %ptr.int 543; 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 544; CHECK-NEXT: Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity 545; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 546; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 -1 547; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m) 548; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 549; CHECK-NEXT: Predicates: 550; CHECK-NEXT: Loop %loop: Trip multiple is 1 551; 552entry: 553 br label %loop 554loop: 555 %i = phi i64 [0, %entry], [%i.next, %loop] 556 %i.next = add i64 %i, 1 557 %cond_p0 = icmp ult i64 %i, %n 558 %cond_p1 = icmp ult i64 %i, %m 559 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 560 br i1 %cond, label %loop, label %exit 561exit: 562 %ptr.int = ptrtoint ptr %ptr to i64 563 %r = add i64 %i, %ptr.int 564 ret i64 %r 565} 566 567define i32 @logical_and_implies_poison1(i32 %n) { 568; CHECK-LABEL: 'logical_and_implies_poison1' 569; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison1 570; CHECK-NEXT: %add = add i32 %n, 1 571; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 572; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 573; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable } 574; CHECK-NEXT: %i.next = add i32 %i, 1 575; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable } 576; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 577; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 578; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison1 579; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + %n) umin %n) 580; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 581; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n) 582; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n) 583; CHECK-NEXT: Predicates: 584; CHECK-NEXT: Loop %loop: Trip multiple is 1 585; 586entry: 587 %add = add i32 %n, 1 588 br label %loop 589loop: 590 %i = phi i32 [0, %entry], [%i.next, %loop] 591 %i.next = add i32 %i, 1 592 %cond_p0 = icmp ult i32 %i, %n 593 %cond_p1 = icmp ult i32 %i, %add 594 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 595 br i1 %cond, label %loop, label %exit 596exit: 597 ret i32 %i 598} 599 600define i32 @logical_and_implies_poison2(i32 %n) { 601; CHECK-LABEL: 'logical_and_implies_poison2' 602; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison2 603; CHECK-NEXT: %add = add i32 %n, 1 604; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 605; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 606; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable } 607; CHECK-NEXT: %i.next = add i32 %i, 1 608; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable } 609; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 610; CHECK-NEXT: --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 611; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison2 612; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + %n) umin %n) 613; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 614; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + %n) umin %n) 615; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n) 616; CHECK-NEXT: Predicates: 617; CHECK-NEXT: Loop %loop: Trip multiple is 1 618; 619entry: 620 %add = add i32 %n, 1 621 br label %loop 622loop: 623 %i = phi i32 [0, %entry], [%i.next, %loop] 624 %i.next = add i32 %i, 1 625 %cond_p0 = icmp ult i32 %i, %add 626 %cond_p1 = icmp ult i32 %i, %n 627 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 628 br i1 %cond, label %loop, label %exit 629exit: 630 ret i32 %i 631} 632 633define i32 @logical_and_implies_poison3(i32 %n, i32 %m) { 634; CHECK-LABEL: 'logical_and_implies_poison3' 635; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison3 636; CHECK-NEXT: %add = add i32 %n, %m 637; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 638; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 639; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable } 640; CHECK-NEXT: %i.next = add i32 %i, 1 641; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable } 642; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 643; CHECK-NEXT: --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 644; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison3 645; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin %n) 646; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 647; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin %n) 648; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin %n) 649; CHECK-NEXT: Predicates: 650; CHECK-NEXT: Loop %loop: Trip multiple is 1 651; 652entry: 653 %add = add i32 %n, %m 654 br label %loop 655loop: 656 %i = phi i32 [0, %entry], [%i.next, %loop] 657 %i.next = add i32 %i, 1 658 %cond_p0 = icmp ult i32 %i, %add 659 %cond_p1 = icmp ult i32 %i, %n 660 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 661 br i1 %cond, label %loop, label %exit 662exit: 663 ret i32 %i 664} 665 666define i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) { 667; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction' 668; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_wrong_direction 669; CHECK-NEXT: %add = add i32 %n, %m 670; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 671; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 672; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable } 673; CHECK-NEXT: %i.next = add i32 %i, 1 674; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable } 675; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 676; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 677; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_wrong_direction 678; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq (%n + %m)) 679; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 680; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq (%n + %m)) 681; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq (%n + %m)) 682; CHECK-NEXT: Predicates: 683; CHECK-NEXT: Loop %loop: Trip multiple is 1 684; 685entry: 686 %add = add i32 %n, %m 687 br label %loop 688loop: 689 %i = phi i32 [0, %entry], [%i.next, %loop] 690 %i.next = add i32 %i, 1 691 %cond_p0 = icmp ult i32 %i, %n 692 %cond_p1 = icmp ult i32 %i, %add 693 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 694 br i1 %cond, label %loop, label %exit 695exit: 696 ret i32 %i 697} 698 699define i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) { 700; CHECK-LABEL: 'logical_and_implies_poison_noundef' 701; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_noundef 702; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 703; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable } 704; CHECK-NEXT: %i.next = add i32 %i, 1 705; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable } 706; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 707; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 708; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_noundef 709; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin %m) 710; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 711; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin %m) 712; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin %m) 713; CHECK-NEXT: Predicates: 714; CHECK-NEXT: Loop %loop: Trip multiple is 1 715; 716entry: 717 br label %loop 718loop: 719 %i = phi i32 [0, %entry], [%i.next, %loop] 720 %i.next = add i32 %i, 1 721 %cond_p0 = icmp ult i32 %i, %n 722 %cond_p1 = icmp ult i32 %i, %m 723 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 724 br i1 %cond, label %loop, label %exit 725exit: 726 ret i32 %i 727} 728 729define i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) { 730; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction' 731; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction 732; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 733; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable } 734; CHECK-NEXT: %i.next = add i32 %i, 1 735; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable } 736; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 737; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 738; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction 739; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq %n) 740; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 741; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%m umin_seq %n) 742; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%m umin_seq %n) 743; CHECK-NEXT: Predicates: 744; CHECK-NEXT: Loop %loop: Trip multiple is 1 745; 746entry: 747 br label %loop 748loop: 749 %i = phi i32 [0, %entry], [%i.next, %loop] 750 %i.next = add i32 %i, 1 751 %cond_p0 = icmp ult i32 %i, %m 752 %cond_p1 = icmp ult i32 %i, %n 753 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 754 br i1 %cond, label %loop, label %exit 755exit: 756 ret i32 %i 757} 758 759define i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) { 760; CHECK-LABEL: 'logical_and_implies_poison_complex1' 761; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex1 762; CHECK-NEXT: %add = add i32 %n, %m 763; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 764; CHECK-NEXT: %add1 = add i32 %add, 1 765; CHECK-NEXT: --> (1 + %n + %m) U: full-set S: full-set 766; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 767; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable } 768; CHECK-NEXT: %i.next = add i32 %i, 1 769; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable } 770; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 771; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 772; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex1 773; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m)) 774; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 775; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (1 + %n + %m)) 776; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (1 + %n + %m)) 777; CHECK-NEXT: Predicates: 778; CHECK-NEXT: Loop %loop: Trip multiple is 1 779; 780entry: 781 %add = add i32 %n, %m 782 %add1 = add i32 %add, 1 783 br label %loop 784loop: 785 %i = phi i32 [0, %entry], [%i.next, %loop] 786 %i.next = add i32 %i, 1 787 %cond_p0 = icmp ult i32 %i, %add1 788 %cond_p1 = icmp ult i32 %i, %add 789 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 790 br i1 %cond, label %loop, label %exit 791exit: 792 ret i32 %i 793} 794 795define i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) { 796; CHECK-LABEL: 'logical_and_implies_poison_complex2' 797; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex2 798; CHECK-NEXT: %add = add i32 %n, %m 799; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 800; CHECK-NEXT: %add1 = add i32 %add, %l 801; CHECK-NEXT: --> (%n + %m + %l) U: full-set S: full-set 802; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 803; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable } 804; CHECK-NEXT: %i.next = add i32 %i, 1 805; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable } 806; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 807; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 808; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex2 809; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l)) 810; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 811; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin (%n + %m + %l)) 812; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (%n + %m + %l)) 813; CHECK-NEXT: Predicates: 814; CHECK-NEXT: Loop %loop: Trip multiple is 1 815; 816entry: 817 %add = add i32 %n, %m 818 %add1 = add i32 %add, %l 819 br label %loop 820loop: 821 %i = phi i32 [0, %entry], [%i.next, %loop] 822 %i.next = add i32 %i, 1 823 %cond_p0 = icmp ult i32 %i, %add1 824 %cond_p1 = icmp ult i32 %i, %add 825 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 826 br i1 %cond, label %loop, label %exit 827exit: 828 ret i32 %i 829} 830 831define i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) { 832; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction' 833; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction 834; CHECK-NEXT: %add = add i32 %n, %m 835; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 836; CHECK-NEXT: %add1 = add i32 %add, %l 837; CHECK-NEXT: --> (%n + %m + %l) U: full-set S: full-set 838; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 839; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable } 840; CHECK-NEXT: %i.next = add i32 %i, 1 841; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable } 842; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 843; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 844; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction 845; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l)) 846; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 847; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l)) 848; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l)) 849; CHECK-NEXT: Predicates: 850; CHECK-NEXT: Loop %loop: Trip multiple is 1 851; 852entry: 853 %add = add i32 %n, %m 854 %add1 = add i32 %add, %l 855 br label %loop 856loop: 857 %i = phi i32 [0, %entry], [%i.next, %loop] 858 %i.next = add i32 %i, 1 859 %cond_p0 = icmp ult i32 %i, %add 860 %cond_p1 = icmp ult i32 %i, %add1 861 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 862 br i1 %cond, label %loop, label %exit 863exit: 864 ret i32 %i 865} 866 867define i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) { 868; CHECK-LABEL: 'logical_and_implies_multiple_ops' 869; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops 870; CHECK-NEXT: %add = add i32 %n, 1 871; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 872; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 873; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable } 874; CHECK-NEXT: %i.next = add i32 %i, 1 875; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable } 876; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 877; CHECK-NEXT: --> (%cond_p0 umin %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 878; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false 879; CHECK-NEXT: --> ((%cond_p0 umin %cond_p1) umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 880; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops 881; CHECK-NEXT: Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m) 882; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 883; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((1 + %n) umin %n) umin_seq %m) 884; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (((1 + %n) umin %n) umin_seq %m) 885; CHECK-NEXT: Predicates: 886; CHECK-NEXT: Loop %loop: Trip multiple is 1 887; 888entry: 889 %add = add i32 %n, 1 890 br label %loop 891loop: 892 %i = phi i32 [0, %entry], [%i.next, %loop] 893 %i.next = add i32 %i, 1 894 %cond_p0 = icmp ult i32 %i, %n 895 %cond_p1 = icmp ult i32 %i, %add 896 %cond_p2 = icmp ult i32 %i, %m 897 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 898 %cond2 = select i1 %cond, i1 %cond_p2, i1 false 899 br i1 %cond2, label %loop, label %exit 900exit: 901 ret i32 %i 902} 903 904define i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) { 905; CHECK-LABEL: 'logical_and_implies_multiple_ops2' 906; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops2 907; CHECK-NEXT: %add = add i32 %n, 1 908; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 909; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 910; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq ((1 + %n) umin %m)) LoopDispositions: { %loop: Computable } 911; CHECK-NEXT: %i.next = add i32 %i, 1 912; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq ((1 + %n) umin %m))) LoopDispositions: { %loop: Computable } 913; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 914; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 915; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false 916; CHECK-NEXT: --> (%cond_p0 umin_seq (%cond_p1 umin %cond_p2)) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 917; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops2 918; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq ((1 + %n) umin %m)) 919; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 920; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq ((1 + %n) umin %m)) 921; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq ((1 + %n) umin %m)) 922; CHECK-NEXT: Predicates: 923; CHECK-NEXT: Loop %loop: Trip multiple is 1 924; 925entry: 926 %add = add i32 %n, 1 927 br label %loop 928loop: 929 %i = phi i32 [0, %entry], [%i.next, %loop] 930 %i.next = add i32 %i, 1 931 %cond_p0 = icmp ult i32 %i, %n 932 %cond_p1 = icmp ult i32 %i, %m 933 %cond_p2 = icmp ult i32 %i, %add 934 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 935 %cond2 = select i1 %cond, i1 %cond_p2, i1 false 936 br i1 %cond2, label %loop, label %exit 937exit: 938 ret i32 %i 939} 940 941define i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) { 942; CHECK-LABEL: 'logical_and_implies_multiple_ops3' 943; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops3 944; CHECK-NEXT: %add = add i32 %n, 1 945; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 946; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 947; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable } 948; CHECK-NEXT: %i.next = add i32 %i, 1 949; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable } 950; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 951; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 952; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false 953; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 954; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops3 955; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n)) 956; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 957; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%m umin_seq ((1 + %n) umin %n)) 958; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%m umin_seq ((1 + %n) umin %n)) 959; CHECK-NEXT: Predicates: 960; CHECK-NEXT: Loop %loop: Trip multiple is 1 961; 962entry: 963 %add = add i32 %n, 1 964 br label %loop 965loop: 966 %i = phi i32 [0, %entry], [%i.next, %loop] 967 %i.next = add i32 %i, 1 968 %cond_p0 = icmp ult i32 %i, %m 969 %cond_p1 = icmp ult i32 %i, %n 970 %cond_p2 = icmp ult i32 %i, %add 971 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 972 %cond2 = select i1 %cond, i1 %cond_p2, i1 false 973 br i1 %cond2, label %loop, label %exit 974exit: 975 ret i32 %i 976} 977 978define i32 @logical_and_not_zero(i16 %n, i32 %m) { 979; CHECK-LABEL: 'logical_and_not_zero' 980; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero 981; CHECK-NEXT: %n.ext = zext i16 %n to i32 982; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 983; CHECK-NEXT: %n1 = add i32 %n.ext, 1 984; CHECK-NEXT: --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537) 985; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 986; 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 } 987; CHECK-NEXT: %i.next = add i32 %i, 1 988; 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 } 989; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 990; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 991; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero 992; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) 993; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65536 994; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) 995; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) 996; CHECK-NEXT: Predicates: 997; CHECK-NEXT: Loop %loop: Trip multiple is 1 998; 999entry: 1000 %n.ext = zext i16 %n to i32 1001 %n1 = add i32 %n.ext, 1 1002 br label %loop 1003loop: 1004 %i = phi i32 [0, %entry], [%i.next, %loop] 1005 %i.next = add i32 %i, 1 1006 %cond_p0 = icmp ult i32 %i, %n1 1007 %cond_p1 = icmp ult i32 %i, %m 1008 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1009 br i1 %cond, label %loop, label %exit 1010exit: 1011 ret i32 %i 1012} 1013 1014define i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) { 1015; CHECK-LABEL: 'logical_and_not_zero_wrong_order' 1016; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero_wrong_order 1017; CHECK-NEXT: %n.ext = zext i16 %n to i32 1018; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1019; CHECK-NEXT: %n1 = add i32 %n.ext, 1 1020; CHECK-NEXT: --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537) 1021; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1022; 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 } 1023; CHECK-NEXT: %i.next = add i32 %i, 1 1024; 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 } 1025; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1026; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1027; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero_wrong_order 1028; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) 1029; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65536 1030; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) 1031; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) 1032; CHECK-NEXT: Predicates: 1033; CHECK-NEXT: Loop %loop: Trip multiple is 1 1034; 1035entry: 1036 %n.ext = zext i16 %n to i32 1037 %n1 = add i32 %n.ext, 1 1038 br label %loop 1039loop: 1040 %i = phi i32 [0, %entry], [%i.next, %loop] 1041 %i.next = add i32 %i, 1 1042 %cond_p0 = icmp ult i32 %i, %m 1043 %cond_p1 = icmp ult i32 %i, %n1 1044 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1045 br i1 %cond, label %loop, label %exit 1046exit: 1047 ret i32 %i 1048} 1049 1050define i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) { 1051; CHECK-LABEL: 'logical_and_not_zero_needs_context' 1052; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero_needs_context 1053; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1054; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 1055; CHECK-NEXT: %i.next = add i32 %i, 1 1056; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 1057; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1058; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1059; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero_needs_context 1060; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 1061; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1 1062; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%n umin_seq %m) 1063; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 1064; CHECK-NEXT: Predicates: 1065; CHECK-NEXT: Loop %loop: Trip multiple is 1 1066; 1067entry: 1068 %cmp = icmp ne i32 %n, 0 1069 br i1 %cmp, label %loop, label %guard.fail 1070loop: 1071 %i = phi i32 [0, %entry], [%i.next, %loop] 1072 %i.next = add i32 %i, 1 1073 %cond_p0 = icmp ult i32 %i, %n 1074 %cond_p1 = icmp ult i32 %i, %m 1075 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1076 br i1 %cond, label %loop, label %exit 1077exit: 1078 ret i32 %i 1079guard.fail: 1080 ret i32 -1 1081} 1082 1083define i32 @logical_and_known_smaller(i16 %n, i16 %m) { 1084; CHECK-LABEL: 'logical_and_known_smaller' 1085; CHECK-NEXT: Classifying expressions for: @logical_and_known_smaller 1086; CHECK-NEXT: %n.ext = zext i16 %n to i32 1087; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1088; CHECK-NEXT: %m.ext = zext i16 %m to i32 1089; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536) 1090; CHECK-NEXT: %m.add = add i32 %m.ext, 65536 1091; CHECK-NEXT: --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072) 1092; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1093; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable } 1094; CHECK-NEXT: %i.next = add i32 %i, 1 1095; 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 } 1096; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1097; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1098; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_smaller 1099; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32) 1100; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65535 1101; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32) 1102; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32) 1103; CHECK-NEXT: Predicates: 1104; CHECK-NEXT: Loop %loop: Trip multiple is 1 1105; 1106entry: 1107 %n.ext = zext i16 %n to i32 1108 %m.ext = zext i16 %m to i32 1109 %m.add = add i32 %m.ext, 65536 1110 br label %loop 1111loop: 1112 %i = phi i32 [0, %entry], [%i.next, %loop] 1113 %i.next = add i32 %i, 1 1114 %cond_p0 = icmp ult i32 %i, %n.ext 1115 %cond_p1 = icmp ult i32 %i, %m.add 1116 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1117 br i1 %cond, label %loop, label %exit 1118exit: 1119 ret i32 %i 1120} 1121 1122define i32 @logical_and_known_smaller_equal(i16 %n, i16 %m) { 1123; CHECK-LABEL: 'logical_and_known_smaller_equal' 1124; CHECK-NEXT: Classifying expressions for: @logical_and_known_smaller_equal 1125; CHECK-NEXT: %n.ext = zext i16 %n to i32 1126; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1127; CHECK-NEXT: %m.ext = zext i16 %m to i32 1128; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536) 1129; CHECK-NEXT: %m.add = add i32 %m.ext, 65535 1130; CHECK-NEXT: --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071) 1131; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1132; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable } 1133; CHECK-NEXT: %i.next = add i32 %i, 1 1134; 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 } 1135; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1136; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1137; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_smaller_equal 1138; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32) 1139; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65535 1140; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32) 1141; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32) 1142; CHECK-NEXT: Predicates: 1143; CHECK-NEXT: Loop %loop: Trip multiple is 1 1144; 1145entry: 1146 %n.ext = zext i16 %n to i32 1147 %m.ext = zext i16 %m to i32 1148 %m.add = add i32 %m.ext, 65535 1149 br label %loop 1150loop: 1151 %i = phi i32 [0, %entry], [%i.next, %loop] 1152 %i.next = add i32 %i, 1 1153 %cond_p0 = icmp ult i32 %i, %n.ext 1154 %cond_p1 = icmp ult i32 %i, %m.add 1155 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1156 br i1 %cond, label %loop, label %exit 1157exit: 1158 ret i32 %i 1159} 1160 1161define i32 @logical_and_not_known_smaller_equal(i16 %n, i16 %m) { 1162; CHECK-LABEL: 'logical_and_not_known_smaller_equal' 1163; CHECK-NEXT: Classifying expressions for: @logical_and_not_known_smaller_equal 1164; CHECK-NEXT: %n.ext = zext i16 %n to i32 1165; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1166; CHECK-NEXT: %m.ext = zext i16 %m to i32 1167; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536) 1168; CHECK-NEXT: %m.add = add i32 %m.ext, 65534 1169; CHECK-NEXT: --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070) 1170; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1171; 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 } 1172; CHECK-NEXT: %i.next = add i32 %i, 1 1173; 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 } 1174; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1175; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1176; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_known_smaller_equal 1177; CHECK-NEXT: Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>) 1178; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65535 1179; 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>) 1180; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i16 %n to i32) umin_seq (65534 + (zext i16 %m to i32))<nuw><nsw>) 1181; CHECK-NEXT: Predicates: 1182; CHECK-NEXT: Loop %loop: Trip multiple is 1 1183; 1184entry: 1185 %n.ext = zext i16 %n to i32 1186 %m.ext = zext i16 %m to i32 1187 %m.add = add i32 %m.ext, 65534 1188 br label %loop 1189loop: 1190 %i = phi i32 [0, %entry], [%i.next, %loop] 1191 %i.next = add i32 %i, 1 1192 %cond_p0 = icmp ult i32 %i, %n.ext 1193 %cond_p1 = icmp ult i32 %i, %m.add 1194 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1195 br i1 %cond, label %loop, label %exit 1196exit: 1197 ret i32 %i 1198} 1199 1200define i32 @logical_and_known_greater(i16 %n, i16 %m) { 1201; CHECK-LABEL: 'logical_and_known_greater' 1202; CHECK-NEXT: Classifying expressions for: @logical_and_known_greater 1203; CHECK-NEXT: %n.ext = zext i16 %n to i32 1204; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1205; CHECK-NEXT: %m.ext = zext i16 %m to i32 1206; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536) 1207; CHECK-NEXT: %m.add = add i32 %m.ext, 65536 1208; CHECK-NEXT: --> (65536 + (zext i16 %m to i32))<nuw><nsw> U: [65536,131072) S: [65536,131072) 1209; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1210; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable } 1211; CHECK-NEXT: %i.next = add i32 %i, 1 1212; 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 } 1213; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1214; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1215; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_greater 1216; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32) 1217; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65535 1218; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32) 1219; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32) 1220; CHECK-NEXT: Predicates: 1221; CHECK-NEXT: Loop %loop: Trip multiple is 1 1222; 1223entry: 1224 %n.ext = zext i16 %n to i32 1225 %m.ext = zext i16 %m to i32 1226 %m.add = add i32 %m.ext, 65536 1227 br label %loop 1228loop: 1229 %i = phi i32 [0, %entry], [%i.next, %loop] 1230 %i.next = add i32 %i, 1 1231 %cond_p0 = icmp ult i32 %i, %m.add 1232 %cond_p1 = icmp ult i32 %i, %n.ext 1233 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1234 br i1 %cond, label %loop, label %exit 1235exit: 1236 ret i32 %i 1237} 1238 1239define i32 @logical_and_known_greater_equal(i16 %n, i16 %m) { 1240; CHECK-LABEL: 'logical_and_known_greater_equal' 1241; CHECK-NEXT: Classifying expressions for: @logical_and_known_greater_equal 1242; CHECK-NEXT: %n.ext = zext i16 %n to i32 1243; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1244; CHECK-NEXT: %m.ext = zext i16 %m to i32 1245; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536) 1246; CHECK-NEXT: %m.add = add i32 %m.ext, 65535 1247; CHECK-NEXT: --> (65535 + (zext i16 %m to i32))<nuw><nsw> U: [65535,131071) S: [65535,131071) 1248; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1249; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,65536) S: [0,65536) Exits: (zext i16 %n to i32) LoopDispositions: { %loop: Computable } 1250; CHECK-NEXT: %i.next = add i32 %i, 1 1251; 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 } 1252; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1253; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1254; CHECK-NEXT: Determining loop execution counts for: @logical_and_known_greater_equal 1255; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i16 %n to i32) 1256; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65535 1257; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i16 %n to i32) 1258; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i16 %n to i32) 1259; CHECK-NEXT: Predicates: 1260; CHECK-NEXT: Loop %loop: Trip multiple is 1 1261; 1262entry: 1263 %n.ext = zext i16 %n to i32 1264 %m.ext = zext i16 %m to i32 1265 %m.add = add i32 %m.ext, 65535 1266 br label %loop 1267loop: 1268 %i = phi i32 [0, %entry], [%i.next, %loop] 1269 %i.next = add i32 %i, 1 1270 %cond_p0 = icmp ult i32 %i, %m.add 1271 %cond_p1 = icmp ult i32 %i, %n.ext 1272 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1273 br i1 %cond, label %loop, label %exit 1274exit: 1275 ret i32 %i 1276} 1277 1278define i32 @logical_and_not_known_greater_equal(i16 %n, i16 %m) { 1279; CHECK-LABEL: 'logical_and_not_known_greater_equal' 1280; CHECK-NEXT: Classifying expressions for: @logical_and_not_known_greater_equal 1281; CHECK-NEXT: %n.ext = zext i16 %n to i32 1282; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 1283; CHECK-NEXT: %m.ext = zext i16 %m to i32 1284; CHECK-NEXT: --> (zext i16 %m to i32) U: [0,65536) S: [0,65536) 1285; CHECK-NEXT: %m.add = add i32 %m.ext, 65534 1286; CHECK-NEXT: --> (65534 + (zext i16 %m to i32))<nuw><nsw> U: [65534,131070) S: [65534,131070) 1287; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1288; 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 } 1289; CHECK-NEXT: %i.next = add i32 %i, 1 1290; 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 } 1291; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1292; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1293; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_known_greater_equal 1294; CHECK-NEXT: Loop %loop: backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>) 1295; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 65535 1296; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>) 1297; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i16 %n to i32) umin (65534 + (zext i16 %m to i32))<nuw><nsw>) 1298; CHECK-NEXT: Predicates: 1299; CHECK-NEXT: Loop %loop: Trip multiple is 1 1300; 1301entry: 1302 %n.ext = zext i16 %n to i32 1303 %m.ext = zext i16 %m to i32 1304 %m.add = add i32 %m.ext, 65534 1305 br label %loop 1306loop: 1307 %i = phi i32 [0, %entry], [%i.next, %loop] 1308 %i.next = add i32 %i, 1 1309 %cond_p0 = icmp ult i32 %i, %m.add 1310 %cond_p1 = icmp ult i32 %i, %n.ext 1311 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1312 br i1 %cond, label %loop, label %exit 1313exit: 1314 ret i32 %i 1315} 1316 1317define i32 @logical_and_zero_arg1(i32 %n) { 1318; CHECK-LABEL: 'logical_and_zero_arg1' 1319; CHECK-NEXT: Classifying expressions for: @logical_and_zero_arg1 1320; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1321; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable } 1322; CHECK-NEXT: %i.next = add i32 %i, 1 1323; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable } 1324; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1325; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant } 1326; CHECK-NEXT: Determining loop execution counts for: @logical_and_zero_arg1 1327; CHECK-NEXT: Loop %loop: backedge-taken count is 0 1328; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 0 1329; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 0 1330; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 0 1331; CHECK-NEXT: Predicates: 1332; CHECK-NEXT: Loop %loop: Trip multiple is 1 1333; 1334entry: 1335 br label %loop 1336loop: 1337 %i = phi i32 [0, %entry], [%i.next, %loop] 1338 %i.next = add i32 %i, 1 1339 %cond_p0 = icmp ult i32 %i, 0 1340 %cond_p1 = icmp ult i32 %i, %n 1341 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1342 br i1 %cond, label %loop, label %exit 1343exit: 1344 ret i32 %i 1345} 1346 1347define i32 @logical_and_zero_arg2(i32 %n) { 1348; CHECK-LABEL: 'logical_and_zero_arg2' 1349; CHECK-NEXT: Classifying expressions for: @logical_and_zero_arg2 1350; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1351; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable } 1352; CHECK-NEXT: %i.next = add i32 %i, 1 1353; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable } 1354; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1355; CHECK-NEXT: --> (%cond_p1 umin %cond_p0) U: full-set S: full-set Exits: false LoopDispositions: { %loop: Variant } 1356; CHECK-NEXT: Determining loop execution counts for: @logical_and_zero_arg2 1357; CHECK-NEXT: Loop %loop: backedge-taken count is 0 1358; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 0 1359; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is 0 1360; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is 0 1361; CHECK-NEXT: Predicates: 1362; CHECK-NEXT: Loop %loop: Trip multiple is 1 1363; 1364entry: 1365 br label %loop 1366loop: 1367 %i = phi i32 [0, %entry], [%i.next, %loop] 1368 %i.next = add i32 %i, 1 1369 %cond_p0 = icmp ult i32 %i, %n 1370 %cond_p1 = icmp ult i32 %i, 0 1371 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1372 br i1 %cond, label %loop, label %exit 1373exit: 1374 ret i32 %i 1375} 1376 1377 1378declare i32 @llvm.umin.i32(i32, i32) 1379