308 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py2; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s3 4target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"5target triple = "x86_64-unknown-linux-gnu"6 7declare void @non_exit_use(i32 %i) #08 9define void @sle_pre_inc(i32 %len) willreturn {10; CHECK-LABEL: 'sle_pre_inc'11; CHECK-NEXT: Determining loop execution counts for: @sle_pre_inc12; CHECK-NEXT: Loop %for.body: backedge-taken count is (0 smax (1 + %len))13; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 214748364714; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (0 smax (1 + %len))15; CHECK-NEXT: Loop %for.body: Trip multiple is 116;17entry:18 br label %for.body19 20for.body:21 %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]22 call void @non_exit_use(i32 %iv) nounwind willreturn23 %inc = add i32 %iv, 124 %cmp = icmp sle i32 %iv, %len25 br i1 %cmp, label %for.body, label %for.end26 27for.end:28 ret void29}30 31define void @sle_post_inc(i32 %len) willreturn {32; CHECK-LABEL: 'sle_post_inc'33; CHECK-NEXT: Determining loop execution counts for: @sle_post_inc34; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (1 smax (1 + %len)))<nsw>35; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 214748364636; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (1 smax (1 + %len)))<nsw>37; CHECK-NEXT: Loop %for.body: Trip multiple is 138;39entry:40 br label %for.body41 42for.body:43 %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]44 call void @non_exit_use(i32 %iv) nounwind willreturn45 %inc = add i32 %iv, 146 %cmp = icmp sle i32 %inc, %len47 br i1 %cmp, label %for.body, label %for.end48 49for.end:50 ret void51}52 53define void @sle_pre_inc_infinite(i32 %len) {54; CHECK-LABEL: 'sle_pre_inc_infinite'55; CHECK-NEXT: Determining loop execution counts for: @sle_pre_inc_infinite56; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.57; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.58; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.59; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (0 smax (1 + (sext i32 %len to i64))<nsw>)60; CHECK-NEXT: Predicates:61; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nssw>62; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i64 214748364863; CHECK-NEXT: Predicates:64; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nssw>65; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is (0 smax (1 + (sext i32 %len to i64))<nsw>)66; CHECK-NEXT: Predicates:67; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nssw>68;69entry:70 br label %for.body71 72for.body:73 %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]74 call void @non_exit_use(i32 %iv) nounwind willreturn75 %inc = add i32 %iv, 176 %cmp = icmp sle i32 %iv, %len77 br i1 %cmp, label %for.body, label %for.end78 79for.end:80 ret void81}82 83define void @ule_pre_inc(i32 %len) willreturn {84; CHECK-LABEL: 'ule_pre_inc'85; CHECK-NEXT: Determining loop execution counts for: @ule_pre_inc86; CHECK-NEXT: Loop %for.body: backedge-taken count is (1 + %len)87; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -188; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (1 + %len)89; CHECK-NEXT: Loop %for.body: Trip multiple is 190;91entry:92 br label %for.body93 94for.body:95 %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]96 call void @non_exit_use(i32 %iv) nounwind willreturn97 %inc = add i32 %iv, 198 %cmp = icmp ule i32 %iv, %len99 br i1 %cmp, label %for.body, label %for.end100 101for.end:102 ret void103}104 105define void @ule_post_inc(i32 %len) willreturn {106; CHECK-LABEL: 'ule_post_inc'107; CHECK-NEXT: Determining loop execution counts for: @ule_post_inc108; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (1 umax (1 + %len)))109; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2110; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (1 umax (1 + %len)))111; CHECK-NEXT: Loop %for.body: Trip multiple is 1112;113entry:114 br label %for.body115 116for.body:117 %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]118 call void @non_exit_use(i32 %iv) nounwind willreturn119 %inc = add i32 %iv, 1120 %cmp = icmp ule i32 %inc, %len121 br i1 %cmp, label %for.body, label %for.end122 123for.end:124 ret void125}126 127define void @ule_pre_inc_infinite(i32 %len) {128; CHECK-LABEL: 'ule_pre_inc_infinite'129; CHECK-NEXT: Determining loop execution counts for: @ule_pre_inc_infinite130; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.131; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.132; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.133; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (1 + (zext i32 %len to i64))<nuw><nsw>134; CHECK-NEXT: Predicates:135; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nusw>136; CHECK-NEXT: Loop %for.body: Predicated constant max backedge-taken count is i64 4294967296137; CHECK-NEXT: Predicates:138; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nusw>139; CHECK-NEXT: Loop %for.body: Predicated symbolic max backedge-taken count is (1 + (zext i32 %len to i64))<nuw><nsw>140; CHECK-NEXT: Predicates:141; CHECK-NEXT: {0,+,1}<%for.body> Added Flags: <nusw>142;143entry:144 br label %for.body145 146for.body:147 %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ]148 call void @non_exit_use(i32 %iv) nounwind willreturn149 %inc = add i32 %iv, 1150 %cmp = icmp ule i32 %iv, %len151 br i1 %cmp, label %for.body, label %for.end152 153for.end:154 ret void155}156 157define void @sge_pre_inc(i32 %end) willreturn {158; CHECK-LABEL: 'sge_pre_inc'159; CHECK-NEXT: Determining loop execution counts for: @sge_pre_inc160; CHECK-NEXT: Loop %for.body: backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))161; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2147483548162; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))163; CHECK-NEXT: Loop %for.body: Trip multiple is 1164;165entry:166 br label %for.body167 168for.body:169 %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]170 call void @non_exit_use(i32 %iv) nounwind willreturn171 %inc = add i32 %iv, -1172 %cmp = icmp sge i32 %iv, %end173 br i1 %cmp, label %for.body, label %for.end174 175for.end:176 ret void177}178 179define void @sge_post_inc(i32 %end) willreturn {180; CHECK-LABEL: 'sge_post_inc'181; CHECK-NEXT: Determining loop execution counts for: @sge_post_inc182; CHECK-NEXT: Loop %for.body: backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))183; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 -2147483548184; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 smin (-1 + %end))))185; CHECK-NEXT: Loop %for.body: Trip multiple is 1186;187entry:188 br label %for.body189 190for.body:191 %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]192 call void @non_exit_use(i32 %iv) nounwind willreturn193 %inc = add i32 %iv, -1194 %cmp = icmp sge i32 %iv, %end195 br i1 %cmp, label %for.body, label %for.end196 197for.end:198 ret void199}200 201define void @sge_pre_inc_infinite(i32 %end) {202; CHECK-LABEL: 'sge_pre_inc_infinite'203; CHECK-NEXT: Determining loop execution counts for: @sge_pre_inc_infinite204; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.205; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.206; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.207;208entry:209 br label %for.body210 211for.body:212 %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]213 call void @non_exit_use(i32 %iv) nounwind willreturn214 %inc = add i32 %iv, -1215 %cmp = icmp sge i32 %iv, %end216 br i1 %cmp, label %for.body, label %for.end217 218for.end:219 ret void220}221 222define void @use_pre_inc(i32 %end) willreturn {223; CHECK-LABEL: 'use_pre_inc'224; CHECK-NEXT: Determining loop execution counts for: @use_pre_inc225; CHECK-NEXT: Loop %for.body: backedge-taken count is (100 + (-1 * (100 umin (-1 + %end)))<nsw>)<nsw>226; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 100227; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 umin (-1 + %end)))<nsw>)<nsw>228; CHECK-NEXT: Loop %for.body: Trip multiple is 1229;230entry:231 br label %for.body232 233for.body:234 %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]235 call void @non_exit_use(i32 %iv) nounwind willreturn236 %inc = add i32 %iv, -1237 %cmp = icmp uge i32 %iv, %end238 br i1 %cmp, label %for.body, label %for.end239 240for.end:241 ret void242}243 244define void @use_post_inc(i32 %end) willreturn {245; CHECK-LABEL: 'use_post_inc'246; CHECK-NEXT: Determining loop execution counts for: @use_post_inc247; CHECK-NEXT: Loop %for.body: backedge-taken count is (99 + (-1 * (99 umin (-1 + %end)))<nsw>)<nsw>248; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i32 99249; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (99 + (-1 * (99 umin (-1 + %end)))<nsw>)<nsw>250; CHECK-NEXT: Loop %for.body: Trip multiple is 1251;252entry:253 br label %for.body254 255for.body:256 %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]257 call void @non_exit_use(i32 %iv) nounwind willreturn258 %inc = add i32 %iv, -1259 %cmp = icmp uge i32 %inc, %end260 br i1 %cmp, label %for.body, label %for.end261 262for.end:263 ret void264}265 266define void @uge_pre_inc_infinite(i32 %end) {267; CHECK-LABEL: 'uge_pre_inc_infinite'268; CHECK-NEXT: Determining loop execution counts for: @uge_pre_inc_infinite269; CHECK-NEXT: Loop %for.body: Unpredictable backedge-taken count.270; CHECK-NEXT: Loop %for.body: Unpredictable constant max backedge-taken count.271; CHECK-NEXT: Loop %for.body: Unpredictable symbolic max backedge-taken count.272;273entry:274 br label %for.body275 276for.body:277 %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ]278 call void @non_exit_use(i32 %iv) nounwind willreturn279 %inc = add i32 %iv, -1280 %cmp = icmp uge i32 %iv, %end281 br i1 %cmp, label %for.body, label %for.end282 283for.end:284 ret void285}286 287define void @pr54191(i64 %n) mustprogress {288; CHECK-LABEL: 'pr54191'289; CHECK-NEXT: Determining loop execution counts for: @pr54191290; CHECK-NEXT: Loop %loop: backedge-taken count is ((-2 + %n) /u 2)291; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4611686018427387902292; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2 + %n) /u 2)293; CHECK-NEXT: Loop %loop: Trip multiple is 1294;295entry:296 %guard = icmp sgt i64 %n, 1297 br i1 %guard, label %loop, label %exit298 299loop:300 %iv = phi i64 [ 2, %entry ], [ %iv.next, %loop ]301 %iv.next = add nuw nsw i64 %iv, 2302 %cmp = icmp sle i64 %iv.next, %n303 br i1 %cmp, label %loop, label %exit304 305exit:306 ret void307}308