1da36d1f0SJoshua Cao; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py 29c1d5e4aSJoshua Cao; RUN: opt -passes='print<scalar-evolution>,verify<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s 3da36d1f0SJoshua Cao 4da36d1f0SJoshua Cao; Test trip multiples with functions that look like: 5da36d1f0SJoshua Cao 6da36d1f0SJoshua Cao; void foo(); 7da36d1f0SJoshua Cao; void square(unsigned num) { 8da36d1f0SJoshua Cao; if (num % 5 == 0) 9da36d1f0SJoshua Cao; for (unsigned i = 0; i < num; ++i) 10da36d1f0SJoshua Cao; foo(); 11da36d1f0SJoshua Cao; } 12da36d1f0SJoshua Cao 13da36d1f0SJoshua Caodeclare void @foo(...) 14da36d1f0SJoshua Cao 15da36d1f0SJoshua Caodefine void @trip_multiple_3(i32 noundef %num) { 16da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_3' 17da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_3 18da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 3 19da36d1f0SJoshua Cao; CHECK-NEXT: --> ((-3 * (%num /u 3)) + %num) U: full-set S: full-set 20da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 21da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 22da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 23da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-1) S: [0,-1) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 24da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 25da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: %num LoopDispositions: { %for.body: Computable } 26da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_3 27da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 28*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2 29da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 3088f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 3 31da36d1f0SJoshua Cao; 32da36d1f0SJoshua Caoentry: 33da36d1f0SJoshua Cao %rem = urem i32 %num, 3 34da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 35da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 36da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 37da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 38da36d1f0SJoshua Cao 39da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 40da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 41da36d1f0SJoshua Cao tail call void (...) @foo() #2 42da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 43da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 44da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 45da36d1f0SJoshua Cao 46da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 47da36d1f0SJoshua Cao ret void 48da36d1f0SJoshua Cao} 49da36d1f0SJoshua Caodefine void @trip_multiple_4(i32 noundef %num) { 50da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_4' 51da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_4 52da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 4 53da36d1f0SJoshua Cao; CHECK-NEXT: --> (zext i2 (trunc i32 %num to i2) to i32) U: [0,4) S: [0,4) 54da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 55da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 56da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 57da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 58da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 59da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable } 60da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_4 61da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 62*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -5 63da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 6488f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 4 65da36d1f0SJoshua Cao; 66da36d1f0SJoshua Caoentry: 67da36d1f0SJoshua Cao %rem = urem i32 %num, 4 68da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 69da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 70da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 71da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 72da36d1f0SJoshua Cao 73da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 74da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 75da36d1f0SJoshua Cao tail call void (...) @foo() #2 76da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 77da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 78da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 79da36d1f0SJoshua Cao 80da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 81da36d1f0SJoshua Cao ret void 82da36d1f0SJoshua Cao} 83da36d1f0SJoshua Cao 84da36d1f0SJoshua Caodefine void @trip_multiple_5(i32 noundef %num) { 85da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_5' 86da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_5 87da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 5 88da36d1f0SJoshua Cao; CHECK-NEXT: --> ((-5 * (%num /u 5)) + %num) U: full-set S: full-set 89da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 90da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 91da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 92da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-1) S: [0,-1) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 93da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 94da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: %num LoopDispositions: { %for.body: Computable } 95da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_5 96da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 97*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2 98da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 9988f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 5 100da36d1f0SJoshua Cao; 101da36d1f0SJoshua Caoentry: 102da36d1f0SJoshua Cao %rem = urem i32 %num, 5 103da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 104da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 105da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 106da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 107da36d1f0SJoshua Cao 108da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 109da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 110da36d1f0SJoshua Cao tail call void (...) @foo() #2 111da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 112da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 113da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 114da36d1f0SJoshua Cao 115da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 116da36d1f0SJoshua Cao ret void 117da36d1f0SJoshua Cao} 118da36d1f0SJoshua Cao 119da36d1f0SJoshua Caodefine void @trip_multiple_6(i32 noundef %num) { 120da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_6' 121da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_6 122da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 6 123da36d1f0SJoshua Cao; CHECK-NEXT: --> ((-6 * (%num /u 6)) + %num) U: full-set S: full-set 124da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 125da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 126da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 127da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 128da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 129da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable } 130da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_6 131da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 132*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -5 133da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 13488f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 6 135da36d1f0SJoshua Cao; 136da36d1f0SJoshua Caoentry: 137da36d1f0SJoshua Cao %rem = urem i32 %num, 6 138da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 139da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 140da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 141da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 142da36d1f0SJoshua Cao 143da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 144da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 145da36d1f0SJoshua Cao tail call void (...) @foo() #2 146da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 147da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 148da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 149da36d1f0SJoshua Cao 150da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 151da36d1f0SJoshua Cao ret void 152da36d1f0SJoshua Cao} 153da36d1f0SJoshua Cao 154da36d1f0SJoshua Caodefine void @trip_multiple_7(i32 noundef %num) { 155da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_7' 156da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_7 157da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 7 158da36d1f0SJoshua Cao; CHECK-NEXT: --> ((-7 * (%num /u 7)) + %num) U: full-set S: full-set 159da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 160da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 161da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 162da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 163da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 164da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable } 165da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_7 166da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 167*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -5 168da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 16988f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 7 170da36d1f0SJoshua Cao; 171da36d1f0SJoshua Caoentry: 172da36d1f0SJoshua Cao %rem = urem i32 %num, 7 173da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 174da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 175da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 176da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 177da36d1f0SJoshua Cao 178da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 179da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 180da36d1f0SJoshua Cao tail call void (...) @foo() #2 181da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 182da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 183da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 184da36d1f0SJoshua Cao 185da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 186da36d1f0SJoshua Cao ret void 187da36d1f0SJoshua Cao} 188da36d1f0SJoshua Cao 189da36d1f0SJoshua Caodefine void @trip_multiple_8(i32 noundef %num) { 190da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_8' 191da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_8 192da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 8 193da36d1f0SJoshua Cao; CHECK-NEXT: --> (zext i3 (trunc i32 %num to i3) to i32) U: [0,8) S: [0,8) 194da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 195da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 196da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 197da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-8) S: [0,-8) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 198da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 199da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-7) S: [1,-7) Exits: %num LoopDispositions: { %for.body: Computable } 200da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_8 201da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 202*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -9 203da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 20488f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 8 205da36d1f0SJoshua Cao; 206da36d1f0SJoshua Caoentry: 207da36d1f0SJoshua Cao %rem = urem i32 %num, 8 208da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 209da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 210da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 211da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 212da36d1f0SJoshua Cao 213da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 214da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 215da36d1f0SJoshua Cao tail call void (...) @foo() #2 216da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 217da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 218da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 219da36d1f0SJoshua Cao 220da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 221da36d1f0SJoshua Cao ret void 222da36d1f0SJoshua Cao} 223da36d1f0SJoshua Caodefine void @trip_multiple_9(i32 noundef %num) { 224da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_9' 225da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_9 226da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 9 227da36d1f0SJoshua Cao; CHECK-NEXT: --> ((-9 * (%num /u 9)) + %num) U: full-set S: full-set 228da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 229da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 230da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 231da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-4) S: [0,-4) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 232da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 233da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-3) S: [1,-3) Exits: %num LoopDispositions: { %for.body: Computable } 234da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_9 235da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 236*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -5 237da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 23888f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 9 239da36d1f0SJoshua Cao; 240da36d1f0SJoshua Caoentry: 241da36d1f0SJoshua Cao %rem = urem i32 %num, 9 242da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 243da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 244da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 245da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 246da36d1f0SJoshua Cao 247da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 248da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 249da36d1f0SJoshua Cao tail call void (...) @foo() #2 250da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 251da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 252da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 253da36d1f0SJoshua Cao 254da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 255da36d1f0SJoshua Cao ret void 256da36d1f0SJoshua Cao} 257da36d1f0SJoshua Caodefine void @trip_multiple_10(i32 noundef %num) { 258da36d1f0SJoshua Cao; CHECK-LABEL: 'trip_multiple_10' 259da36d1f0SJoshua Cao; CHECK-NEXT: Classifying expressions for: @trip_multiple_10 260da36d1f0SJoshua Cao; CHECK-NEXT: %rem = urem i32 %num, 10 261da36d1f0SJoshua Cao; CHECK-NEXT: --> ((-10 * (%num /u 10)) + %num) U: full-set S: full-set 262da36d1f0SJoshua Cao; CHECK-NEXT: %or.cond = and i1 %cmp, %cmp14 263da36d1f0SJoshua Cao; CHECK-NEXT: --> (%cmp14 umin %cmp) U: full-set S: full-set 264da36d1f0SJoshua Cao; CHECK-NEXT: %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 265da36d1f0SJoshua Cao; CHECK-NEXT: --> {0,+,1}<nuw><%for.body> U: [0,-6) S: [0,-6) Exits: (-1 + %num) LoopDispositions: { %for.body: Computable } 266da36d1f0SJoshua Cao; CHECK-NEXT: %inc = add nuw i32 %i.05, 1 267da36d1f0SJoshua Cao; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-5) S: [1,-5) Exits: %num LoopDispositions: { %for.body: Computable } 268da36d1f0SJoshua Cao; CHECK-NEXT: Determining loop execution counts for: @trip_multiple_10 269da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + %num) 270*7755c261SPhilip Reames; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -7 271da36d1f0SJoshua Cao; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + %num) 27288f7dc17SNikita Popov; CHECK-NEXT: Loop %for.body: Trip multiple is 10 273da36d1f0SJoshua Cao; 274da36d1f0SJoshua Caoentry: 275da36d1f0SJoshua Cao %rem = urem i32 %num, 10 276da36d1f0SJoshua Cao %cmp = icmp eq i32 %rem, 0 277da36d1f0SJoshua Cao %cmp14 = icmp ne i32 %num, 0 278da36d1f0SJoshua Cao %or.cond = and i1 %cmp, %cmp14 279da36d1f0SJoshua Cao br i1 %or.cond, label %for.body, label %if.end 280da36d1f0SJoshua Cao 281da36d1f0SJoshua Caofor.body: ; preds = %entry, %for.body 282da36d1f0SJoshua Cao %i.05 = phi i32 [ %inc, %for.body ], [ 0, %entry ] 283da36d1f0SJoshua Cao tail call void (...) @foo() #2 284da36d1f0SJoshua Cao %inc = add nuw i32 %i.05, 1 285da36d1f0SJoshua Cao %exitcond.not = icmp eq i32 %inc, %num 286da36d1f0SJoshua Cao br i1 %exitcond.not, label %if.end, label %for.body 287da36d1f0SJoshua Cao 288da36d1f0SJoshua Caoif.end: ; preds = %for.body, %entry 289da36d1f0SJoshua Cao ret void 290da36d1f0SJoshua Cao} 291