brintos

brintos / llvm-project-archived public Read only

0
0
Text · 13.2 KiB · bd0f603 Raw
291 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt -passes='print<scalar-evolution>,verify<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s3 4; Test trip multiples with functions that look like:5 6; void foo();7; void square(unsigned num) {8;     if (num % 5 == 0)9;     for (unsigned i = 0; i < num; ++i)10;         foo();11; }12 13declare void @foo(...)14 15define void @trip_multiple_3(i32 noundef %num) {16; CHECK-LABEL: 'trip_multiple_3'17; CHECK-NEXT:  Classifying expressions for: @trip_multiple_318; CHECK-NEXT:    %rem = urem i32 %num, 319; CHECK-NEXT:    --> ((-3 * (%num /u 3)) + %num) U: full-set S: full-set20; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp1421; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set22; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]23; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-1) S: [0,-1) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }24; CHECK-NEXT:    %inc = add nuw i32 %i.05, 125; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: %num LoopDispositions: { %for.body: Computable }26; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_327; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)28; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -229; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)30; CHECK-NEXT:  Loop %for.body: Trip multiple is 331;32entry:33  %rem = urem i32 %num, 334  %cmp = icmp eq i32 %rem, 035  %cmp14 = icmp ne i32 %num, 036  %or.cond = and i1 %cmp, %cmp1437  br i1 %or.cond, label %for.body, label %if.end38 39for.body:                                         ; preds = %entry, %for.body40  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]41  tail call void (...) @foo() #242  %inc = add nuw i32 %i.05, 143  %exitcond.not = icmp eq i32 %inc, %num44  br i1 %exitcond.not, label %if.end, label %for.body45 46if.end:                                           ; preds = %for.body, %entry47  ret void48}49define void @trip_multiple_4(i32 noundef %num) {50; CHECK-LABEL: 'trip_multiple_4'51; CHECK-NEXT:  Classifying expressions for: @trip_multiple_452; CHECK-NEXT:    %rem = urem i32 %num, 453; CHECK-NEXT:    --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4)54; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp1455; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set56; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]57; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }58; CHECK-NEXT:    %inc = add nuw i32 %i.05, 159; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }60; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_461; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)62; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -563; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)64; CHECK-NEXT:  Loop %for.body: Trip multiple is 465;66entry:67  %rem = urem i32 %num, 468  %cmp = icmp eq i32 %rem, 069  %cmp14 = icmp ne i32 %num, 070  %or.cond = and i1 %cmp, %cmp1471  br i1 %or.cond, label %for.body, label %if.end72 73for.body:                                         ; preds = %entry, %for.body74  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]75  tail call void (...) @foo() #276  %inc = add nuw i32 %i.05, 177  %exitcond.not = icmp eq i32 %inc, %num78  br i1 %exitcond.not, label %if.end, label %for.body79 80if.end:                                           ; preds = %for.body, %entry81  ret void82}83 84define void @trip_multiple_5(i32 noundef %num) {85; CHECK-LABEL: 'trip_multiple_5'86; CHECK-NEXT:  Classifying expressions for: @trip_multiple_587; CHECK-NEXT:    %rem = urem i32 %num, 588; CHECK-NEXT:    --> ((-5 * (%num /u 5)) + %num) U: full-set S: full-set89; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp1490; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set91; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]92; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-1) S: [0,-1) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }93; CHECK-NEXT:    %inc = add nuw i32 %i.05, 194; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: %num LoopDispositions: { %for.body: Computable }95; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_596; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)97; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -298; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)99; CHECK-NEXT:  Loop %for.body: Trip multiple is 5100;101entry:102  %rem = urem i32 %num, 5103  %cmp = icmp eq i32 %rem, 0104  %cmp14 = icmp ne i32 %num, 0105  %or.cond = and i1 %cmp, %cmp14106  br i1 %or.cond, label %for.body, label %if.end107 108for.body:                                         ; preds = %entry, %for.body109  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]110  tail call void (...) @foo() #2111  %inc = add nuw i32 %i.05, 1112  %exitcond.not = icmp eq i32 %inc, %num113  br i1 %exitcond.not, label %if.end, label %for.body114 115if.end:                                           ; preds = %for.body, %entry116  ret void117}118 119define void @trip_multiple_6(i32 noundef %num) {120; CHECK-LABEL: 'trip_multiple_6'121; CHECK-NEXT:  Classifying expressions for: @trip_multiple_6122; CHECK-NEXT:    %rem = urem i32 %num, 6123; CHECK-NEXT:    --> ((-6 * (%num /u 6)) + %num) U: full-set S: full-set124; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14125; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set126; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]127; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }128; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1129; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }130; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_6131; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)132; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5133; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)134; CHECK-NEXT:  Loop %for.body: Trip multiple is 6135;136entry:137  %rem = urem i32 %num, 6138  %cmp = icmp eq i32 %rem, 0139  %cmp14 = icmp ne i32 %num, 0140  %or.cond = and i1 %cmp, %cmp14141  br i1 %or.cond, label %for.body, label %if.end142 143for.body:                                         ; preds = %entry, %for.body144  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]145  tail call void (...) @foo() #2146  %inc = add nuw i32 %i.05, 1147  %exitcond.not = icmp eq i32 %inc, %num148  br i1 %exitcond.not, label %if.end, label %for.body149 150if.end:                                           ; preds = %for.body, %entry151  ret void152}153 154define void @trip_multiple_7(i32 noundef %num) {155; CHECK-LABEL: 'trip_multiple_7'156; CHECK-NEXT:  Classifying expressions for: @trip_multiple_7157; CHECK-NEXT:    %rem = urem i32 %num, 7158; CHECK-NEXT:    --> ((-7 * (%num /u 7)) + %num) U: full-set S: full-set159; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14160; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set161; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]162; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }163; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1164; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }165; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_7166; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)167; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5168; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)169; CHECK-NEXT:  Loop %for.body: Trip multiple is 7170;171entry:172  %rem = urem i32 %num, 7173  %cmp = icmp eq i32 %rem, 0174  %cmp14 = icmp ne i32 %num, 0175  %or.cond = and i1 %cmp, %cmp14176  br i1 %or.cond, label %for.body, label %if.end177 178for.body:                                         ; preds = %entry, %for.body179  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]180  tail call void (...) @foo() #2181  %inc = add nuw i32 %i.05, 1182  %exitcond.not = icmp eq i32 %inc, %num183  br i1 %exitcond.not, label %if.end, label %for.body184 185if.end:                                           ; preds = %for.body, %entry186  ret void187}188 189define void @trip_multiple_8(i32 noundef %num) {190; CHECK-LABEL: 'trip_multiple_8'191; CHECK-NEXT:  Classifying expressions for: @trip_multiple_8192; CHECK-NEXT:    %rem = urem i32 %num, 8193; CHECK-NEXT:    --> (zext i3 (trunc i32 %num to i3) to i32) U: [0,8) S: [0,8)194; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14195; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set196; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]197; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-8) S: [0,-8) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }198; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1199; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-7) S: [1,-7) Exits: %num LoopDispositions: { %for.body: Computable }200; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_8201; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)202; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -9203; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)204; CHECK-NEXT:  Loop %for.body: Trip multiple is 8205;206entry:207  %rem = urem i32 %num, 8208  %cmp = icmp eq i32 %rem, 0209  %cmp14 = icmp ne i32 %num, 0210  %or.cond = and i1 %cmp, %cmp14211  br i1 %or.cond, label %for.body, label %if.end212 213for.body:                                         ; preds = %entry, %for.body214  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]215  tail call void (...) @foo() #2216  %inc = add nuw i32 %i.05, 1217  %exitcond.not = icmp eq i32 %inc, %num218  br i1 %exitcond.not, label %if.end, label %for.body219 220if.end:                                           ; preds = %for.body, %entry221  ret void222}223define void @trip_multiple_9(i32 noundef %num) {224; CHECK-LABEL: 'trip_multiple_9'225; CHECK-NEXT:  Classifying expressions for: @trip_multiple_9226; CHECK-NEXT:    %rem = urem i32 %num, 9227; CHECK-NEXT:    --> ((-9 * (%num /u 9)) + %num) U: full-set S: full-set228; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14229; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set230; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]231; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }232; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1233; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable }234; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_9235; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)236; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -5237; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)238; CHECK-NEXT:  Loop %for.body: Trip multiple is 9239;240entry:241  %rem = urem i32 %num, 9242  %cmp = icmp eq i32 %rem, 0243  %cmp14 = icmp ne i32 %num, 0244  %or.cond = and i1 %cmp, %cmp14245  br i1 %or.cond, label %for.body, label %if.end246 247for.body:                                         ; preds = %entry, %for.body248  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]249  tail call void (...) @foo() #2250  %inc = add nuw i32 %i.05, 1251  %exitcond.not = icmp eq i32 %inc, %num252  br i1 %exitcond.not, label %if.end, label %for.body253 254if.end:                                           ; preds = %for.body, %entry255  ret void256}257define void @trip_multiple_10(i32 noundef %num) {258; CHECK-LABEL: 'trip_multiple_10'259; CHECK-NEXT:  Classifying expressions for: @trip_multiple_10260; CHECK-NEXT:    %rem = urem i32 %num, 10261; CHECK-NEXT:    --> ((-10 * (%num /u 10)) + %num) U: full-set S: full-set262; CHECK-NEXT:    %or.cond = and i1 %cmp, %cmp14263; CHECK-NEXT:    --> (%cmp14 umin %cmp) U: full-set S: full-set264; CHECK-NEXT:    %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]265; CHECK-NEXT:    --> {0,+,1}<nuw><%for.body> U: [0,-6) S: [0,-6) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable }266; CHECK-NEXT:    %inc = add nuw i32 %i.05, 1267; CHECK-NEXT:    --> {1,+,1}<nuw><%for.body> U: [1,-5) S: [1,-5) Exits: %num LoopDispositions: { %for.body: Computable }268; CHECK-NEXT:  Determining loop execution counts for: @trip_multiple_10269; CHECK-NEXT:  Loop %for.body: backedge-taken count is (-1 + %num)270; CHECK-NEXT:  Loop %for.body: constant max backedge-taken count is i32 -7271; CHECK-NEXT:  Loop %for.body: symbolic max backedge-taken count is (-1 + %num)272; CHECK-NEXT:  Loop %for.body: Trip multiple is 10273;274entry:275  %rem = urem i32 %num, 10276  %cmp = icmp eq i32 %rem, 0277  %cmp14 = icmp ne i32 %num, 0278  %or.cond = and i1 %cmp, %cmp14279  br i1 %or.cond, label %for.body, label %if.end280 281for.body:                                         ; preds = %entry, %for.body282  %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ]283  tail call void (...) @foo() #2284  %inc = add nuw i32 %i.05, 1285  %exitcond.not = icmp eq i32 %inc, %num286  br i1 %exitcond.not, label %if.end, label %for.body287 288if.end:                                           ; preds = %for.body, %entry289  ret void290}291