brintos

brintos / llvm-project-archived public Read only

0
0
Text · 19.8 KiB · cf9d999 Raw
513 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2 ; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>,verify<scalar-evolution>" 2>&1 | FileCheck %s3 ; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>,verify<scalar-evolution>" -scev-range-iter-threshold=1 2>&1 | FileCheck %s4 5target datalayout = "e-p:64:64:64-i1:8:8-i8:8:8-i16:16:16-i32:32:32-i64:64:64"6 7; Collection of cases exercising range logic, mostly (but not exclusively)8; involving SCEVUnknowns.9 10declare void @llvm.assume(i1)11 12define i32 @ashr(i32 %a) {13; CHECK-LABEL: 'ashr'14; CHECK-NEXT:  Classifying expressions for: @ashr15; CHECK-NEXT:    %ashr = ashr i32 %a, 3116; CHECK-NEXT:    --> %ashr U: [0,1) S: [0,1)17; CHECK-NEXT:  Determining loop execution counts for: @ashr18;19  %ashr = ashr i32 %a, 3120  %pos = icmp sge i32 %a, 021  call void @llvm.assume(i1 %pos)22  ret i32 %ashr23}24 25; Highlight the fact that non-argument non-instructions are26; also possible.27@G = external global i828define i64 @ashr_global() {29; CHECK-LABEL: 'ashr_global'30; CHECK-NEXT:  Classifying expressions for: @ashr_global31; CHECK-NEXT:    %ashr = ashr i64 ptrtoint (ptr @G to i64), 6332; CHECK-NEXT:    --> %ashr U: [0,1) S: [0,1)33; CHECK-NEXT:  Determining loop execution counts for: @ashr_global34;35  %ashr = ashr i64 ptrtoint (ptr @G to i64), 6336  %pos = icmp sge ptr @G, null37  call void @llvm.assume(i1 %pos)38  ret i64 %ashr39}40 41 42define i32 @shl(i32 %a) {43; CHECK-LABEL: 'shl'44; CHECK-NEXT:  Classifying expressions for: @shl45; CHECK-NEXT:    %res = shl i32 %a, 246; CHECK-NEXT:    --> (4 * %a) U: [0,-3) S: [-2147483648,2147483645)47; CHECK-NEXT:  Determining loop execution counts for: @shl48;49  %res = shl i32 %a, 250  %pos = icmp ult i32 %a, 102451  call void @llvm.assume(i1 %pos)52  ret i32 %res53}54 55define i32 @lshr(i32 %a) {56; CHECK-LABEL: 'lshr'57; CHECK-NEXT:  Classifying expressions for: @lshr58; CHECK-NEXT:    %res = lshr i32 %a, 3159; CHECK-NEXT:    --> (%a /u -2147483648) U: [0,2) S: [0,2)60; CHECK-NEXT:  Determining loop execution counts for: @lshr61;62  %res = lshr i32 %a, 3163  %pos = icmp sge i32 %a, 064  call void @llvm.assume(i1 %pos)65  ret i32 %res66}67 68 69define i32 @udiv(i32 %a) {70; CHECK-LABEL: 'udiv'71; CHECK-NEXT:  Classifying expressions for: @udiv72; CHECK-NEXT:    %res = udiv i32 %a, -214748364873; CHECK-NEXT:    --> (%a /u -2147483648) U: [0,2) S: [0,2)74; CHECK-NEXT:  Determining loop execution counts for: @udiv75;76  %res = udiv i32 %a, 214748364877  %pos = icmp sge i32 %a, 078  call void @llvm.assume(i1 %pos)79  ret i32 %res80}81 82define i64 @sext(i8 %a) {83; CHECK-LABEL: 'sext'84; CHECK-NEXT:  Classifying expressions for: @sext85; CHECK-NEXT:    %res = sext i8 %a to i6486; CHECK-NEXT:    --> (sext i8 %a to i64) U: [-128,128) S: [-128,128)87; CHECK-NEXT:  Determining loop execution counts for: @sext88;89  %res = sext i8 %a to i6490  %pos = icmp sge i8 %a, 091  call void @llvm.assume(i1 %pos)92  ret i64 %res93}94 95define i64 @zext(i8 %a) {96; CHECK-LABEL: 'zext'97; CHECK-NEXT:  Classifying expressions for: @zext98; CHECK-NEXT:    %res = zext i8 %a to i6499; CHECK-NEXT:    --> (zext i8 %a to i64) U: [0,256) S: [0,256)100; CHECK-NEXT:  Determining loop execution counts for: @zext101;102  %res = zext i8 %a to i64103  %pos = icmp sge i8 %a, 0104  call void @llvm.assume(i1 %pos)105  ret i64 %res106}107 108define i32 @phi_div() {109; CHECK-LABEL: 'phi_div'110; CHECK-NEXT:  Classifying expressions for: @phi_div111; CHECK-NEXT:    %range.1 = phi i32 [ 0, %entry ], [ %shr, %loop ]112; CHECK-NEXT:    --> %range.1 U: [0,1) S: [0,1) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }113; CHECK-NEXT:    %shr = lshr i32 %range.1, 1114; CHECK-NEXT:    --> (%range.1 /u 2) U: [0,1) S: [0,1) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }115; CHECK-NEXT:  Determining loop execution counts for: @phi_div116; CHECK-NEXT:  Loop %loop: <multiple exits> Unpredictable backedge-taken count.117; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.118; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.119;120entry:121  br label %loop122 123loop:124  %range.1 = phi i32 [ 0, %entry ], [ %shr, %loop ]125  %shr = lshr i32 %range.1, 1126  br label %loop127}128 129define void @add_6(i32 %n) {130; CHECK-LABEL: 'add_6'131; CHECK-NEXT:  Classifying expressions for: @add_6132; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]133; CHECK-NEXT:    --> {0,+,6}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,2147483647) Exits: (6 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 6) + (1 umin %n))) LoopDispositions: { %loop: Computable }134; CHECK-NEXT:    %iv.inc = add nsw i32 %iv, 6135; CHECK-NEXT:    --> {6,+,6}<nuw><%loop> U: [6,-3) S: [-2147483648,2147483647) Exits: (6 + (6 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 6) + (1 umin %n)))) LoopDispositions: { %loop: Computable }136; CHECK-NEXT:  Determining loop execution counts for: @add_6137; CHECK-NEXT:  Loop %loop: backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 6) + (1 umin %n))138; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 715827882139; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 6) + (1 umin %n))140; CHECK-NEXT:  Loop %loop: Trip multiple is 1141;142entry:143  br label %loop144 145loop:146  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]147  %iv.inc = add nsw i32 %iv, 6148  %becond = icmp ult i32 %iv, %n149  br i1 %becond, label %loop, label %leave150 151leave:152  ret void153}154define void @add_7(i32 %n) {155; CHECK-LABEL: 'add_7'156; CHECK-NEXT:  Classifying expressions for: @add_7157; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]158; CHECK-NEXT:    --> {0,+,7}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,-2147483648) Exits: (7 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 7) + (1 umin %n))) LoopDispositions: { %loop: Computable }159; CHECK-NEXT:    %iv.inc = add nsw i32 %iv, 7160; CHECK-NEXT:    --> {7,+,7}<nuw><%loop> U: [7,-3) S: [7,0) Exits: (7 + (7 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 7) + (1 umin %n)))) LoopDispositions: { %loop: Computable }161; CHECK-NEXT:  Determining loop execution counts for: @add_7162; CHECK-NEXT:  Loop %loop: backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 7) + (1 umin %n))163; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 613566756164; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 7) + (1 umin %n))165; CHECK-NEXT:  Loop %loop: Trip multiple is 1166;167entry:168  br label %loop169 170loop:171  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]172  %iv.inc = add nsw i32 %iv, 7173  %becond = icmp ult i32 %iv, %n174  br i1 %becond, label %loop, label %leave175 176leave:177  ret void178}179define void @add_8(i32 %n) {180; CHECK-LABEL: 'add_8'181; CHECK-NEXT:  Classifying expressions for: @add_8182; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]183; CHECK-NEXT:    --> {0,+,8}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,2147483641) Exits: (8 * ((7 + %n) /u 8))<nuw> LoopDispositions: { %loop: Computable }184; CHECK-NEXT:    %iv.inc = add nsw i32 %iv, 8185; CHECK-NEXT:    --> {8,+,8}<nuw><%loop> U: [8,-7) S: [-2147483648,2147483641) Exits: (8 + (8 * ((7 + %n) /u 8))<nuw>) LoopDispositions: { %loop: Computable }186; CHECK-NEXT:  Determining loop execution counts for: @add_8187; CHECK-NEXT:  Loop %loop: backedge-taken count is ((7 + %n) /u 8)188; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 536870911189; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((7 + %n) /u 8)190; CHECK-NEXT:  Loop %loop: Trip multiple is 1191;192entry:193  br label %loop194 195loop:196  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]197  %iv.inc = add nsw i32 %iv, 8198  %becond = icmp ult i32 %iv, %n199  br i1 %becond, label %loop, label %leave200 201leave:202  ret void203}204 205define void @add_9(i32 %n) {206; CHECK-LABEL: 'add_9'207; CHECK-NEXT:  Classifying expressions for: @add_9208; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]209; CHECK-NEXT:    --> {0,+,9}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,-2147483648) Exits: (9 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n))) LoopDispositions: { %loop: Computable }210; CHECK-NEXT:    %iv.inc = add nsw i32 %iv, 9211; CHECK-NEXT:    --> {9,+,9}<nuw><%loop> U: [9,-3) S: [9,0) Exits: (9 + (9 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n)))) LoopDispositions: { %loop: Computable }212; CHECK-NEXT:  Determining loop execution counts for: @add_9213; CHECK-NEXT:  Loop %loop: backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n))214; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 477218588215; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n))216; CHECK-NEXT:  Loop %loop: Trip multiple is 1217;218entry:219  br label %loop220 221loop:222  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]223  %iv.inc = add nsw i32 %iv, 9224  %becond = icmp ult i32 %iv, %n225  br i1 %becond, label %loop, label %leave226 227leave:228  ret void229}230 231define void @add_10(i32 %n) {232; CHECK-LABEL: 'add_10'233; CHECK-NEXT:  Classifying expressions for: @add_10234; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]235; CHECK-NEXT:    --> {0,+,10}<nuw><nsw><%loop> U: [0,-2147483648) S: [0,2147483647) Exits: (10 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 10) + (1 umin %n))) LoopDispositions: { %loop: Computable }236; CHECK-NEXT:    %iv.inc = add nsw i32 %iv, 10237; CHECK-NEXT:    --> {10,+,10}<nuw><%loop> U: [10,-5) S: [-2147483648,2147483647) Exits: (10 + (10 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 10) + (1 umin %n)))) LoopDispositions: { %loop: Computable }238; CHECK-NEXT:  Determining loop execution counts for: @add_10239; CHECK-NEXT:  Loop %loop: backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 10) + (1 umin %n))240; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i32 429496729241; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 10) + (1 umin %n))242; CHECK-NEXT:  Loop %loop: Trip multiple is 1243;244entry:245  br label %loop246 247loop:248  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]249  %iv.inc = add nsw i32 %iv, 10250  %becond = icmp ult i32 %iv, %n251  br i1 %becond, label %loop, label %leave252 253leave:254  ret void255}256 257define void @add_8_wrap(i32 %n) {258; CHECK-LABEL: 'add_8_wrap'259; CHECK-NEXT:  Classifying expressions for: @add_8_wrap260; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]261; CHECK-NEXT:    --> {0,+,8}<%loop> U: [0,-7) S: [-2147483648,2147483641) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }262; CHECK-NEXT:    %iv.inc = add i32 %iv, 8263; CHECK-NEXT:    --> {8,+,8}<%loop> U: [0,-7) S: [-2147483648,2147483641) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }264; CHECK-NEXT:  Determining loop execution counts for: @add_8_wrap265; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.266; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.267; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.268;269entry:270  br label %loop271 272loop:273  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]274  %iv.inc = add i32 %iv, 8275  %becond = icmp ult i32 %iv, %n276  br i1 %becond, label %loop, label %leave277 278leave:279  ret void280}281 282define void @add_10_wrap(i32 %n) {283; CHECK-LABEL: 'add_10_wrap'284; CHECK-NEXT:  Classifying expressions for: @add_10_wrap285; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]286; CHECK-NEXT:    --> {0,+,10}<%loop> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }287; CHECK-NEXT:    %iv.inc = add i32 %iv, 10288; CHECK-NEXT:    --> {10,+,10}<%loop> U: [0,-1) S: [-2147483648,2147483647) Exits: <<Unknown>> LoopDispositions: { %loop: Computable }289; CHECK-NEXT:  Determining loop execution counts for: @add_10_wrap290; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.291; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.292; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.293;294entry:295  br label %loop296 297loop:298  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]299  %iv.inc = add i32 %iv, 10300  %becond = icmp ult i32 %iv, %n301  br i1 %becond, label %loop, label %leave302 303leave:304  ret void305}306 307define void @mul_6(i32 %n) {308; CHECK-LABEL: 'mul_6'309; CHECK-NEXT:  Classifying expressions for: @mul_6310; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]311; CHECK-NEXT:    --> %iv U: [0,-1) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }312; CHECK-NEXT:    %iv.inc = mul nuw i32 %iv, 6313; CHECK-NEXT:    --> (6 * %iv) U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }314; CHECK-NEXT:  Determining loop execution counts for: @mul_6315; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.316; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.317; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.318;319entry:320  br label %loop321 322loop:323  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]324  %iv.inc = mul nuw i32 %iv, 6325  %becond = icmp ult i32 %iv, %n326  br i1 %becond, label %loop, label %leave327 328leave:329  ret void330}331 332define void @mul_7(i32 %n) {333; CHECK-LABEL: 'mul_7'334; CHECK-NEXT:  Classifying expressions for: @mul_7335; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]336; CHECK-NEXT:    --> %iv U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }337; CHECK-NEXT:    %iv.inc = mul nuw i32 %iv, 7338; CHECK-NEXT:    --> (7 * %iv) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }339; CHECK-NEXT:  Determining loop execution counts for: @mul_7340; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.341; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.342; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.343;344entry:345  br label %loop346 347loop:348  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]349  %iv.inc = mul nuw i32 %iv, 7350  %becond = icmp ult i32 %iv, %n351  br i1 %becond, label %loop, label %leave352 353leave:354  ret void355}356 357define void @mul_8(i32 %n) {358; CHECK-LABEL: 'mul_8'359; CHECK-NEXT:  Classifying expressions for: @mul_8360; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]361; CHECK-NEXT:    --> %iv U: [0,-7) S: [-2147483648,2147483585) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }362; CHECK-NEXT:    %iv.inc = mul nuw i32 %iv, 8363; CHECK-NEXT:    --> (8 * %iv) U: [0,-63) S: [-2147483648,2147483585) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }364; CHECK-NEXT:  Determining loop execution counts for: @mul_8365; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.366; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.367; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.368;369entry:370  br label %loop371 372loop:373  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]374  %iv.inc = mul nuw i32 %iv, 8375  %becond = icmp ult i32 %iv, %n376  br i1 %becond, label %loop, label %leave377 378leave:379  ret void380}381 382define void @mul_9(i32 %n) {383; CHECK-LABEL: 'mul_9'384; CHECK-NEXT:  Classifying expressions for: @mul_9385; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]386; CHECK-NEXT:    --> %iv U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }387; CHECK-NEXT:    %iv.inc = mul nuw i32 %iv, 9388; CHECK-NEXT:    --> (9 * %iv) U: full-set S: full-set Exits: <<Unknown>> LoopDispositions: { %loop: Variant }389; CHECK-NEXT:  Determining loop execution counts for: @mul_9390; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.391; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.392; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.393;394entry:395  br label %loop396 397loop:398  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]399  %iv.inc = mul nuw i32 %iv, 9400  %becond = icmp ult i32 %iv, %n401  br i1 %becond, label %loop, label %leave402 403leave:404  ret void405}406 407define void @mul_10(i32 %n) {408; CHECK-LABEL: 'mul_10'409; CHECK-NEXT:  Classifying expressions for: @mul_10410; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]411; CHECK-NEXT:    --> %iv U: [0,-1) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }412; CHECK-NEXT:    %iv.inc = mul nuw i32 %iv, 10413; CHECK-NEXT:    --> (10 * %iv) U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }414; CHECK-NEXT:  Determining loop execution counts for: @mul_10415; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.416; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.417; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.418;419entry:420  br label %loop421 422loop:423  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]424  %iv.inc = mul nuw i32 %iv, 10425  %becond = icmp ult i32 %iv, %n426  br i1 %becond, label %loop, label %leave427 428leave:429  ret void430}431 432define void @mul_8_wrap(i32 %n) {433; CHECK-LABEL: 'mul_8_wrap'434; CHECK-NEXT:  Classifying expressions for: @mul_8_wrap435; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]436; CHECK-NEXT:    --> %iv U: [0,-7) S: [-2147483648,2147483585) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }437; CHECK-NEXT:    %iv.inc = mul i32 %iv, 8438; CHECK-NEXT:    --> (8 * %iv) U: [0,-63) S: [-2147483648,2147483585) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }439; CHECK-NEXT:  Determining loop execution counts for: @mul_8_wrap440; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.441; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.442; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.443;444entry:445  br label %loop446 447loop:448  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]449  %iv.inc = mul i32 %iv, 8450  %becond = icmp ult i32 %iv, %n451  br i1 %becond, label %loop, label %leave452 453leave:454  ret void455}456 457define void @mul_10_wrap(i32 %n) {458; CHECK-LABEL: 'mul_10_wrap'459; CHECK-NEXT:  Classifying expressions for: @mul_10_wrap460; CHECK-NEXT:    %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]461; CHECK-NEXT:    --> %iv U: [0,-1) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }462; CHECK-NEXT:    %iv.inc = mul i32 %iv, 10463; CHECK-NEXT:    --> (10 * %iv) U: [0,-3) S: [-2147483648,2147483645) Exits: <<Unknown>> LoopDispositions: { %loop: Variant }464; CHECK-NEXT:  Determining loop execution counts for: @mul_10_wrap465; CHECK-NEXT:  Loop %loop: Unpredictable backedge-taken count.466; CHECK-NEXT:  Loop %loop: Unpredictable constant max backedge-taken count.467; CHECK-NEXT:  Loop %loop: Unpredictable symbolic max backedge-taken count.468;469entry:470  br label %loop471 472loop:473  %iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]474  %iv.inc = mul i32 %iv, 10475  %becond = icmp ult i32 %iv, %n476  br i1 %becond, label %loop, label %leave477 478leave:479  ret void480}481 482define void @truncate(i16 %n) {483; %t is not a multiple of 7 because we cannot make the assumption through truncation484; CHECK-LABEL: 'truncate'485; CHECK-NEXT:  Classifying expressions for: @truncate486; CHECK-NEXT:    %iv = phi i16 [ 0, %entry ], [ %iv.inc, %loop ]487; CHECK-NEXT:    --> {0,+,9}<nuw><%loop> U: [0,-6) S: [0,-6) Exits: (9 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n))) LoopDispositions: { %loop: Computable }488; CHECK-NEXT:    %iv.inc = add nuw i16 %iv, 9489; CHECK-NEXT:    --> {9,+,9}<nw><%loop> U: [9,3) S: [9,3) Exits: (9 + (9 * ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n)))) LoopDispositions: { %loop: Computable }490; CHECK-NEXT:    %t = trunc i16 %iv.inc to i8491; CHECK-NEXT:    --> {9,+,9}<%loop> U: full-set S: full-set Exits: (9 + (9 * (trunc i16 ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n)) to i8))) LoopDispositions: { %loop: Computable }492; CHECK-NEXT:  Determining loop execution counts for: @truncate493; CHECK-NEXT:  Loop %loop: backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n))494; CHECK-NEXT:  Loop %loop: constant max backedge-taken count is i16 7281495; CHECK-NEXT:  Loop %loop: symbolic max backedge-taken count is ((((-1 * (1 umin %n))<nuw><nsw> + %n) /u 9) + (1 umin %n))496; CHECK-NEXT:  Loop %loop: Trip multiple is 1497;498entry:499  br label %loop500 501loop:502  %iv = phi i16 [ 0, %entry ], [ %iv.inc, %loop ]503  %iv.inc = add nuw i16 %iv, 9504  %t = trunc i16 %iv.inc to i8505  %becond = icmp ult i16 %iv, %n506  br i1 %becond, label %loop, label %leave507 508leave:509  ret void510}511 512 513