1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 4 2; RUN: opt "-passes=print<scalar-evolution>" -disable-output -S %s 2>&1 | FileCheck %s 3 4; PR59777 5define i2 @iv_nsw_poison(i2 %arg) { 6; CHECK-LABEL: 'iv_nsw_poison' 7; CHECK-NEXT: Classifying expressions for: @iv_nsw_poison 8; CHECK-NEXT: %.07 = phi i2 [ 1, %bb ], [ %i, %bb1 ] 9; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb1> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 10; CHECK-NEXT: %.0 = phi i2 [ 1, %bb ], [ %i2, %bb1 ] 11; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%bb1> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 12; CHECK-NEXT: %i = add nsw i2 %.07, 1 13; CHECK-NEXT: --> {-2,+,1}<nuw><%bb1> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 14; CHECK-NEXT: %i2 = add i2 %.0, 1 15; CHECK-NEXT: --> {-2,+,1}<nuw><%bb1> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 16; CHECK-NEXT: Determining loop execution counts for: @iv_nsw_poison 17; CHECK-NEXT: Loop %bb1: Unpredictable backedge-taken count. 18; CHECK-NEXT: Loop %bb1: Unpredictable constant max backedge-taken count. 19; CHECK-NEXT: Loop %bb1: Unpredictable symbolic max backedge-taken count. 20; 21bb: 22 br label %bb1 23 24bb1: ; preds = %bb1, %bb 25 %.07 = phi i2 [ 1, %bb ], [ %i, %bb1 ] 26 %.0 = phi i2 [ 1, %bb ], [ %i2, %bb1 ] 27 %i = add nsw i2 %.07, 1 28 %i2 = add i2 %.0, 1 29 %.not.not = icmp ult i2 %.07, %arg 30 br i1 %.not.not, label %common.ret, label %bb1 31 32common.ret: ; preds = %bb1 33 ret i2 %i2 34} 35 36define i4 @iv_nsw_poison2(i4 %0, i4 %end, i4 %start) { 37; CHECK-LABEL: 'iv_nsw_poison2' 38; CHECK-NEXT: Classifying expressions for: @iv_nsw_poison2 39; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 40; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 41; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 42; CHECK-NEXT: --> {%start,+,1}<nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 43; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1 44; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 45; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1 46; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 47; CHECK-NEXT: Determining loop execution counts for: @iv_nsw_poison2 48; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 49; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 50; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 51; 52entry: 53 br label %loop 54 55loop: 56 %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 57 %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 58 %iv.0.next = add i4 %iv.0, 1 59 %iv.1.next = add nsw i4 %iv.1, 1 60 %.not.not = icmp ult i4 %iv.0, %end 61 br i1 %.not.not, label %exit, label %loop 62 63exit: 64 ret i4 %iv.1.next 65} 66 67define i2 @iv_both_adds_nsw(i2 %arg) { 68; CHECK-LABEL: 'iv_both_adds_nsw' 69; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nsw 70; CHECK-NEXT: %iv.0 = phi i2 [ 1, %bb ], [ %iv.0.next, %loop ] 71; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 72; CHECK-NEXT: %iv.1 = phi i2 [ 1, %bb ], [ %iv.1.next, %loop ] 73; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-2) S: [1,-2) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 74; CHECK-NEXT: %iv.0.next = add nsw i2 %iv.0, 1 75; CHECK-NEXT: --> {-2,+,1}<nuw><%loop> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 76; CHECK-NEXT: %iv.1.next = add nsw i2 %iv.1, 1 77; CHECK-NEXT: --> {-2,+,1}<nuw><%loop> U: [-2,0) S: [-2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 78; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nsw 79; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 80; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 81; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 82; 83bb: 84 br label %loop 85 86loop: 87 %iv.0 = phi i2 [ 1, %bb ], [ %iv.0.next, %loop ] 88 %iv.1 = phi i2 [ 1, %bb ], [ %iv.1.next, %loop ] 89 %iv.0.next = add nsw i2 %iv.0, 1 90 %iv.1.next = add nsw i2 %iv.1, 1 91 %.not.not = icmp ult i2 %iv.0, %arg 92 br i1 %.not.not, label %exit, label %loop 93 94exit: 95 ret i2 %iv.1.next 96} 97 98define i4 @iv_both_adds_nsw_extra_use(i4 %arg) { 99; CHECK-LABEL: 'iv_both_adds_nsw_extra_use' 100; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nsw_extra_use 101; CHECK-NEXT: %iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ] 102; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 103; CHECK-NEXT: %iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ] 104; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 105; CHECK-NEXT: %iv.0.next = add nsw i4 %iv.0, 1 106; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 107; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1 108; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 109; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nsw_extra_use 110; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 111; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 112; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 113; 114bb: 115 br label %loop 116 117loop: 118 %iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ] 119 %iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ] 120 %iv.0.next = add nsw i4 %iv.0, 1 121 call void @use(i4 %iv.0.next) 122 %iv.1.next = add nsw i4 %iv.1, 1 123 call void @use(i4 %iv.1.next) 124 %.not.not = icmp ult i4 %iv.0, %arg 125 br i1 %.not.not, label %exit, label %loop 126 127exit: 128 ret i4 %iv.1.next 129} 130 131define i4 @iv_both_adds_nsw_extra_use_incs_reordered(i4 %arg) { 132; CHECK-LABEL: 'iv_both_adds_nsw_extra_use_incs_reordered' 133; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nsw_extra_use_incs_reordered 134; CHECK-NEXT: %iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ] 135; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 136; CHECK-NEXT: %iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ] 137; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,-8) S: [1,-8) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 138; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1 139; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 140; CHECK-NEXT: %iv.0.next = add nsw i4 %iv.0, 1 141; CHECK-NEXT: --> {2,+,1}<nuw><%loop> U: [2,0) S: [2,0) Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 142; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nsw_extra_use_incs_reordered 143; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 144; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 145; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 146; 147bb: 148 br label %loop 149 150loop: 151 %iv.0 = phi i4 [ 1, %bb ], [ %iv.0.next, %loop ] 152 %iv.1 = phi i4 [ 1, %bb ], [ %iv.1.next, %loop ] 153 %iv.1.next = add nsw i4 %iv.1, 1 154 call void @use(i4 %iv.1.next) 155 %iv.0.next = add nsw i4 %iv.0, 1 156 call void @use(i4 %iv.0.next) 157 %.not.not = icmp ult i4 %iv.0, %arg 158 br i1 %.not.not, label %exit, label %loop 159 160exit: 161 ret i4 %iv.1.next 162} 163 164define i4 @iv_nsw_poison_extra_use(i4 %0, i4 %end, i4 %start) { 165; CHECK-LABEL: 'iv_nsw_poison_extra_use' 166; CHECK-NEXT: Classifying expressions for: @iv_nsw_poison_extra_use 167; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 168; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 169; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 170; CHECK-NEXT: --> {%start,+,1}<nsw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 171; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1 172; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 173; CHECK-NEXT: %iv.1.next = add nsw i4 %iv.1, 1 174; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 175; CHECK-NEXT: Determining loop execution counts for: @iv_nsw_poison_extra_use 176; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 177; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 178; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 179; 180entry: 181 br label %loop 182 183loop: 184 %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 185 %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 186 %iv.0.next = add i4 %iv.0, 1 187 call void @use(i4 %iv.0.next) 188 %iv.1.next = add nsw i4 %iv.1, 1 189 %.not.not = icmp ult i4 %iv.0, %end 190 br i1 %.not.not, label %exit, label %loop 191 192exit: 193 ret i4 %iv.1.next 194} 195 196declare void @use(i4) 197 198define i2 @iv_nuw_poison(i2 %arg, i2 %start) { 199; CHECK-LABEL: 'iv_nuw_poison' 200; CHECK-NEXT: Classifying expressions for: @iv_nuw_poison 201; CHECK-NEXT: %.07 = phi i2 [ %start, %bb ], [ %i, %bb1 ] 202; CHECK-NEXT: --> {%start,+,1}<nuw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 203; CHECK-NEXT: %.0 = phi i2 [ %start, %bb ], [ %i2, %bb1 ] 204; CHECK-NEXT: --> {%start,+,1}<nuw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 205; CHECK-NEXT: %i = add nuw i2 %.07, 1 206; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 207; CHECK-NEXT: %i2 = add i2 %.0, 1 208; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%bb1> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %bb1: Computable } 209; CHECK-NEXT: Determining loop execution counts for: @iv_nuw_poison 210; CHECK-NEXT: Loop %bb1: Unpredictable backedge-taken count. 211; CHECK-NEXT: Loop %bb1: Unpredictable constant max backedge-taken count. 212; CHECK-NEXT: Loop %bb1: Unpredictable symbolic max backedge-taken count. 213; 214bb: 215 br label %bb1 216 217bb1: ; preds = %bb1, %bb 218 %.07 = phi i2 [ %start, %bb ], [ %i, %bb1 ] 219 %.0 = phi i2 [ %start, %bb ], [ %i2, %bb1 ] 220 %i = add nuw i2 %.07, 1 221 %i2 = add i2 %.0, 1 222 %.not.not = icmp ult i2 %.07, %arg 223 br i1 %.not.not, label %common.ret, label %bb1 224 225common.ret: ; preds = %bb1 226 ret i2 %i2 227} 228 229define i4 @iv_nuw_poison2(i4 %0, i4 %end, i4 %start) { 230; CHECK-LABEL: 'iv_nuw_poison2' 231; CHECK-NEXT: Classifying expressions for: @iv_nuw_poison2 232; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 233; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 234; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 235; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 236; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1 237; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 238; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1 239; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 240; CHECK-NEXT: Determining loop execution counts for: @iv_nuw_poison2 241; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 242; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 243; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 244; 245entry: 246 br label %loop 247 248loop: 249 %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 250 %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 251 %iv.0.next = add i4 %iv.0, 1 252 %iv.1.next = add nuw i4 %iv.1, 1 253 %.not.not = icmp ult i4 %iv.0, %end 254 br i1 %.not.not, label %exit, label %loop 255 256exit: 257 ret i4 %iv.1.next 258} 259 260define i2 @iv_both_adds_nuw(i2 %arg, i2 %start) { 261; CHECK-LABEL: 'iv_both_adds_nuw' 262; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nuw 263; CHECK-NEXT: %iv.0 = phi i2 [ %start, %bb ], [ %iv.0.next, %loop ] 264; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 265; CHECK-NEXT: %iv.1 = phi i2 [ %start, %bb ], [ %iv.1.next, %loop ] 266; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 267; CHECK-NEXT: %iv.0.next = add nuw i2 %iv.0, 1 268; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 269; CHECK-NEXT: %iv.1.next = add nuw i2 %iv.1, 1 270; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 271; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nuw 272; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 273; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 274; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 275; 276bb: 277 br label %loop 278 279loop: 280 %iv.0 = phi i2 [ %start, %bb ], [ %iv.0.next, %loop ] 281 %iv.1 = phi i2 [ %start, %bb ], [ %iv.1.next, %loop ] 282 %iv.0.next = add nuw i2 %iv.0, 1 283 %iv.1.next = add nuw i2 %iv.1, 1 284 %.not.not = icmp ult i2 %iv.0, %arg 285 br i1 %.not.not, label %exit, label %loop 286 287exit: 288 ret i2 %iv.1.next 289} 290 291define i4 @iv_both_adds_nuw_extra_use(i4 %arg, i4 %start) { 292; CHECK-LABEL: 'iv_both_adds_nuw_extra_use' 293; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nuw_extra_use 294; CHECK-NEXT: %iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ] 295; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 296; CHECK-NEXT: %iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ] 297; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 298; CHECK-NEXT: %iv.0.next = add nuw i4 %iv.0, 1 299; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 300; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1 301; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 302; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nuw_extra_use 303; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 304; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 305; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 306; 307bb: 308 br label %loop 309 310loop: 311 %iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ] 312 %iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ] 313 %iv.0.next = add nuw i4 %iv.0, 1 314 call void @use(i4 %iv.0.next) 315 %iv.1.next = add nuw i4 %iv.1, 1 316 call void @use(i4 %iv.1.next) 317 %.not.not = icmp ult i4 %iv.0, %arg 318 br i1 %.not.not, label %exit, label %loop 319 320exit: 321 ret i4 %iv.1.next 322} 323 324define i4 @iv_both_adds_nuw_extra_use_incs_reordered(i4 %arg, i4 %start) { 325; CHECK-LABEL: 'iv_both_adds_nuw_extra_use_incs_reordered' 326; CHECK-NEXT: Classifying expressions for: @iv_both_adds_nuw_extra_use_incs_reordered 327; CHECK-NEXT: %iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ] 328; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 329; CHECK-NEXT: %iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ] 330; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 331; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1 332; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 333; CHECK-NEXT: %iv.0.next = add nuw i4 %iv.0, 1 334; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 335; CHECK-NEXT: Determining loop execution counts for: @iv_both_adds_nuw_extra_use_incs_reordered 336; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 337; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 338; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 339; 340bb: 341 br label %loop 342 343loop: 344 %iv.0 = phi i4 [ %start, %bb ], [ %iv.0.next, %loop ] 345 %iv.1 = phi i4 [ %start, %bb ], [ %iv.1.next, %loop ] 346 %iv.1.next = add nuw i4 %iv.1, 1 347 call void @use(i4 %iv.1.next) 348 %iv.0.next = add nuw i4 %iv.0, 1 349 call void @use(i4 %iv.0.next) 350 %.not.not = icmp ult i4 %iv.0, %arg 351 br i1 %.not.not, label %exit, label %loop 352 353exit: 354 ret i4 %iv.1.next 355} 356 357define i4 @iv_nuw_poison_extra_use(i4 %0, i4 %end, i4 %start) { 358; CHECK-LABEL: 'iv_nuw_poison_extra_use' 359; CHECK-NEXT: Classifying expressions for: @iv_nuw_poison_extra_use 360; CHECK-NEXT: %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 361; CHECK-NEXT: --> {%start,+,1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 362; CHECK-NEXT: %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 363; CHECK-NEXT: --> {%start,+,1}<nuw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 364; CHECK-NEXT: %iv.0.next = add i4 %iv.0, 1 365; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 366; CHECK-NEXT: %iv.1.next = add nuw i4 %iv.1, 1 367; CHECK-NEXT: --> {(1 + %start),+,1}<nw><%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable } 368; CHECK-NEXT: Determining loop execution counts for: @iv_nuw_poison_extra_use 369; CHECK-NEXT: Loop %loop: Unpredictable backedge-taken count. 370; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count. 371; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count. 372; 373entry: 374 br label %loop 375 376loop: 377 %iv.0 = phi i4 [ %start, %entry ], [ %iv.0.next, %loop ] 378 %iv.1 = phi i4 [ %start, %entry ], [ %iv.1.next, %loop ] 379 %iv.0.next = add i4 %iv.0, 1 380 call void @use(i4 %iv.0.next) 381 %iv.1.next = add nuw i4 %iv.1, 1 382 %.not.not = icmp ult i4 %iv.0, %end 383 br i1 %.not.not, label %exit, label %loop 384 385exit: 386 ret i4 %iv.1.next 387} 388