644 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -disable-output "-passes=print<scalar-evolution>" < %s 2>&1 | FileCheck %s3 4declare i1 @cond()5 6define i32 @test_simple_case(i32 %start, i32 %len) {7; CHECK-LABEL: 'test_simple_case'8; CHECK-NEXT: Classifying expressions for: @test_simple_case9; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]10; CHECK-NEXT: --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }11; CHECK-NEXT: %iv.minus.1 = add i32 %iv, -112; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }13; CHECK-NEXT: %iv.next = add i32 %iv, -114; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }15; CHECK-NEXT: %loop_cond = call i1 @cond()16; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }17; CHECK-NEXT: Determining loop execution counts for: @test_simple_case18; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.19; CHECK-NEXT: exit count for loop: %start20; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***21; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***22; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -123; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %start24; CHECK-NEXT: symbolic max exit count for loop: %start25; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***26; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***27;28entry:29 br label %loop30 31loop:32 %iv = phi i32 [%start, %entry], [%iv.next, %backedge]33 %zero_check = icmp ne i32 %iv, 034 br i1 %zero_check, label %range_check_block, label %failed_135 36range_check_block:37 %iv.minus.1 = add i32 %iv, -138 %range_check = icmp ult i32 %iv.minus.1, %len39 br i1 %range_check, label %backedge, label %failed_240 41backedge:42 %iv.next = add i32 %iv, -143 %loop_cond = call i1 @cond()44 br i1 %loop_cond, label %done, label %loop45 46done:47 ret i32 %iv48 49failed_1:50 ret i32 -151 52failed_2:53 ret i32 -254}55 56define i32 @test_litter_conditions(i32 %start, i32 %len) {57; CHECK-LABEL: 'test_litter_conditions'58; CHECK-NEXT: Classifying expressions for: @test_litter_conditions59; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]60; CHECK-NEXT: --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }61; CHECK-NEXT: %fake_1 = call i1 @cond()62; CHECK-NEXT: --> %fake_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }63; CHECK-NEXT: %and_1 = and i1 %zero_check, %fake_164; CHECK-NEXT: --> (%zero_check umin %fake_1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }65; CHECK-NEXT: %iv.minus.1 = add i32 %iv, -166; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }67; CHECK-NEXT: %fake_2 = call i1 @cond()68; CHECK-NEXT: --> %fake_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }69; CHECK-NEXT: %and_2 = and i1 %range_check, %fake_270; CHECK-NEXT: --> (%range_check umin %fake_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }71; CHECK-NEXT: %iv.next = add i32 %iv, -172; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }73; CHECK-NEXT: %loop_cond = call i1 @cond()74; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }75; CHECK-NEXT: Determining loop execution counts for: @test_litter_conditions76; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.77; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***78; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***79; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***80; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -181; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %start82; CHECK-NEXT: symbolic max exit count for loop: %start83; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***84; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***85;86entry:87 br label %loop88 89loop:90 %iv = phi i32 [%start, %entry], [%iv.next, %backedge]91 %zero_check = icmp ne i32 %iv, 092 %fake_1 = call i1 @cond()93 %and_1 = and i1 %zero_check, %fake_194 br i1 %and_1, label %range_check_block, label %failed_195 96range_check_block:97 %iv.minus.1 = add i32 %iv, -198 %range_check = icmp ult i32 %iv.minus.1, %len99 %fake_2 = call i1 @cond()100 %and_2 = and i1 %range_check, %fake_2101 br i1 %and_2, label %backedge, label %failed_2102 103backedge:104 %iv.next = add i32 %iv, -1105 %loop_cond = call i1 @cond()106 br i1 %loop_cond, label %done, label %loop107 108done:109 ret i32 %iv110 111failed_1:112 ret i32 -1113 114failed_2:115 ret i32 -2116}117 118define i32 @test_litter_conditions_bad_context(i32 %start, i32 %len) {119; CHECK-LABEL: 'test_litter_conditions_bad_context'120; CHECK-NEXT: Classifying expressions for: @test_litter_conditions_bad_context121; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]122; CHECK-NEXT: --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }123; CHECK-NEXT: %fake_1 = call i1 @cond()124; CHECK-NEXT: --> %fake_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }125; CHECK-NEXT: %and_1 = and i1 %zero_check, %fake_1126; CHECK-NEXT: --> (%zero_check umin %fake_1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }127; CHECK-NEXT: %iv.minus.1 = add i32 %iv, -1128; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }129; CHECK-NEXT: %fake_2 = call i1 @cond()130; CHECK-NEXT: --> %fake_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }131; CHECK-NEXT: %and_2 = and i1 %range_check, %fake_2132; CHECK-NEXT: --> (%range_check umin %fake_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }133; CHECK-NEXT: %iv.next = add i32 %iv, -1134; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }135; CHECK-NEXT: %loop_cond = call i1 @cond()136; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }137; CHECK-NEXT: Determining loop execution counts for: @test_litter_conditions_bad_context138; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.139; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***140; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***141; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***142; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1143; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %start144; CHECK-NEXT: symbolic max exit count for loop: %start145; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***146; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***147;148entry:149 br label %loop150 151loop:152 %iv = phi i32 [%start, %entry], [%iv.next, %backedge]153 %zero_check = icmp ne i32 %iv, 0154 %fake_1 = call i1 @cond()155 %and_1 = and i1 %zero_check, %fake_1156 %iv.minus.1 = add i32 %iv, -1157 %range_check = icmp ult i32 %iv.minus.1, %len158 %fake_2 = call i1 @cond()159 %and_2 = and i1 %range_check, %fake_2160 br i1 %and_1, label %range_check_block, label %failed_1161 162range_check_block:163 br i1 %and_2, label %backedge, label %failed_2164 165backedge:166 %iv.next = add i32 %iv, -1167 %loop_cond = call i1 @cond()168 br i1 %loop_cond, label %done, label %loop169 170done:171 ret i32 %iv172 173failed_1:174 ret i32 -1175 176failed_2:177 ret i32 -2178}179 180define i32 @test_and_conditions(i32 %start, i32 %len) {181; CHECK-LABEL: 'test_and_conditions'182; CHECK-NEXT: Classifying expressions for: @test_and_conditions183; CHECK-NEXT: %iv = phi i32 [ %start, %entry ], [ %iv.next, %backedge ]184; CHECK-NEXT: --> {%start,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }185; CHECK-NEXT: %iv.minus.1 = add i32 %iv, -1186; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }187; CHECK-NEXT: %both_checks = and i1 %zero_check, %range_check188; CHECK-NEXT: --> (%range_check umin %zero_check) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }189; CHECK-NEXT: %iv.next = add i32 %iv, -1190; CHECK-NEXT: --> {(-1 + %start),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }191; CHECK-NEXT: %loop_cond = call i1 @cond()192; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }193; CHECK-NEXT: Determining loop execution counts for: @test_and_conditions194; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.195; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***196; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***197; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1198; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %start199; CHECK-NEXT: symbolic max exit count for loop: %start200; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***201;202entry:203 br label %loop204 205loop:206 %iv = phi i32 [%start, %entry], [%iv.next, %backedge]207 %zero_check = icmp ne i32 %iv, 0208 %iv.minus.1 = add i32 %iv, -1209 %range_check = icmp ult i32 %iv.minus.1, %len210 %both_checks = and i1 %zero_check, %range_check211 br i1 %both_checks, label %backedge, label %failed212 213backedge:214 %iv.next = add i32 %iv, -1215 %loop_cond = call i1 @cond()216 br i1 %loop_cond, label %done, label %loop217 218done:219 ret i32 %iv220 221failed:222 ret i32 -3223}224 225define i32 @test_mixup_constant_symbolic(i32 %end, i32 %len) {226; CHECK-LABEL: 'test_mixup_constant_symbolic'227; CHECK-NEXT: Classifying expressions for: @test_mixup_constant_symbolic228; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]229; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1001) S: [0,1001) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }230; CHECK-NEXT: %iv.next = add i32 %iv, 1231; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,1002) S: [1,1002) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }232; CHECK-NEXT: %loop_cond = call i1 @cond()233; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }234; CHECK-NEXT: Determining loop execution counts for: @test_mixup_constant_symbolic235; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.236; CHECK-NEXT: exit count for loop: %end237; CHECK-NEXT: exit count for range_check_block: i32 1000238; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***239; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 1000240; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1000 umin %end)241; CHECK-NEXT: symbolic max exit count for loop: %end242; CHECK-NEXT: symbolic max exit count for range_check_block: i32 1000243; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***244;245entry:246 br label %loop247 248loop:249 %iv = phi i32 [0, %entry], [%iv.next, %backedge]250 %zero_check = icmp ne i32 %iv, %end251 br i1 %zero_check, label %range_check_block, label %failed_1252 253range_check_block:254 %range_check = icmp ult i32 %iv, 1000255 br i1 %range_check, label %backedge, label %failed_2256 257backedge:258 %iv.next = add i32 %iv, 1259 %loop_cond = call i1 @cond()260 br i1 %loop_cond, label %done, label %loop261 262done:263 ret i32 %iv264 265failed_1:266 ret i32 -1267 268failed_2:269 ret i32 -2270}271 272define i32 @test_mixup_constant_symbolic_merged(i32 %end, i32 %len) {273; CHECK-LABEL: 'test_mixup_constant_symbolic_merged'274; CHECK-NEXT: Classifying expressions for: @test_mixup_constant_symbolic_merged275; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %backedge ]276; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1001) S: [0,1001) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }277; CHECK-NEXT: %and = and i1 %zero_check, %range_check278; CHECK-NEXT: --> (%range_check umin %zero_check) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }279; CHECK-NEXT: %iv.next = add i32 %iv, 1280; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,1002) S: [1,1002) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }281; CHECK-NEXT: %loop_cond = call i1 @cond()282; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }283; CHECK-NEXT: Determining loop execution counts for: @test_mixup_constant_symbolic_merged284; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.285; CHECK-NEXT: exit count for loop: (1000 umin %end)286; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***287; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 1000288; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (1000 umin %end)289; CHECK-NEXT: symbolic max exit count for loop: (1000 umin %end)290; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***291;292entry:293 br label %loop294 295loop:296 %iv = phi i32 [0, %entry], [%iv.next, %backedge]297 %zero_check = icmp ne i32 %iv, %end298 %range_check = icmp ult i32 %iv, 1000299 %and = and i1 %zero_check, %range_check300 br i1 %and, label %backedge, label %failed_1301 302backedge:303 %iv.next = add i32 %iv, 1304 %loop_cond = call i1 @cond()305 br i1 %loop_cond, label %done, label %loop306 307done:308 ret i32 %iv309 310failed_1:311 ret i32 -1312}313 314define i32 @test_two_phis(i32 %start_1, i32 %start_2, i32 %len) {315; CHECK-LABEL: 'test_two_phis'316; CHECK-NEXT: Classifying expressions for: @test_two_phis317; CHECK-NEXT: %iv_1 = phi i32 [ %start_1, %entry ], [ %iv_1.next, %backedge ]318; CHECK-NEXT: --> {%start_1,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }319; CHECK-NEXT: %iv_2 = phi i32 [ %start_2, %entry ], [ %iv_2.next, %backedge ]320; CHECK-NEXT: --> {%start_2,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }321; CHECK-NEXT: %scam_1 = call i1 @cond()322; CHECK-NEXT: --> %scam_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }323; CHECK-NEXT: %c1 = and i1 %zero_check_1, %scam_1324; CHECK-NEXT: --> (%zero_check_1 umin %scam_1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }325; CHECK-NEXT: %scam_2 = call i1 @cond()326; CHECK-NEXT: --> %scam_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }327; CHECK-NEXT: %c2 = and i1 %zero_check_2, %scam_2328; CHECK-NEXT: --> (%zero_check_2 umin %scam_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }329; CHECK-NEXT: %iv.minus.1 = add i32 %iv_1, -1330; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }331; CHECK-NEXT: %iv_1.next = add i32 %iv_1, -1332; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }333; CHECK-NEXT: %iv_2.next = add i32 %iv_2, -1334; CHECK-NEXT: --> {(-1 + %start_2),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }335; CHECK-NEXT: %loop_cond = call i1 @cond()336; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }337; CHECK-NEXT: Determining loop execution counts for: @test_two_phis338; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.339; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***340; CHECK-NEXT: exit count for zero_check_block: ***COULDNOTCOMPUTE***341; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***342; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***343; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1344; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%start_1 umin_seq %start_2)345; CHECK-NEXT: symbolic max exit count for loop: %start_1346; CHECK-NEXT: symbolic max exit count for zero_check_block: %start_2347; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***348; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***349;350entry:351 br label %loop352 353loop:354 %iv_1 = phi i32 [%start_1, %entry], [%iv_1.next, %backedge]355 %iv_2 = phi i32 [%start_2, %entry], [%iv_2.next, %backedge]356 %scam_1 = call i1 @cond()357 %zero_check_1 = icmp ne i32 %iv_1, 0358 %c1 = and i1 %zero_check_1, %scam_1359 br i1 %c1, label %zero_check_block, label %failed_1360 361zero_check_block:362 %scam_2 = call i1 @cond()363 %zero_check_2 = icmp ne i32 %iv_2, 0364 %c2 = and i1 %zero_check_2, %scam_2365 br i1 %c2, label %range_check_block, label %failed_1366 367range_check_block:368 %iv.minus.1 = add i32 %iv_1, -1369 %range_check = icmp ult i32 %iv.minus.1, %len370 br i1 %range_check, label %backedge, label %failed_2371 372backedge:373 %iv_1.next = add i32 %iv_1, -1374 %iv_2.next = add i32 %iv_2, -1375 %loop_cond = call i1 @cond()376 br i1 %loop_cond, label %done, label %loop377 378done:379 ret i32 %iv_2380 381failed_1:382 ret i32 -1383 384failed_2:385 ret i32 -2386}387 388define i32 @test_two_phis_simple(i32 %start_1, i32 %start_2, i32 %len) {389; CHECK-LABEL: 'test_two_phis_simple'390; CHECK-NEXT: Classifying expressions for: @test_two_phis_simple391; CHECK-NEXT: %iv_1 = phi i32 [ %start_1, %entry ], [ %iv_1.next, %backedge ]392; CHECK-NEXT: --> {%start_1,+,-1}<%loop> U: full-set S: full-set Exits: ((-1 * (%start_1 umin_seq %start_2)) + %start_1) LoopDispositions: { %loop: Computable }393; CHECK-NEXT: %iv_2 = phi i32 [ %start_2, %entry ], [ %iv_2.next, %backedge ]394; CHECK-NEXT: --> {%start_2,+,-1}<%loop> U: full-set S: full-set Exits: ((-1 * (%start_1 umin_seq %start_2)) + %start_2) LoopDispositions: { %loop: Computable }395; CHECK-NEXT: %iv_1.next = add i32 %iv_1, -1396; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: (-1 + (-1 * (%start_1 umin_seq %start_2)) + %start_1) LoopDispositions: { %loop: Computable }397; CHECK-NEXT: %iv_2.next = add i32 %iv_2, -1398; CHECK-NEXT: --> {(-1 + %start_2),+,-1}<%loop> U: full-set S: full-set Exits: (-1 + (-1 * (%start_1 umin_seq %start_2)) + %start_2) LoopDispositions: { %loop: Computable }399; CHECK-NEXT: Determining loop execution counts for: @test_two_phis_simple400; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%start_1 umin_seq %start_2)401; CHECK-NEXT: exit count for loop: %start_1402; CHECK-NEXT: exit count for backedge: %start_2403; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1404; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%start_1 umin_seq %start_2)405; CHECK-NEXT: symbolic max exit count for loop: %start_1406; CHECK-NEXT: symbolic max exit count for backedge: %start_2407; CHECK-NEXT: Loop %loop: Trip multiple is 1408;409entry:410 br label %loop411 412loop:413 %iv_1 = phi i32 [%start_1, %entry], [%iv_1.next, %backedge]414 %iv_2 = phi i32 [%start_2, %entry], [%iv_2.next, %backedge]415 %zero_check_1 = icmp ne i32 %iv_1, 0416 br i1 %zero_check_1, label %backedge, label %exit417 418backedge:419 %zero_check_2 = icmp ne i32 %iv_2, 0420 %iv_1.next = add i32 %iv_1, -1421 %iv_2.next = add i32 %iv_2, -1422 br i1 %zero_check_2, label %loop, label %exit423 424exit:425 ret i32 0426}427 428define i32 @test_two_phis_arithmetic_and(i32 %start_1, i32 %start_2, i32 %len) {429; CHECK-LABEL: 'test_two_phis_arithmetic_and'430; CHECK-NEXT: Classifying expressions for: @test_two_phis_arithmetic_and431; CHECK-NEXT: %iv_1 = phi i32 [ %start_1, %entry ], [ %iv_1.next, %backedge ]432; CHECK-NEXT: --> {%start_1,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }433; CHECK-NEXT: %iv_2 = phi i32 [ %start_2, %entry ], [ %iv_2.next, %backedge ]434; CHECK-NEXT: --> {%start_2,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }435; CHECK-NEXT: %scam_1 = call i1 @cond()436; CHECK-NEXT: --> %scam_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }437; CHECK-NEXT: %c1 = and i1 %zero_check_1, %scam_1438; CHECK-NEXT: --> (%zero_check_1 umin %scam_1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }439; CHECK-NEXT: %scam_2 = call i1 @cond()440; CHECK-NEXT: --> %scam_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }441; CHECK-NEXT: %c2 = and i1 %zero_check_2, %scam_2442; CHECK-NEXT: --> (%zero_check_2 umin %scam_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }443; CHECK-NEXT: %merged_cond = and i1 %c1, %c2444; CHECK-NEXT: --> (%zero_check_1 umin %zero_check_2 umin %scam_1 umin %scam_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }445; CHECK-NEXT: %iv.minus.1 = add i32 %iv_1, -1446; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }447; CHECK-NEXT: %iv_1.next = add i32 %iv_1, -1448; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }449; CHECK-NEXT: %iv_2.next = add i32 %iv_2, -1450; CHECK-NEXT: --> {(-1 + %start_2),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }451; CHECK-NEXT: %loop_cond = call i1 @cond()452; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }453; CHECK-NEXT: Determining loop execution counts for: @test_two_phis_arithmetic_and454; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.455; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***456; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***457; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***458; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1459; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%start_1 umin %start_2)460; CHECK-NEXT: symbolic max exit count for loop: (%start_1 umin %start_2)461; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***462; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***463;464entry:465 br label %loop466 467loop:468 %iv_1 = phi i32 [%start_1, %entry], [%iv_1.next, %backedge]469 %iv_2 = phi i32 [%start_2, %entry], [%iv_2.next, %backedge]470 %scam_1 = call i1 @cond()471 %zero_check_1 = icmp ne i32 %iv_1, 0472 %c1 = and i1 %zero_check_1, %scam_1473 %scam_2 = call i1 @cond()474 %zero_check_2 = icmp ne i32 %iv_2, 0475 %c2 = and i1 %zero_check_2, %scam_2476 %merged_cond = and i1 %c1, %c2477 br i1 %merged_cond, label %range_check_block, label %failed_1478 479range_check_block:480 %iv.minus.1 = add i32 %iv_1, -1481 %range_check = icmp ult i32 %iv.minus.1, %len482 br i1 %range_check, label %backedge, label %failed_2483 484backedge:485 %iv_1.next = add i32 %iv_1, -1486 %iv_2.next = add i32 %iv_2, -1487 %loop_cond = call i1 @cond()488 br i1 %loop_cond, label %done, label %loop489 490done:491 ret i32 %iv_2492 493failed_1:494 ret i32 -1495 496failed_2:497 ret i32 -2498}499 500; TODO: Symbolic max can be start1 umax_seq start2501define i32 @test_two_phis_logical_or(i32 %start_1, i32 %start_2, i32 %len) {502; CHECK-LABEL: 'test_two_phis_logical_or'503; CHECK-NEXT: Classifying expressions for: @test_two_phis_logical_or504; CHECK-NEXT: %iv_1 = phi i32 [ %start_1, %entry ], [ %iv_1.next, %backedge ]505; CHECK-NEXT: --> {%start_1,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }506; CHECK-NEXT: %iv_2 = phi i32 [ %start_2, %entry ], [ %iv_2.next, %backedge ]507; CHECK-NEXT: --> {%start_2,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }508; CHECK-NEXT: %scam_1 = call i1 @cond()509; CHECK-NEXT: --> %scam_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }510; CHECK-NEXT: %c1 = and i1 %zero_check_1, %scam_1511; CHECK-NEXT: --> (%zero_check_1 umin %scam_1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }512; CHECK-NEXT: %scam_2 = call i1 @cond()513; CHECK-NEXT: --> %scam_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }514; CHECK-NEXT: %c2 = and i1 %zero_check_2, %scam_2515; CHECK-NEXT: --> (%zero_check_2 umin %scam_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }516; CHECK-NEXT: %merged_cond = select i1 %c1, i1 true, i1 %c2517; CHECK-NEXT: --> (true + ((true + (%zero_check_1 umin %scam_1)) umin_seq (true + (%zero_check_2 umin %scam_2)))) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }518; CHECK-NEXT: %iv.minus.1 = add i32 %iv_1, -1519; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }520; CHECK-NEXT: %iv_1.next = add i32 %iv_1, -1521; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }522; CHECK-NEXT: %iv_2.next = add i32 %iv_2, -1523; CHECK-NEXT: --> {(-1 + %start_2),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }524; CHECK-NEXT: %loop_cond = call i1 @cond()525; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }526; CHECK-NEXT: Determining loop execution counts for: @test_two_phis_logical_or527; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.528; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***529; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***530; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***531; CHECK-NEXT: Loop %loop: Unpredictable constant max backedge-taken count.532; CHECK-NEXT: Loop %loop: Unpredictable symbolic max backedge-taken count.533; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***534; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***535; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***536;537entry:538 br label %loop539 540loop:541 %iv_1 = phi i32 [%start_1, %entry], [%iv_1.next, %backedge]542 %iv_2 = phi i32 [%start_2, %entry], [%iv_2.next, %backedge]543 %scam_1 = call i1 @cond()544 %zero_check_1 = icmp ne i32 %iv_1, 0545 %c1 = and i1 %zero_check_1, %scam_1546 %scam_2 = call i1 @cond()547 %zero_check_2 = icmp ne i32 %iv_2, 0548 %c2 = and i1 %zero_check_2, %scam_2549 %merged_cond = select i1 %c1, i1 true, i1 %c2550 br i1 %merged_cond, label %range_check_block, label %failed_1551 552range_check_block:553 %iv.minus.1 = add i32 %iv_1, -1554 %range_check = icmp ult i32 %iv.minus.1, %len555 br i1 %range_check, label %backedge, label %failed_2556 557backedge:558 %iv_1.next = add i32 %iv_1, -1559 %iv_2.next = add i32 %iv_2, -1560 %loop_cond = call i1 @cond()561 br i1 %loop_cond, label %done, label %loop562 563done:564 ret i32 %iv_2565 566failed_1:567 ret i32 -1568 569failed_2:570 ret i32 -2571}572 573define i32 @test_two_phis_logical_and(i32 %start_1, i32 %start_2, i32 %len) {574; CHECK-LABEL: 'test_two_phis_logical_and'575; CHECK-NEXT: Classifying expressions for: @test_two_phis_logical_and576; CHECK-NEXT: %iv_1 = phi i32 [ %start_1, %entry ], [ %iv_1.next, %backedge ]577; CHECK-NEXT: --> {%start_1,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }578; CHECK-NEXT: %iv_2 = phi i32 [ %start_2, %entry ], [ %iv_2.next, %backedge ]579; CHECK-NEXT: --> {%start_2,+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }580; CHECK-NEXT: %scam_1 = call i1 @cond()581; CHECK-NEXT: --> %scam_1 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }582; CHECK-NEXT: %c1 = and i1 %zero_check_1, %scam_1583; CHECK-NEXT: --> (%zero_check_1 umin %scam_1) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }584; CHECK-NEXT: %scam_2 = call i1 @cond()585; CHECK-NEXT: --> %scam_2 U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }586; CHECK-NEXT: %c2 = and i1 %zero_check_2, %scam_2587; CHECK-NEXT: --> (%zero_check_2 umin %scam_2) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }588; CHECK-NEXT: %merged_cond = select i1 %c1, i1 %c2, i1 false589; CHECK-NEXT: --> ((%zero_check_1 umin %scam_1) umin_seq (%zero_check_2 umin %scam_2)) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }590; CHECK-NEXT: %iv.minus.1 = add i32 %iv_1, -1591; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }592; CHECK-NEXT: %iv_1.next = add i32 %iv_1, -1593; CHECK-NEXT: --> {(-1 + %start_1),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }594; CHECK-NEXT: %iv_2.next = add i32 %iv_2, -1595; CHECK-NEXT: --> {(-1 + %start_2),+,-1}<%loop> U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Computable }596; CHECK-NEXT: %loop_cond = call i1 @cond()597; CHECK-NEXT: --> %loop_cond U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }598; CHECK-NEXT: Determining loop execution counts for: @test_two_phis_logical_and599; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.600; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***601; CHECK-NEXT: exit count for range_check_block: ***COULDNOTCOMPUTE***602; CHECK-NEXT: exit count for backedge: ***COULDNOTCOMPUTE***603; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1604; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%start_1 umin_seq %start_2)605; CHECK-NEXT: symbolic max exit count for loop: (%start_1 umin_seq %start_2)606; CHECK-NEXT: symbolic max exit count for range_check_block: ***COULDNOTCOMPUTE***607; CHECK-NEXT: symbolic max exit count for backedge: ***COULDNOTCOMPUTE***608;609entry:610 br label %loop611 612loop:613 %iv_1 = phi i32 [%start_1, %entry], [%iv_1.next, %backedge]614 %iv_2 = phi i32 [%start_2, %entry], [%iv_2.next, %backedge]615 %scam_1 = call i1 @cond()616 %zero_check_1 = icmp ne i32 %iv_1, 0617 %c1 = and i1 %zero_check_1, %scam_1618 %scam_2 = call i1 @cond()619 %zero_check_2 = icmp ne i32 %iv_2, 0620 %c2 = and i1 %zero_check_2, %scam_2621 %merged_cond = select i1 %c1, i1 %c2, i1 false622 br i1 %merged_cond, label %range_check_block, label %failed_1623 624range_check_block:625 %iv.minus.1 = add i32 %iv_1, -1626 %range_check = icmp ult i32 %iv.minus.1, %len627 br i1 %range_check, label %backedge, label %failed_2628 629backedge:630 %iv_1.next = add i32 %iv_1, -1631 %iv_2.next = add i32 %iv_2, -1632 %loop_cond = call i1 @cond()633 br i1 %loop_cond, label %done, label %loop634 635done:636 ret i32 %iv_2637 638failed_1:639 ret i32 -1640 641failed_2:642 ret i32 -2643}644