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: max backedge-taken count is -1 16; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 17; CHECK-NEXT: Predicates: 18; CHECK: Loop %loop: Trip multiple is 1 19; 20entry: 21 br label %loop 22loop: 23 %i = phi i32 [0, %entry], [%i.next, %loop] 24 %i.next = add i32 %i, 1 25 %cond_p0 = icmp ult i32 %i, %n 26 %cond_p1 = icmp ult i32 %i, %m 27 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 28 br i1 %cond, label %loop, label %exit 29exit: 30 ret i32 %i 31} 32 33define i32 @logical_or_2ops(i32 %n, i32 %m) { 34; CHECK-LABEL: 'logical_or_2ops' 35; CHECK-NEXT: Classifying expressions for: @logical_or_2ops 36; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 37; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 38; CHECK-NEXT: %i.next = add i32 %i, 1 39; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 40; CHECK-NEXT: %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 41; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 42; CHECK-NEXT: Determining loop execution counts for: @logical_or_2ops 43; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 44; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 45; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 46; CHECK-NEXT: Predicates: 47; CHECK: Loop %loop: Trip multiple is 1 48; 49entry: 50 br label %loop 51loop: 52 %i = phi i32 [0, %entry], [%i.next, %loop] 53 %i.next = add i32 %i, 1 54 %cond_p0 = icmp uge i32 %i, %n 55 %cond_p1 = icmp uge i32 %i, %m 56 %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 57 br i1 %cond, label %exit, label %loop 58exit: 59 ret i32 %i 60} 61 62define i32 @logical_and_3ops(i32 %n, i32 %m, i32 %k) { 63; CHECK-LABEL: 'logical_and_3ops' 64; CHECK-NEXT: Classifying expressions for: @logical_and_3ops 65; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 66; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable } 67; CHECK-NEXT: %i.next = add i32 %i, 1 68; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable } 69; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false 70; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 71; CHECK-NEXT: %cond = select i1 %cond_p3, i1 %cond_p2, i1 false 72; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 73; CHECK-NEXT: Determining loop execution counts for: @logical_and_3ops 74; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k) 75; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 76; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k) 77; CHECK-NEXT: Predicates: 78; CHECK: Loop %loop: Trip multiple is 1 79; 80entry: 81 br label %loop 82loop: 83 %i = phi i32 [0, %entry], [%i.next, %loop] 84 %i.next = add i32 %i, 1 85 %cond_p0 = icmp ult i32 %i, %n 86 %cond_p1 = icmp ult i32 %i, %m 87 %cond_p2 = icmp ult i32 %i, %k 88 %cond_p3 = select i1 %cond_p0, i1 %cond_p1, i1 false 89 %cond = select i1 %cond_p3, i1 %cond_p2, i1 false 90 br i1 %cond, label %loop, label %exit 91exit: 92 ret i32 %i 93} 94 95define i32 @logical_or_3ops(i32 %n, i32 %m, i32 %k) { 96; CHECK-LABEL: 'logical_or_3ops' 97; CHECK-NEXT: Classifying expressions for: @logical_or_3ops 98; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 99; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable } 100; CHECK-NEXT: %i.next = add i32 %i, 1 101; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable } 102; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 103; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 104; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 105; 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 } 106; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops 107; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k) 108; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 109; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k) 110; CHECK-NEXT: Predicates: 111; CHECK: Loop %loop: Trip multiple is 1 112; 113entry: 114 br label %loop 115loop: 116 %i = phi i32 [0, %entry], [%i.next, %loop] 117 %i.next = add i32 %i, 1 118 %cond_p0 = icmp uge i32 %i, %n 119 %cond_p1 = icmp uge i32 %i, %m 120 %cond_p2 = icmp uge i32 %i, %k 121 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 122 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 123 br i1 %cond, label %exit, label %loop 124exit: 125 ret i32 %i 126} 127 128define i32 @logical_or_3ops_duplicate(i32 %n, i32 %m, i32 %k) { 129; CHECK-LABEL: 'logical_or_3ops_duplicate' 130; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_duplicate 131; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 132; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq %k) LoopDispositions: { %loop: Computable } 133; CHECK-NEXT: %i.next = add i32 %i, 1 134; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq %k)) LoopDispositions: { %loop: Computable } 135; CHECK-NEXT: %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1 136; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 137; CHECK-NEXT: %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2 138; 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 } 139; CHECK-NEXT: %cond = select i1 %cond_p5, i1 true, i1 %cond_p3 140; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1) umin_seq (true + %cond_p2) umin_seq (true + %cond_p3))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 141; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_duplicate 142; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq %k) 143; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 144; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq %k) 145; CHECK-NEXT: Predicates: 146; CHECK: Loop %loop: Trip multiple is 1 147; 148entry: 149 br label %loop 150loop: 151 %i = phi i32 [0, %entry], [%i.next, %loop] 152 %i.next = add i32 %i, 1 153 %cond_p0 = icmp uge i32 %i, %n 154 %cond_p1 = icmp uge i32 %i, %m 155 %cond_p2 = icmp uge i32 %i, %n 156 %cond_p3 = icmp uge i32 %i, %k 157 %cond_p4 = select i1 %cond_p0, i1 true, i1 %cond_p1 158 %cond_p5 = select i1 %cond_p4, i1 true, i1 %cond_p2 159 %cond = select i1 %cond_p5, i1 true, i1 %cond_p3 160 br i1 %cond, label %exit, label %loop 161exit: 162 ret i32 %i 163} 164 165define i32 @logical_or_3ops_redundant_uminseq_operand(i32 %n, i32 %m, i32 %k) { 166; CHECK-LABEL: 'logical_or_3ops_redundant_uminseq_operand' 167; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_redundant_uminseq_operand 168; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 169; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable } 170; CHECK-NEXT: %i.next = add i32 %i, 1 171; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable } 172; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 173; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 174; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 175; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 176; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 177; 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 } 178; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_redundant_uminseq_operand 179; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k) 180; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 181; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k) 182; CHECK-NEXT: Predicates: 183; CHECK: Loop %loop: Trip multiple is 1 184; 185entry: 186 br label %loop 187loop: 188 %i = phi i32 [0, %entry], [%i.next, %loop] 189 %i.next = add i32 %i, 1 190 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 191 %cond_p0 = icmp uge i32 %i, %umin 192 %cond_p1 = icmp uge i32 %i, %n 193 %cond_p2 = icmp uge i32 %i, %k 194 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 195 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 196 br i1 %cond, label %exit, label %loop 197exit: 198 ret i32 %i 199} 200 201define i32 @logical_or_3ops_redundant_umin_operand(i32 %n, i32 %m, i32 %k) { 202; CHECK-LABEL: 'logical_or_3ops_redundant_umin_operand' 203; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_redundant_umin_operand 204; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 205; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %k umin_seq %m) LoopDispositions: { %loop: Computable } 206; CHECK-NEXT: %i.next = add i32 %i, 1 207; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %k umin_seq %m)) LoopDispositions: { %loop: Computable } 208; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 209; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 210; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 211; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 212; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 213; 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 } 214; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_redundant_umin_operand 215; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %k umin_seq %m) 216; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 217; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %k umin_seq %m) 218; CHECK-NEXT: Predicates: 219; CHECK: Loop %loop: Trip multiple is 1 220; 221entry: 222 br label %loop 223loop: 224 %i = phi i32 [0, %entry], [%i.next, %loop] 225 %i.next = add i32 %i, 1 226 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 227 %cond_p0 = icmp uge i32 %i, %n 228 %cond_p1 = icmp uge i32 %i, %k 229 %cond_p2 = icmp uge i32 %i, %umin 230 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 231 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 232 br i1 %cond, label %exit, label %loop 233exit: 234 ret i32 %i 235} 236 237define i32 @logical_or_4ops_redundant_operand_across_umins(i32 %n, i32 %m, i32 %k, i32 %q) { 238; CHECK-LABEL: 'logical_or_4ops_redundant_operand_across_umins' 239; CHECK-NEXT: Classifying expressions for: @logical_or_4ops_redundant_operand_across_umins 240; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 241; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k umin_seq %q) LoopDispositions: { %loop: Computable } 242; CHECK-NEXT: %i.next = add i32 %i, 1 243; 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 } 244; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 245; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 246; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q) 247; CHECK-NEXT: --> (%n umin %q) U: full-set S: full-set Exits: (%n umin %q) LoopDispositions: { %loop: Invariant } 248; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 249; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 250; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 251; 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 } 252; CHECK-NEXT: Determining loop execution counts for: @logical_or_4ops_redundant_operand_across_umins 253; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q) 254; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 255; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k umin_seq %q) 256; CHECK-NEXT: Predicates: 257; CHECK: Loop %loop: Trip multiple is 1 258; 259entry: 260 br label %loop 261loop: 262 %i = phi i32 [0, %entry], [%i.next, %loop] 263 %i.next = add i32 %i, 1 264 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 265 %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %q) 266 %cond_p0 = icmp uge i32 %i, %umin 267 %cond_p1 = icmp uge i32 %i, %k 268 %cond_p2 = icmp uge i32 %i, %umin2 269 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 270 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 271 br i1 %cond, label %exit, label %loop 272exit: 273 ret i32 %i 274} 275 276define i32 @logical_or_3ops_operand_wise_redundant_umin(i32 %n, i32 %m, i32 %k) { 277; CHECK-LABEL: 'logical_or_3ops_operand_wise_redundant_umin' 278; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_operand_wise_redundant_umin 279; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 280; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n umin %m) umin_seq %k) LoopDispositions: { %loop: Computable } 281; CHECK-NEXT: %i.next = add i32 %i, 1 282; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n umin %m) umin_seq %k)) LoopDispositions: { %loop: Computable } 283; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 284; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 285; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k) 286; CHECK-NEXT: --> (%n umin %k) U: full-set S: full-set Exits: (%n umin %k) LoopDispositions: { %loop: Invariant } 287; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 288; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 289; CHECK-NEXT: %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 290; 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 } 291; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_operand_wise_redundant_umin 292; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n umin %m) umin_seq %k) 293; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 294; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n umin %m) umin_seq %k) 295; CHECK-NEXT: Predicates: 296; CHECK: Loop %loop: Trip multiple is 1 297; 298entry: 299 br label %loop 300loop: 301 %i = phi i32 [0, %entry], [%i.next, %loop] 302 %i.next = add i32 %i, 1 303 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 304 %umin2 = call i32 @llvm.umin.i32(i32 %n, i32 %k) 305 %cond_p0 = icmp uge i32 %i, %umin 306 %cond_p1 = icmp uge i32 %i, %k 307 %cond_p2 = icmp uge i32 %i, %umin2 308 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 309 %cond = select i1 %cond_p3, i1 true, i1 %cond_p2 310 br i1 %cond, label %exit, label %loop 311exit: 312 ret i32 %i 313} 314 315define i32 @logical_or_3ops_partially_redundant_umin(i32 %n, i32 %m, i32 %k) { 316; CHECK-LABEL: 'logical_or_3ops_partially_redundant_umin' 317; CHECK-NEXT: Classifying expressions for: @logical_or_3ops_partially_redundant_umin 318; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 319; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%m umin %k)) LoopDispositions: { %loop: Computable } 320; CHECK-NEXT: %i.next = add i32 %i, 1 321; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%m umin %k))) LoopDispositions: { %loop: Computable } 322; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 323; CHECK-NEXT: --> (%n umin %m) U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Invariant } 324; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k) 325; CHECK-NEXT: --> (%n umin %m umin %k) U: full-set S: full-set Exits: (%n umin %m umin %k) LoopDispositions: { %loop: Invariant } 326; CHECK-NEXT: %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 327; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 328; CHECK-NEXT: Determining loop execution counts for: @logical_or_3ops_partially_redundant_umin 329; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq (%m umin %k)) 330; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 331; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq (%m umin %k)) 332; CHECK-NEXT: Predicates: 333; CHECK: Loop %loop: Trip multiple is 1 334; 335entry: 336 br label %loop 337loop: 338 %i = phi i32 [0, %entry], [%i.next, %loop] 339 %i.next = add i32 %i, 1 340 %umin = call i32 @llvm.umin.i32(i32 %n, i32 %m) 341 %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %k) 342 %cond_p0 = icmp uge i32 %i, %n 343 %cond_p1 = icmp uge i32 %i, %umin2 344 %cond = select i1 %cond_p0, i1 true, i1 %cond_p1 345 br i1 %cond, label %exit, label %loop 346exit: 347 ret i32 %i 348} 349 350define i32 @logical_or_5ops_redundant_opearand_of_inner_uminseq(i32 %a, i32 %b, i32 %c, i32 %d, i32 %e) { 351; CHECK-LABEL: 'logical_or_5ops_redundant_opearand_of_inner_uminseq' 352; CHECK-NEXT: Classifying expressions for: @logical_or_5ops_redundant_opearand_of_inner_uminseq 353; CHECK-NEXT: %first.i = phi i32 [ 0, %entry ], [ %first.i.next, %first.loop ] 354; CHECK-NEXT: --> {0,+,1}<%first.loop> U: full-set S: full-set Exits: (%e umin_seq %d umin_seq %a) LoopDispositions: { %first.loop: Computable } 355; CHECK-NEXT: %first.i.next = add i32 %first.i, 1 356; 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 } 357; CHECK-NEXT: %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 358; CHECK-NEXT: --> (true + ((true + %cond_p0) umin_seq (true + %cond_p1))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %first.loop: Variant } 359; CHECK-NEXT: %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2 360; 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 } 361; CHECK-NEXT: %i = phi i32 [ 0, %first.loop.exit ], [ %i.next, %loop ] 362; 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 } 363; CHECK-NEXT: %i.next = add i32 %i, 1 364; 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 } 365; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d) 366; CHECK-NEXT: --> (%c umin %d) U: full-set S: full-set Exits: (%c umin %d) LoopDispositions: { %loop: Invariant } 367; CHECK-NEXT: %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i) 368; 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 } 369; CHECK-NEXT: %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6 370; CHECK-NEXT: --> (true + ((true + %cond_p5) umin_seq (true + %cond_p6))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 371; CHECK-NEXT: %cond = select i1 %cond_p8, i1 true, i1 %cond_p7 372; 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 } 373; CHECK-NEXT: Determining loop execution counts for: @logical_or_5ops_redundant_opearand_of_inner_uminseq 374; CHECK-NEXT: Loop %loop: backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) 375; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 376; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%a umin_seq %b umin_seq ((%e umin_seq %d) umin %c)) 377; CHECK-NEXT: Predicates: 378; CHECK: Loop %loop: Trip multiple is 1 379; CHECK-NEXT: Loop %first.loop: backedge-taken count is (%e umin_seq %d umin_seq %a) 380; CHECK-NEXT: Loop %first.loop: max backedge-taken count is -1 381; CHECK-NEXT: Loop %first.loop: Predicated backedge-taken count is (%e umin_seq %d umin_seq %a) 382; CHECK-NEXT: Predicates: 383; CHECK: Loop %first.loop: Trip multiple is 1 384; 385entry: 386 br label %first.loop 387first.loop: 388 %first.i = phi i32 [0, %entry], [%first.i.next, %first.loop] 389 %first.i.next = add i32 %first.i, 1 390 %cond_p0 = icmp uge i32 %first.i, %e 391 %cond_p1 = icmp uge i32 %first.i, %d 392 %cond_p2 = icmp uge i32 %first.i, %a 393 %cond_p3 = select i1 %cond_p0, i1 true, i1 %cond_p1 394 %cond_p4 = select i1 %cond_p3, i1 true, i1 %cond_p2 395 br i1 %cond_p4, label %first.loop.exit, label %first.loop 396first.loop.exit: 397 br label %loop 398loop: 399 %i = phi i32 [0, %first.loop.exit], [%i.next, %loop] 400 %i.next = add i32 %i, 1 401 %umin = call i32 @llvm.umin.i32(i32 %c, i32 %d) 402 %umin2 = call i32 @llvm.umin.i32(i32 %umin, i32 %first.i) 403 %cond_p5 = icmp uge i32 %i, %a 404 %cond_p6 = icmp uge i32 %i, %b 405 %cond_p7 = icmp uge i32 %i, %umin2 406 %cond_p8 = select i1 %cond_p5, i1 true, i1 %cond_p6 407 %cond = select i1 %cond_p8, i1 true, i1 %cond_p7 408 br i1 %cond, label %exit, label %loop 409exit: 410 ret i32 %i 411} 412 413define i32 @logical_and_2ops_and_constant(i32 %n, i32 %m, i32 %k) { 414; CHECK-LABEL: 'logical_and_2ops_and_constant' 415; CHECK-NEXT: Classifying expressions for: @logical_and_2ops_and_constant 416; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 417; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Computable } 418; CHECK-NEXT: %i.next = add i32 %i, 1 419; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,44) S: [1,44) Exits: (1 + (42 umin %n))<nuw><nsw> LoopDispositions: { %loop: Computable } 420; CHECK-NEXT: %umin = call i32 @llvm.umin.i32(i32 %n, i32 42) 421; CHECK-NEXT: --> (42 umin %n) U: [0,43) S: [0,43) Exits: (42 umin %n) LoopDispositions: { %loop: Invariant } 422; CHECK-NEXT: %cond = select i1 %cond_p1, i1 true, i1 %cond_p0 423; CHECK-NEXT: --> (true + ((true + %cond_p1) umin_seq (true + %cond_p0))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 424; CHECK-NEXT: Determining loop execution counts for: @logical_and_2ops_and_constant 425; CHECK-NEXT: Loop %loop: backedge-taken count is (42 umin %n) 426; CHECK-NEXT: Loop %loop: max backedge-taken count is 42 427; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (42 umin %n) 428; CHECK-NEXT: Predicates: 429; CHECK: Loop %loop: Trip multiple is 1 430; 431entry: 432 br label %loop 433loop: 434 %i = phi i32 [0, %entry], [%i.next, %loop] 435 %i.next = add i32 %i, 1 436 %umin = call i32 @llvm.umin.i32(i32 %n, i32 42) 437 %cond_p0 = icmp uge i32 %i, %umin 438 %cond_p1 = icmp uge i32 %i, %n 439 %cond = select i1 %cond_p1, i1 true, i1 %cond_p0 440 br i1 %cond, label %exit, label %loop 441exit: 442 ret i32 %i 443} 444 445define i32 @computeSCEVAtScope(i32 %d.0) { 446; CHECK-LABEL: 'computeSCEVAtScope' 447; CHECK-NEXT: Classifying expressions for: @computeSCEVAtScope 448; CHECK-NEXT: %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ] 449; CHECK-NEXT: --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 450; CHECK-NEXT: %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ] 451; CHECK-NEXT: --> {%d.0,+,1}<nsw><%for.cond> U: full-set S: full-set Exits: 0 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 452; CHECK-NEXT: %0 = select i1 %tobool1, i1 %tobool2, i1 false 453; CHECK-NEXT: --> (%tobool1 umin_seq %tobool2) U: full-set S: full-set Exits: false LoopDispositions: { %for.cond: Variant, %while.cond: Variant } 454; CHECK-NEXT: %inc = add nsw i32 %d.1, 1 455; CHECK-NEXT: --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 456; CHECK-NEXT: %inc3 = add nsw i32 %e.1, 1 457; CHECK-NEXT: --> {(1 + %d.0),+,1}<nw><%for.cond> U: full-set S: full-set Exits: 1 LoopDispositions: { %for.cond: Computable, %while.cond: Variant } 458; CHECK-NEXT: %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ] 459; CHECK-NEXT: --> {0,+,1}<%for.cond4> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant } 460; CHECK-NEXT: %inc8 = add i32 %f.1, 1 461; CHECK-NEXT: --> {1,+,1}<%for.cond4> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %for.cond4: Computable, %while.cond: Variant } 462; CHECK-NEXT: Determining loop execution counts for: @computeSCEVAtScope 463; CHECK-NEXT: Loop %for.cond: backedge-taken count is (-1 * %d.0) 464; CHECK-NEXT: Loop %for.cond: max backedge-taken count is -1 465; CHECK-NEXT: Loop %for.cond: Predicated backedge-taken count is (-1 * %d.0) 466; CHECK-NEXT: Predicates: 467; CHECK: Loop %for.cond: Trip multiple is 1 468; CHECK-NEXT: Loop %for.cond4: backedge-taken count is 0 469; CHECK-NEXT: Loop %for.cond4: max backedge-taken count is 0 470; CHECK-NEXT: Loop %for.cond4: Predicated backedge-taken count is 0 471; CHECK-NEXT: Predicates: 472; CHECK: Loop %for.cond4: Trip multiple is 1 473; CHECK-NEXT: Loop %while.cond: <multiple exits> Unpredictable backedge-taken count. 474; CHECK-NEXT: Loop %while.cond: Unpredictable max backedge-taken count. 475; CHECK-NEXT: Loop %while.cond: Unpredictable predicated backedge-taken count. 476; 477entry: 478 br label %while.cond 479 480while.cond.loopexit: ; preds = %for.cond4 481 br label %while.cond 482 483while.cond: ; preds = %while.cond.loopexit, %entry 484 br label %for.cond.preheader 485 486for.cond.preheader: ; preds = %while.cond 487 br label %for.cond 488 489for.cond: ; preds = %for.body, %for.cond.preheader 490 %d.1 = phi i32 [ %inc, %for.body ], [ %d.0, %for.cond.preheader ] 491 %e.1 = phi i32 [ %inc3, %for.body ], [ %d.0, %for.cond.preheader ] 492 %tobool1 = icmp ne i32 %e.1, 0 493 %tobool2 = icmp ne i32 %d.1, 0 494 %0 = select i1 %tobool1, i1 %tobool2, i1 false 495 br i1 %0, label %for.body, label %for.cond4.preheader 496 497for.cond4.preheader: ; preds = %for.cond 498 br label %for.cond4 499 500for.body: ; preds = %for.cond 501 %inc = add nsw i32 %d.1, 1 502 %inc3 = add nsw i32 %e.1, 1 503 br label %for.cond 504 505for.cond4: ; preds = %for.body5, %for.cond4.preheader 506 %f.1 = phi i32 [ %inc8, %for.body5 ], [ 0, %for.cond4.preheader ] 507 %exitcond.not = icmp eq i32 %f.1, %e.1 508 br i1 %exitcond.not, label %while.cond.loopexit, label %for.body5 509 510for.body5: ; preds = %for.cond4 511 %inc8 = add i32 %f.1, 1 512 br label %for.cond4 513} 514 515define i64 @uminseq_vs_ptrtoint_complexity(i64 %n, i64 %m, i64* %ptr) { 516; CHECK-LABEL: 'uminseq_vs_ptrtoint_complexity' 517; CHECK-NEXT: Classifying expressions for: @uminseq_vs_ptrtoint_complexity 518; CHECK-NEXT: %i = phi i64 [ 0, %entry ], [ %i.next, %loop ] 519; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 520; CHECK-NEXT: %i.next = add i64 %i, 1 521; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 522; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 523; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 524; CHECK-NEXT: %ptr.int = ptrtoint i64* %ptr to i64 525; CHECK-NEXT: --> (ptrtoint i64* %ptr to i64) U: full-set S: full-set 526; CHECK-NEXT: %r = add i64 %i, %ptr.int 527; CHECK-NEXT: --> {(ptrtoint i64* %ptr to i64),+,1}<%loop> U: full-set S: full-set --> ((%n umin_seq %m) + (ptrtoint i64* %ptr to i64)) U: full-set S: full-set 528; CHECK-NEXT: Determining loop execution counts for: @uminseq_vs_ptrtoint_complexity 529; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 530; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 531; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 532; CHECK-NEXT: Predicates: 533; CHECK: Loop %loop: Trip multiple is 1 534; 535entry: 536 br label %loop 537loop: 538 %i = phi i64 [0, %entry], [%i.next, %loop] 539 %i.next = add i64 %i, 1 540 %cond_p0 = icmp ult i64 %i, %n 541 %cond_p1 = icmp ult i64 %i, %m 542 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 543 br i1 %cond, label %loop, label %exit 544exit: 545 %ptr.int = ptrtoint i64* %ptr to i64 546 %r = add i64 %i, %ptr.int 547 ret i64 %r 548} 549 550define i32 @logical_and_implies_poison1(i32 %n) { 551; CHECK-LABEL: 'logical_and_implies_poison1' 552; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison1 553; CHECK-NEXT: %add = add i32 %n, 1 554; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 555; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 556; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable } 557; CHECK-NEXT: %i.next = add i32 %i, 1 558; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable } 559; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 560; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 561; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison1 562; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + %n) umin %n) 563; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 564; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n) 565; CHECK-NEXT: Predicates: 566; CHECK: Loop %loop: Trip multiple is 1 567; 568entry: 569 %add = add i32 %n, 1 570 br label %loop 571loop: 572 %i = phi i32 [0, %entry], [%i.next, %loop] 573 %i.next = add i32 %i, 1 574 %cond_p0 = icmp ult i32 %i, %n 575 %cond_p1 = icmp ult i32 %i, %add 576 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 577 br i1 %cond, label %loop, label %exit 578exit: 579 ret i32 %i 580} 581 582define i32 @logical_and_implies_poison2(i32 %n) { 583; CHECK-LABEL: 'logical_and_implies_poison2' 584; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison2 585; CHECK-NEXT: %add = add i32 %n, 1 586; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 587; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 588; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((1 + %n) umin %n) LoopDispositions: { %loop: Computable } 589; CHECK-NEXT: %i.next = add i32 %i, 1 590; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable } 591; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 592; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 593; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison2 594; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + %n) umin %n) 595; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 596; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((1 + %n) umin %n) 597; CHECK-NEXT: Predicates: 598; CHECK: Loop %loop: Trip multiple is 1 599; 600entry: 601 %add = add i32 %n, 1 602 br label %loop 603loop: 604 %i = phi i32 [0, %entry], [%i.next, %loop] 605 %i.next = add i32 %i, 1 606 %cond_p0 = icmp ult i32 %i, %add 607 %cond_p1 = icmp ult i32 %i, %n 608 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 609 br i1 %cond, label %loop, label %exit 610exit: 611 ret i32 %i 612} 613 614define i32 @logical_and_implies_poison3(i32 %n, i32 %m) { 615; CHECK-LABEL: 'logical_and_implies_poison3' 616; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison3 617; CHECK-NEXT: %add = add i32 %n, %m 618; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 619; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 620; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin %n) LoopDispositions: { %loop: Computable } 621; CHECK-NEXT: %i.next = add i32 %i, 1 622; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin %n)) LoopDispositions: { %loop: Computable } 623; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 624; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 625; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison3 626; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin %n) 627; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 628; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin %n) 629; CHECK-NEXT: Predicates: 630; CHECK: Loop %loop: Trip multiple is 1 631; 632entry: 633 %add = add i32 %n, %m 634 br label %loop 635loop: 636 %i = phi i32 [0, %entry], [%i.next, %loop] 637 %i.next = add i32 %i, 1 638 %cond_p0 = icmp ult i32 %i, %add 639 %cond_p1 = icmp ult i32 %i, %n 640 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 641 br i1 %cond, label %loop, label %exit 642exit: 643 ret i32 %i 644} 645 646define i32 @logical_and_implies_poison_wrong_direction(i32 %n, i32 %m) { 647; CHECK-LABEL: 'logical_and_implies_poison_wrong_direction' 648; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_wrong_direction 649; CHECK-NEXT: %add = add i32 %n, %m 650; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 651; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 652; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq (%n + %m)) LoopDispositions: { %loop: Computable } 653; CHECK-NEXT: %i.next = add i32 %i, 1 654; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq (%n + %m))) LoopDispositions: { %loop: Computable } 655; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 656; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 657; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_wrong_direction 658; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq (%n + %m)) 659; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 660; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq (%n + %m)) 661; CHECK-NEXT: Predicates: 662; CHECK: Loop %loop: Trip multiple is 1 663; 664entry: 665 %add = add i32 %n, %m 666 br label %loop 667loop: 668 %i = phi i32 [0, %entry], [%i.next, %loop] 669 %i.next = add i32 %i, 1 670 %cond_p0 = icmp ult i32 %i, %n 671 %cond_p1 = icmp ult i32 %i, %add 672 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 673 br i1 %cond, label %loop, label %exit 674exit: 675 ret i32 %i 676} 677 678define i32 @logical_and_implies_poison_noundef(i32 %n, i32 noundef %m) { 679; CHECK-LABEL: 'logical_and_implies_poison_noundef' 680; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_noundef 681; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 682; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin %m) LoopDispositions: { %loop: Computable } 683; CHECK-NEXT: %i.next = add i32 %i, 1 684; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin %m)) LoopDispositions: { %loop: Computable } 685; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 686; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 687; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_noundef 688; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin %m) 689; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 690; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin %m) 691; CHECK-NEXT: Predicates: 692; CHECK: Loop %loop: Trip multiple is 1 693; 694entry: 695 br label %loop 696loop: 697 %i = phi i32 [0, %entry], [%i.next, %loop] 698 %i.next = add i32 %i, 1 699 %cond_p0 = icmp ult i32 %i, %n 700 %cond_p1 = icmp ult i32 %i, %m 701 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 702 br i1 %cond, label %loop, label %exit 703exit: 704 ret i32 %i 705} 706 707define i32 @logical_and_implies_poison_noundef_wrong_direction(i32 %n, i32 noundef %m) { 708; CHECK-LABEL: 'logical_and_implies_poison_noundef_wrong_direction' 709; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_noundef_wrong_direction 710; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 711; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq %n) LoopDispositions: { %loop: Computable } 712; CHECK-NEXT: %i.next = add i32 %i, 1 713; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq %n)) LoopDispositions: { %loop: Computable } 714; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 715; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 716; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_noundef_wrong_direction 717; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq %n) 718; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 719; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%m umin_seq %n) 720; CHECK-NEXT: Predicates: 721; CHECK: Loop %loop: Trip multiple is 1 722; 723entry: 724 br label %loop 725loop: 726 %i = phi i32 [0, %entry], [%i.next, %loop] 727 %i.next = add i32 %i, 1 728 %cond_p0 = icmp ult i32 %i, %m 729 %cond_p1 = icmp ult i32 %i, %n 730 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 731 br i1 %cond, label %loop, label %exit 732exit: 733 ret i32 %i 734} 735 736define i32 @logical_and_implies_poison_complex1(i32 %n, i32 %m) { 737; CHECK-LABEL: 'logical_and_implies_poison_complex1' 738; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex1 739; CHECK-NEXT: %add = add i32 %n, %m 740; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 741; CHECK-NEXT: %add1 = add i32 %add, 1 742; CHECK-NEXT: --> (1 + %n + %m) U: full-set S: full-set 743; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 744; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (1 + %n + %m)) LoopDispositions: { %loop: Computable } 745; CHECK-NEXT: %i.next = add i32 %i, 1 746; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (1 + %n + %m))) LoopDispositions: { %loop: Computable } 747; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 748; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 749; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex1 750; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin (1 + %n + %m)) 751; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 752; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (1 + %n + %m)) 753; CHECK-NEXT: Predicates: 754; CHECK: Loop %loop: Trip multiple is 1 755; 756entry: 757 %add = add i32 %n, %m 758 %add1 = add i32 %add, 1 759 br label %loop 760loop: 761 %i = phi i32 [0, %entry], [%i.next, %loop] 762 %i.next = add i32 %i, 1 763 %cond_p0 = icmp ult i32 %i, %add1 764 %cond_p1 = icmp ult i32 %i, %add 765 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 766 br i1 %cond, label %loop, label %exit 767exit: 768 ret i32 %i 769} 770 771define i32 @logical_and_implies_poison_complex2(i32 %n, i32 %m, i32 %l) { 772; CHECK-LABEL: 'logical_and_implies_poison_complex2' 773; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex2 774; CHECK-NEXT: %add = add i32 %n, %m 775; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 776; CHECK-NEXT: %add1 = add i32 %add, %l 777; CHECK-NEXT: --> (%n + %m + %l) U: full-set S: full-set 778; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 779; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin (%n + %m + %l)) LoopDispositions: { %loop: Computable } 780; CHECK-NEXT: %i.next = add i32 %i, 1 781; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin (%n + %m + %l))) LoopDispositions: { %loop: Computable } 782; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 783; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 784; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex2 785; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin (%n + %m + %l)) 786; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 787; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin (%n + %m + %l)) 788; CHECK-NEXT: Predicates: 789; CHECK: Loop %loop: Trip multiple is 1 790; 791entry: 792 %add = add i32 %n, %m 793 %add1 = add i32 %add, %l 794 br label %loop 795loop: 796 %i = phi i32 [0, %entry], [%i.next, %loop] 797 %i.next = add i32 %i, 1 798 %cond_p0 = icmp ult i32 %i, %add1 799 %cond_p1 = icmp ult i32 %i, %add 800 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 801 br i1 %cond, label %loop, label %exit 802exit: 803 ret i32 %i 804} 805 806define i32 @logical_and_implies_poison_complex_wrong_direction(i32 %n, i32 %m, i32 %l) { 807; CHECK-LABEL: 'logical_and_implies_poison_complex_wrong_direction' 808; CHECK-NEXT: Classifying expressions for: @logical_and_implies_poison_complex_wrong_direction 809; CHECK-NEXT: %add = add i32 %n, %m 810; CHECK-NEXT: --> (%n + %m) U: full-set S: full-set 811; CHECK-NEXT: %add1 = add i32 %add, %l 812; CHECK-NEXT: --> (%n + %m + %l) U: full-set S: full-set 813; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 814; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: ((%n + %m) umin_seq (%n + %m + %l)) LoopDispositions: { %loop: Computable } 815; CHECK-NEXT: %i.next = add i32 %i, 1 816; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + ((%n + %m) umin_seq (%n + %m + %l))) LoopDispositions: { %loop: Computable } 817; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 818; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 819; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_poison_complex_wrong_direction 820; CHECK-NEXT: Loop %loop: backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l)) 821; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 822; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((%n + %m) umin_seq (%n + %m + %l)) 823; CHECK-NEXT: Predicates: 824; CHECK: Loop %loop: Trip multiple is 1 825; 826entry: 827 %add = add i32 %n, %m 828 %add1 = add i32 %add, %l 829 br label %loop 830loop: 831 %i = phi i32 [0, %entry], [%i.next, %loop] 832 %i.next = add i32 %i, 1 833 %cond_p0 = icmp ult i32 %i, %add 834 %cond_p1 = icmp ult i32 %i, %add1 835 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 836 br i1 %cond, label %loop, label %exit 837exit: 838 ret i32 %i 839} 840 841define i32 @logical_and_implies_multiple_ops(i32 %n, i32 %m) { 842; CHECK-LABEL: 'logical_and_implies_multiple_ops' 843; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops 844; CHECK-NEXT: %add = add i32 %n, 1 845; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 846; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 847; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (((1 + %n) umin %n) umin_seq %m) LoopDispositions: { %loop: Computable } 848; CHECK-NEXT: %i.next = add i32 %i, 1 849; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (((1 + %n) umin %n) umin_seq %m)) LoopDispositions: { %loop: Computable } 850; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 851; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 852; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false 853; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 854; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops 855; CHECK-NEXT: Loop %loop: backedge-taken count is (((1 + %n) umin %n) umin_seq %m) 856; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 857; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (((1 + %n) umin %n) umin_seq %m) 858; CHECK-NEXT: Predicates: 859; CHECK: Loop %loop: Trip multiple is 1 860; 861entry: 862 %add = add i32 %n, 1 863 br label %loop 864loop: 865 %i = phi i32 [0, %entry], [%i.next, %loop] 866 %i.next = add i32 %i, 1 867 %cond_p0 = icmp ult i32 %i, %n 868 %cond_p1 = icmp ult i32 %i, %add 869 %cond_p2 = icmp ult i32 %i, %m 870 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 871 %cond2 = select i1 %cond, i1 %cond_p2, i1 false 872 br i1 %cond2, label %loop, label %exit 873exit: 874 ret i32 %i 875} 876 877define i32 @logical_and_implies_multiple_ops2(i32 %n, i32 %m) { 878; CHECK-LABEL: 'logical_and_implies_multiple_ops2' 879; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops2 880; CHECK-NEXT: %add = add i32 %n, 1 881; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 882; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 883; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m umin_seq (1 + %n)) LoopDispositions: { %loop: Computable } 884; CHECK-NEXT: %i.next = add i32 %i, 1 885; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m umin_seq (1 + %n))) LoopDispositions: { %loop: Computable } 886; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 887; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 888; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false 889; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 890; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops2 891; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m umin_seq (1 + %n)) 892; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 893; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m umin_seq (1 + %n)) 894; CHECK-NEXT: Predicates: 895; CHECK: Loop %loop: Trip multiple is 1 896; 897entry: 898 %add = add i32 %n, 1 899 br label %loop 900loop: 901 %i = phi i32 [0, %entry], [%i.next, %loop] 902 %i.next = add i32 %i, 1 903 %cond_p0 = icmp ult i32 %i, %n 904 %cond_p1 = icmp ult i32 %i, %m 905 %cond_p2 = icmp ult i32 %i, %add 906 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 907 %cond2 = select i1 %cond, i1 %cond_p2, i1 false 908 br i1 %cond2, label %loop, label %exit 909exit: 910 ret i32 %i 911} 912 913define i32 @logical_and_implies_multiple_ops3(i32 %n, i32 %m) { 914; CHECK-LABEL: 'logical_and_implies_multiple_ops3' 915; CHECK-NEXT: Classifying expressions for: @logical_and_implies_multiple_ops3 916; CHECK-NEXT: %add = add i32 %n, 1 917; CHECK-NEXT: --> (1 + %n) U: full-set S: full-set 918; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 919; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%m umin_seq ((1 + %n) umin %n)) LoopDispositions: { %loop: Computable } 920; CHECK-NEXT: %i.next = add i32 %i, 1 921; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%m umin_seq ((1 + %n) umin %n))) LoopDispositions: { %loop: Computable } 922; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 923; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 924; CHECK-NEXT: %cond2 = select i1 %cond, i1 %cond_p2, i1 false 925; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1 umin_seq %cond_p2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 926; CHECK-NEXT: Determining loop execution counts for: @logical_and_implies_multiple_ops3 927; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq ((1 + %n) umin %n)) 928; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 929; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%m umin_seq ((1 + %n) umin %n)) 930; CHECK-NEXT: Predicates: 931; CHECK: Loop %loop: Trip multiple is 1 932; 933entry: 934 %add = add i32 %n, 1 935 br label %loop 936loop: 937 %i = phi i32 [0, %entry], [%i.next, %loop] 938 %i.next = add i32 %i, 1 939 %cond_p0 = icmp ult i32 %i, %m 940 %cond_p1 = icmp ult i32 %i, %n 941 %cond_p2 = icmp ult i32 %i, %add 942 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 943 %cond2 = select i1 %cond, i1 %cond_p2, i1 false 944 br i1 %cond2, label %loop, label %exit 945exit: 946 ret i32 %i 947} 948 949define i32 @logical_and_not_zero(i16 %n, i32 %m) { 950; CHECK-LABEL: 'logical_and_not_zero' 951; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero 952; CHECK-NEXT: %n.ext = zext i16 %n to i32 953; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 954; CHECK-NEXT: %n1 = add i32 %n.ext, 1 955; CHECK-NEXT: --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537) 956; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 957; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,65537) S: [0,65537) Exits: ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) LoopDispositions: { %loop: Computable } 958; CHECK-NEXT: %i.next = add i32 %i, 1 959; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,65538) S: [1,65538) Exits: (1 + ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m))<nuw><nsw> LoopDispositions: { %loop: Computable } 960; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 961; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 962; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero 963; CHECK-NEXT: Loop %loop: backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) 964; CHECK-NEXT: Loop %loop: max backedge-taken count is 65536 965; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((1 + (zext i16 %n to i32))<nuw><nsw> umin %m) 966; CHECK-NEXT: Predicates: 967; CHECK: Loop %loop: Trip multiple is 1 968; 969entry: 970 %n.ext = zext i16 %n to i32 971 %n1 = add i32 %n.ext, 1 972 br label %loop 973loop: 974 %i = phi i32 [0, %entry], [%i.next, %loop] 975 %i.next = add i32 %i, 1 976 %cond_p0 = icmp ult i32 %i, %n1 977 %cond_p1 = icmp ult i32 %i, %m 978 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 979 br i1 %cond, label %loop, label %exit 980exit: 981 ret i32 %i 982} 983 984define i32 @logical_and_not_zero_wrong_order(i16 %n, i32 %m) { 985; CHECK-LABEL: 'logical_and_not_zero_wrong_order' 986; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero_wrong_order 987; CHECK-NEXT: %n.ext = zext i16 %n to i32 988; CHECK-NEXT: --> (zext i16 %n to i32) U: [0,65536) S: [0,65536) 989; CHECK-NEXT: %n1 = add i32 %n.ext, 1 990; CHECK-NEXT: --> (1 + (zext i16 %n to i32))<nuw><nsw> U: [1,65537) S: [1,65537) 991; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 992; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,65537) S: [0,65537) Exits: (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) LoopDispositions: { %loop: Computable } 993; CHECK-NEXT: %i.next = add i32 %i, 1 994; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,65538) S: [1,65538) Exits: (1 + (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>))<nuw><nsw> LoopDispositions: { %loop: Computable } 995; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 996; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 997; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero_wrong_order 998; CHECK-NEXT: Loop %loop: backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) 999; CHECK-NEXT: Loop %loop: max backedge-taken count is 65536 1000; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%m umin_seq (1 + (zext i16 %n to i32))<nuw><nsw>) 1001; CHECK-NEXT: Predicates: 1002; CHECK: Loop %loop: Trip multiple is 1 1003; 1004entry: 1005 %n.ext = zext i16 %n to i32 1006 %n1 = add i32 %n.ext, 1 1007 br label %loop 1008loop: 1009 %i = phi i32 [0, %entry], [%i.next, %loop] 1010 %i.next = add i32 %i, 1 1011 %cond_p0 = icmp ult i32 %i, %m 1012 %cond_p1 = icmp ult i32 %i, %n1 1013 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1014 br i1 %cond, label %loop, label %exit 1015exit: 1016 ret i32 %i 1017} 1018 1019define i32 @logical_and_not_zero_needs_context(i32 %n, i32 %m) { 1020; CHECK-LABEL: 'logical_and_not_zero_needs_context' 1021; CHECK-NEXT: Classifying expressions for: @logical_and_not_zero_needs_context 1022; CHECK-NEXT: %i = phi i32 [ 0, %entry ], [ %i.next, %loop ] 1023; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (%n umin_seq %m) LoopDispositions: { %loop: Computable } 1024; CHECK-NEXT: %i.next = add i32 %i, 1 1025; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (%n umin_seq %m)) LoopDispositions: { %loop: Computable } 1026; CHECK-NEXT: %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1027; CHECK-NEXT: --> (%cond_p0 umin_seq %cond_p1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 1028; CHECK-NEXT: Determining loop execution counts for: @logical_and_not_zero_needs_context 1029; CHECK-NEXT: Loop %loop: backedge-taken count is (%n umin_seq %m) 1030; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 1031; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (%n umin_seq %m) 1032; CHECK-NEXT: Predicates: 1033; CHECK: Loop %loop: Trip multiple is 1 1034; 1035entry: 1036 %cmp = icmp ne i32 %n, 0 1037 br i1 %cmp, label %loop, label %guard.fail 1038loop: 1039 %i = phi i32 [0, %entry], [%i.next, %loop] 1040 %i.next = add i32 %i, 1 1041 %cond_p0 = icmp ult i32 %i, %n 1042 %cond_p1 = icmp ult i32 %i, %m 1043 %cond = select i1 %cond_p0, i1 %cond_p1, i1 false 1044 br i1 %cond, label %loop, label %exit 1045exit: 1046 ret i32 %i 1047guard.fail: 1048 ret i32 -1 1049} 1050 1051declare i32 @llvm.umin.i32(i32, i32) 1052