brintos

brintos / llvm-project-archived public Read only

0
0
Text · 30.8 KiB · ab43182 Raw
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