1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 2; RUN: opt -analyze -enable-new-pm=0 -scalar-evolution < %s | FileCheck %s 3; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s 4 5define void @umin_sext_x_zext_x(i32 %len) { 6; CHECK-LABEL: 'umin_sext_x_zext_x' 7; CHECK-NEXT: Classifying expressions for: @umin_sext_x_zext_x 8; CHECK-NEXT: %len.zext = zext i32 %len to i64 9; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 10; CHECK-NEXT: %len.sext = sext i32 %len to i64 11; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 12; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 13; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable } 14; CHECK-NEXT: %iv.next = add i64 %iv, 1 15; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 16; CHECK-NEXT: %and = and i1 %cmp1, %cmp2 17; CHECK-NEXT: --> %and U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant } 18; CHECK-NEXT: Determining loop execution counts for: @umin_sext_x_zext_x 19; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64) 20; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295 21; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64) 22; CHECK-NEXT: Predicates: 23; CHECK: Loop %loop: Trip multiple is 1 24; 25entry: 26 %len.zext = zext i32 %len to i64 27 %len.sext = sext i32 %len to i64 28 br label %loop 29loop: 30 %iv = phi i64 [0, %entry], [%iv.next, %loop] 31 %iv.next = add i64 %iv, 1 32 %cmp1 = icmp ult i64 %iv, %len.zext 33 %cmp2 = icmp ult i64 %iv, %len.sext 34 %and = and i1 %cmp1, %cmp2 35 br i1 %and, label %loop, label %exit 36exit: 37 ret void 38} 39 40define void @ule_sext_x_zext_x(i32 %len) { 41; CHECK-LABEL: 'ule_sext_x_zext_x' 42; CHECK-NEXT: Classifying expressions for: @ule_sext_x_zext_x 43; CHECK-NEXT: %len.zext = zext i32 %len to i64 44; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 45; CHECK-NEXT: %len.sext = sext i32 %len to i64 46; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 47; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 48; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable } 49; CHECK-NEXT: %iv.next = add i64 %iv, 1 50; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 51; CHECK-NEXT: %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 52; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant } 53; CHECK-NEXT: Determining loop execution counts for: @ule_sext_x_zext_x 54; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64) 55; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295 56; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64) 57; CHECK-NEXT: Predicates: 58; CHECK: Loop %loop: Trip multiple is 1 59; 60entry: 61 %len.zext = zext i32 %len to i64 62 %len.sext = sext i32 %len to i64 63 br label %loop 64loop: 65 %iv = phi i64 [0, %entry], [%iv.next, %loop] 66 %iv.next = add i64 %iv, 1 67 %cmp1 = icmp ule i64 %len.zext, %len.sext 68 %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 69 %cmp2 = icmp ult i64 %iv, %sel 70 br i1 %cmp2, label %loop, label %exit 71exit: 72 ret void 73} 74 75define void @uge_sext_x_zext_x(i32 %len) { 76; CHECK-LABEL: 'uge_sext_x_zext_x' 77; CHECK-NEXT: Classifying expressions for: @uge_sext_x_zext_x 78; CHECK-NEXT: %len.zext = zext i32 %len to i64 79; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 80; CHECK-NEXT: %len.sext = sext i32 %len to i64 81; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 82; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 83; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Computable } 84; CHECK-NEXT: %iv.next = add i64 %iv, 1 85; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (sext i32 %len to i64))<nsw> LoopDispositions: { %loop: Computable } 86; CHECK-NEXT: %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 87; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Invariant } 88; CHECK-NEXT: Determining loop execution counts for: @uge_sext_x_zext_x 89; CHECK-NEXT: Loop %loop: backedge-taken count is (sext i32 %len to i64) 90; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 91; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64) 92; CHECK-NEXT: Predicates: 93; CHECK: Loop %loop: Trip multiple is 1 94; 95entry: 96 %len.zext = zext i32 %len to i64 97 %len.sext = sext i32 %len to i64 98 br label %loop 99loop: 100 %iv = phi i64 [0, %entry], [%iv.next, %loop] 101 %iv.next = add i64 %iv, 1 102 %cmp1 = icmp uge i64 %len.zext, %len.sext 103 %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 104 %cmp2 = icmp ult i64 %iv, %sel 105 br i1 %cmp2, label %loop, label %exit 106exit: 107 ret void 108} 109 110define void @ult_sext_x_zext_x(i32 %len) { 111; CHECK-LABEL: 'ult_sext_x_zext_x' 112; CHECK-NEXT: Classifying expressions for: @ult_sext_x_zext_x 113; CHECK-NEXT: %len.zext = zext i32 %len to i64 114; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 115; CHECK-NEXT: %len.sext = sext i32 %len to i64 116; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 117; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 118; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable } 119; CHECK-NEXT: %iv.next = add i64 %iv, 1 120; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 121; CHECK-NEXT: %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext 122; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant } 123; CHECK-NEXT: Determining loop execution counts for: @ult_sext_x_zext_x 124; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64) 125; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295 126; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64) 127; CHECK-NEXT: Predicates: 128; CHECK: Loop %loop: Trip multiple is 1 129; 130entry: 131 %len.zext = zext i32 %len to i64 132 %len.sext = sext i32 %len to i64 133 br label %loop 134loop: 135 %iv = phi i64 [0, %entry], [%iv.next, %loop] 136 %iv.next = add i64 %iv, 1 137 %cmp1 = icmp ult i64 %len.zext, %len.sext 138 %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext 139 %cmp2 = icmp ult i64 %iv, %umin 140 br i1 %cmp2, label %loop, label %exit 141exit: 142 ret void 143} 144 145define void @ugt_sext_x_zext_x(i32 %len) { 146; CHECK-LABEL: 'ugt_sext_x_zext_x' 147; CHECK-NEXT: Classifying expressions for: @ugt_sext_x_zext_x 148; CHECK-NEXT: %len.zext = zext i32 %len to i64 149; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 150; CHECK-NEXT: %len.sext = sext i32 %len to i64 151; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 152; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 153; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Computable } 154; CHECK-NEXT: %iv.next = add i64 %iv, 1 155; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (sext i32 %len to i64))<nsw> LoopDispositions: { %loop: Computable } 156; CHECK-NEXT: %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext 157; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Invariant } 158; CHECK-NEXT: Determining loop execution counts for: @ugt_sext_x_zext_x 159; CHECK-NEXT: Loop %loop: backedge-taken count is (sext i32 %len to i64) 160; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 161; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64) 162; CHECK-NEXT: Predicates: 163; CHECK: Loop %loop: Trip multiple is 1 164; 165entry: 166 %len.zext = zext i32 %len to i64 167 %len.sext = sext i32 %len to i64 168 br label %loop 169loop: 170 %iv = phi i64 [0, %entry], [%iv.next, %loop] 171 %iv.next = add i64 %iv, 1 172 %cmp1 = icmp ugt i64 %len.zext, %len.sext 173 %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext 174 %cmp2 = icmp ult i64 %iv, %umax 175 br i1 %cmp2, label %loop, label %exit 176exit: 177 ret void 178} 179 180define void @sle_sext_x_zext_x(i32 %len) { 181; CHECK-LABEL: 'sle_sext_x_zext_x' 182; CHECK-NEXT: Classifying expressions for: @sle_sext_x_zext_x 183; CHECK-NEXT: %len.zext = zext i32 %len to i64 184; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 185; CHECK-NEXT: %len.sext = sext i32 %len to i64 186; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 187; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 188; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable } 189; CHECK-NEXT: %iv.next = add i64 %iv, 1 190; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 191; CHECK-NEXT: %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 192; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant } 193; CHECK-NEXT: Determining loop execution counts for: @sle_sext_x_zext_x 194; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64) 195; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295 196; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64) 197; CHECK-NEXT: Predicates: 198; CHECK: Loop %loop: Trip multiple is 1 199; 200entry: 201 %len.zext = zext i32 %len to i64 202 %len.sext = sext i32 %len to i64 203 br label %loop 204loop: 205 %iv = phi i64 [0, %entry], [%iv.next, %loop] 206 %iv.next = add i64 %iv, 1 207 %cmp1 = icmp ule i64 %len.zext, %len.sext 208 %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 209 %cmp2 = icmp ult i64 %iv, %sel 210 br i1 %cmp2, label %loop, label %exit 211exit: 212 ret void 213} 214 215define void @sge_sext_x_zext_x(i32 %len) { 216; CHECK-LABEL: 'sge_sext_x_zext_x' 217; CHECK-NEXT: Classifying expressions for: @sge_sext_x_zext_x 218; CHECK-NEXT: %len.zext = zext i32 %len to i64 219; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 220; CHECK-NEXT: %len.sext = sext i32 %len to i64 221; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 222; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 223; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable } 224; CHECK-NEXT: %iv.next = add i64 %iv, 1 225; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 226; CHECK-NEXT: %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 227; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant } 228; CHECK-NEXT: Determining loop execution counts for: @sge_sext_x_zext_x 229; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64) 230; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295 231; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64) 232; CHECK-NEXT: Predicates: 233; CHECK: Loop %loop: Trip multiple is 1 234; 235entry: 236 %len.zext = zext i32 %len to i64 237 %len.sext = sext i32 %len to i64 238 br label %loop 239loop: 240 %iv = phi i64 [0, %entry], [%iv.next, %loop] 241 %iv.next = add i64 %iv, 1 242 %cmp1 = icmp sge i64 %len.zext, %len.sext 243 %sel = select i1 %cmp1, i64 %len.zext, i64 %len.sext 244 %cmp2 = icmp ult i64 %iv, %sel 245 br i1 %cmp2, label %loop, label %exit 246exit: 247 ret void 248} 249 250define void @slt_sext_x_zext_x(i32 %len) { 251; CHECK-LABEL: 'slt_sext_x_zext_x' 252; CHECK-NEXT: Classifying expressions for: @slt_sext_x_zext_x 253; CHECK-NEXT: %len.zext = zext i32 %len to i64 254; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 255; CHECK-NEXT: %len.sext = sext i32 %len to i64 256; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 257; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 258; CHECK-NEXT: --> {0,+,1}<%loop> U: full-set S: full-set Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Computable } 259; CHECK-NEXT: %iv.next = add i64 %iv, 1 260; CHECK-NEXT: --> {1,+,1}<%loop> U: full-set S: full-set Exits: (1 + (sext i32 %len to i64))<nsw> LoopDispositions: { %loop: Computable } 261; CHECK-NEXT: %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext 262; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) Exits: (sext i32 %len to i64) LoopDispositions: { %loop: Invariant } 263; CHECK-NEXT: Determining loop execution counts for: @slt_sext_x_zext_x 264; CHECK-NEXT: Loop %loop: backedge-taken count is (sext i32 %len to i64) 265; CHECK-NEXT: Loop %loop: max backedge-taken count is -1 266; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (sext i32 %len to i64) 267; CHECK-NEXT: Predicates: 268; CHECK: Loop %loop: Trip multiple is 1 269; 270entry: 271 %len.zext = zext i32 %len to i64 272 %len.sext = sext i32 %len to i64 273 br label %loop 274loop: 275 %iv = phi i64 [0, %entry], [%iv.next, %loop] 276 %iv.next = add i64 %iv, 1 277 %cmp1 = icmp slt i64 %len.zext, %len.sext 278 %umin = select i1 %cmp1, i64 %len.zext, i64 %len.sext 279 %cmp2 = icmp ult i64 %iv, %umin 280 br i1 %cmp2, label %loop, label %exit 281exit: 282 ret void 283} 284 285define void @sgt_sext_x_zext_x(i32 %len) { 286; CHECK-LABEL: 'sgt_sext_x_zext_x' 287; CHECK-NEXT: Classifying expressions for: @sgt_sext_x_zext_x 288; CHECK-NEXT: %len.zext = zext i32 %len to i64 289; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) 290; CHECK-NEXT: %len.sext = sext i32 %len to i64 291; CHECK-NEXT: --> (sext i32 %len to i64) U: [-2147483648,2147483648) S: [-2147483648,2147483648) 292; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 293; CHECK-NEXT: --> {0,+,1}<%loop> U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Computable } 294; CHECK-NEXT: %iv.next = add i64 %iv, 1 295; CHECK-NEXT: --> {1,+,1}<%loop> U: [1,4294967297) S: [1,4294967297) Exits: (1 + (zext i32 %len to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 296; CHECK-NEXT: %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext 297; CHECK-NEXT: --> (zext i32 %len to i64) U: [0,4294967296) S: [0,4294967296) Exits: (zext i32 %len to i64) LoopDispositions: { %loop: Invariant } 298; CHECK-NEXT: Determining loop execution counts for: @sgt_sext_x_zext_x 299; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i32 %len to i64) 300; CHECK-NEXT: Loop %loop: max backedge-taken count is 4294967295 301; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is (zext i32 %len to i64) 302; CHECK-NEXT: Predicates: 303; CHECK: Loop %loop: Trip multiple is 1 304; 305entry: 306 %len.zext = zext i32 %len to i64 307 %len.sext = sext i32 %len to i64 308 br label %loop 309loop: 310 %iv = phi i64 [0, %entry], [%iv.next, %loop] 311 %iv.next = add i64 %iv, 1 312 %cmp1 = icmp sgt i64 %len.zext, %len.sext 313 %umax = select i1 %cmp1, i64 %len.zext, i64 %len.sext 314 %cmp2 = icmp ult i64 %iv, %umax 315 br i1 %cmp2, label %loop, label %exit 316exit: 317 ret void 318} 319