502 lines · plain
1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 42; RUN: opt -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-classify-expressions=0 < %s 2>&1 | FileCheck %s3 4define void @ule_from_zero(i32 %M, i32 %N) {5; CHECK-LABEL: 'ule_from_zero'6; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero7; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)8; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>9; CHECK-NEXT: exit count for latch: %N10; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 429496729511; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)12; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>13; CHECK-NEXT: symbolic max exit count for latch: %N14; CHECK-NEXT: Loop %loop: Trip multiple is 115;16entry:17 br label %loop18 19loop:20 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]21 %cmp1 = icmp ule i32 %iv, %M22 br i1 %cmp1, label %latch, label %exit23 24latch:25 %iv.next = add nuw i32 %iv, 126 %exitcond.not = icmp eq i32 %iv, %N27 br i1 %exitcond.not, label %exit, label %loop28 29exit:30 ret void31}32 33define void @le_from_zero(i32 %M, i32 %N) {34; CHECK-LABEL: 'le_from_zero'35; CHECK-NEXT: Determining loop execution counts for: @le_from_zero36; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)37; CHECK-NEXT: exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>38; CHECK-NEXT: exit count for latch: %N39; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 429496729540; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)41; CHECK-NEXT: symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>42; CHECK-NEXT: symbolic max exit count for latch: %N43; CHECK-NEXT: Loop %loop: Trip multiple is 144;45entry:46 br label %loop47 48loop:49 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]50 %cmp1 = icmp samesign ule i32 %iv, %M51 br i1 %cmp1, label %latch, label %exit52 53latch:54 %iv.next = add nuw i32 %iv, 155 %exitcond.not = icmp eq i32 %iv, %N56 br i1 %exitcond.not, label %exit, label %loop57 58exit:59 ret void60}61 62define void @ule_from_one(i32 %M, i32 %N) {63; CHECK-LABEL: 'ule_from_one'64; CHECK-NEXT: Determining loop execution counts for: @ule_from_one65; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))66; CHECK-NEXT: exit count for loop: %M67; CHECK-NEXT: exit count for latch: (-1 + %N)68; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -169; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))70; CHECK-NEXT: symbolic max exit count for loop: %M71; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N)72; CHECK-NEXT: Loop %loop: Trip multiple is 173;74entry:75 br label %loop76 77loop:78 %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]79 %cmp1 = icmp ule i32 %iv, %M80 br i1 %cmp1, label %latch, label %exit81 82latch:83 %iv.next = add nuw i32 %iv, 184 %exitcond.not = icmp eq i32 %iv, %N85 br i1 %exitcond.not, label %exit, label %loop86 87exit:88 ret void89}90 91define void @le_from_one(i32 %M, i32 %N) {92; CHECK-LABEL: 'le_from_one'93; CHECK-NEXT: Determining loop execution counts for: @le_from_one94; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (%M umin_seq (-1 + %N))95; CHECK-NEXT: exit count for loop: %M96; CHECK-NEXT: exit count for latch: (-1 + %N)97; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -198; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (%M umin_seq (-1 + %N))99; CHECK-NEXT: symbolic max exit count for loop: %M100; CHECK-NEXT: symbolic max exit count for latch: (-1 + %N)101; CHECK-NEXT: Loop %loop: Trip multiple is 1102;103entry:104 br label %loop105 106loop:107 %iv = phi i32 [ 1, %entry ], [ %iv.next, %latch ]108 %cmp1 = icmp samesign ule i32 %iv, %M109 br i1 %cmp1, label %latch, label %exit110 111latch:112 %iv.next = add nuw i32 %iv, 1113 %exitcond.not = icmp eq i32 %iv, %N114 br i1 %exitcond.not, label %exit, label %loop115 116exit:117 ret void118}119 120define void @ule_from_unknown(i32 %M, i32 %N, i32 %S) {121; CHECK-LABEL: 'ule_from_unknown'122; CHECK-NEXT: Determining loop execution counts for: @ule_from_unknown123; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))124; CHECK-NEXT: exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>))125; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N)126; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295127; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))128; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>))129; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N)130; CHECK-NEXT: Loop %loop: Trip multiple is 1131;132entry:133 br label %loop134 135loop:136 %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]137 %cmp1 = icmp ule i32 %iv, %M138 br i1 %cmp1, label %latch, label %exit139 140latch:141 %iv.next = add nuw i32 %iv, 1142 %exitcond.not = icmp eq i32 %iv, %N143 br i1 %exitcond.not, label %exit, label %loop144 145exit:146 ret void147}148 149define void @ule_from_zero_no_nuw(i32 %M, i32 %N) {150; CHECK-LABEL: 'ule_from_zero_no_nuw'151; CHECK-NEXT: Determining loop execution counts for: @ule_from_zero_no_nuw152; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.153; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***154; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>155; CHECK-NEXT: Predicates:156; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>157; CHECK-EMPTY:158; CHECK-NEXT: exit count for latch: %N159; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1160; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N161; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***162; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>163; CHECK-NEXT: Predicates:164; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>165; CHECK-EMPTY:166; CHECK-NEXT: symbolic max exit count for latch: %N167; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)168; CHECK-NEXT: Predicates:169; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>170; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295171; CHECK-NEXT: Predicates:172; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>173; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)174; CHECK-NEXT: Predicates:175; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>176;177entry:178 br label %loop179 180loop:181 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]182 %cmp1 = icmp ule i32 %iv, %M183 br i1 %cmp1, label %latch, label %exit184 185latch:186 %iv.next = add i32 %iv, 1187 %exitcond.not = icmp eq i32 %iv, %N188 br i1 %exitcond.not, label %exit, label %loop189 190exit:191 ret void192}193 194define void @le_from_zero_no_nuw(i32 %M, i32 %N) {195; CHECK-LABEL: 'le_from_zero_no_nuw'196; CHECK-NEXT: Determining loop execution counts for: @le_from_zero_no_nuw197; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.198; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***199; CHECK-NEXT: predicated exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>200; CHECK-NEXT: Predicates:201; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>202; CHECK-EMPTY:203; CHECK-NEXT: exit count for latch: %N204; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1205; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is %N206; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***207; CHECK-NEXT: predicated symbolic max exit count for loop: (1 + (zext i32 %M to i64))<nuw><nsw>208; CHECK-NEXT: Predicates:209; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>210; CHECK-EMPTY:211; CHECK-NEXT: symbolic max exit count for latch: %N212; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)213; CHECK-NEXT: Predicates:214; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>215; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295216; CHECK-NEXT: Predicates:217; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>218; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 %N to i64) umin (1 + (zext i32 %M to i64))<nuw><nsw>)219; CHECK-NEXT: Predicates:220; CHECK-NEXT: {0,+,1}<%loop> Added Flags: <nusw>221;222entry:223 br label %loop224 225loop:226 %iv = phi i32 [ 0, %entry ], [ %iv.next, %latch ]227 %cmp1 = icmp samesign ule i32 %iv, %M228 br i1 %cmp1, label %latch, label %exit229 230latch:231 %iv.next = add i32 %iv, 1232 %exitcond.not = icmp eq i32 %iv, %N233 br i1 %exitcond.not, label %exit, label %loop234 235exit:236 ret void237}238 239define void @sle_from_int_min(i32 %M, i32 %N) {240; CHECK-LABEL: 'sle_from_int_min'241; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min242; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)243; CHECK-NEXT: exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>244; CHECK-NEXT: exit count for latch: (-2147483648 + %N)245; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295246; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)247; CHECK-NEXT: symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>248; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)249; CHECK-NEXT: Loop %loop: Trip multiple is 1250;251entry:252 br label %loop253 254loop:255 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]256 %cmp1 = icmp sle i32 %iv, %M257 br i1 %cmp1, label %latch, label %exit258 259latch:260 %iv.next = add nsw i32 %iv, 1261 %exitcond.not = icmp eq i32 %iv, %N262 br i1 %exitcond.not, label %exit, label %loop263 264exit:265 ret void266}267 268define void @le_from_int_min(i32 %M, i32 %N) {269; CHECK-LABEL: 'le_from_int_min'270; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min271; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N))272; CHECK-NEXT: exit count for loop: (-2147483647 + (2147483647 umax %M))273; CHECK-NEXT: exit count for latch: (-2147483648 + %N)274; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -2147483648275; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483647 + (2147483647 umax %M)) umin_seq (-2147483648 + %N))276; CHECK-NEXT: symbolic max exit count for loop: (-2147483647 + (2147483647 umax %M))277; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)278; CHECK-NEXT: Loop %loop: Trip multiple is 1279;280entry:281 br label %loop282 283loop:284 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]285 %cmp1 = icmp samesign ule i32 %iv, %M286 br i1 %cmp1, label %latch, label %exit287 288latch:289 %iv.next = add nuw nsw i32 %iv, 1290 %exitcond.not = icmp eq i32 %iv, %N291 br i1 %exitcond.not, label %exit, label %loop292 293exit:294 ret void295}296 297define void @sle_from_int_min_plus_one(i32 %M, i32 %N) {298; CHECK-LABEL: 'sle_from_int_min_plus_one'299; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_plus_one300; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))301; CHECK-NEXT: exit count for loop: (-2147483648 + %M)302; CHECK-NEXT: exit count for latch: (2147483647 + %N)303; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1304; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + %M) umin_seq (2147483647 + %N))305; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + %M)306; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N)307; CHECK-NEXT: Loop %loop: Trip multiple is 1308;309entry:310 br label %loop311 312loop:313 %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]314 %cmp1 = icmp sle i32 %iv, %M315 br i1 %cmp1, label %latch, label %exit316 317latch:318 %iv.next = add nsw i32 %iv, 1319 %exitcond.not = icmp eq i32 %iv, %N320 br i1 %exitcond.not, label %exit, label %loop321 322exit:323 ret void324}325 326define void @le_from_int_min_plus_one(i32 %M, i32 %N) {327; CHECK-LABEL: 'le_from_int_min_plus_one'328; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_plus_one329; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N))330; CHECK-NEXT: exit count for loop: (-2147483648 + (-2147483648 umax %M))331; CHECK-NEXT: exit count for latch: (2147483647 + %N)332; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483647333; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2147483648 + (-2147483648 umax %M)) umin_seq (2147483647 + %N))334; CHECK-NEXT: symbolic max exit count for loop: (-2147483648 + (-2147483648 umax %M))335; CHECK-NEXT: symbolic max exit count for latch: (2147483647 + %N)336; CHECK-NEXT: Loop %loop: Trip multiple is 1337;338entry:339 br label %loop340 341loop:342 %iv = phi i32 [ u0x80000001, %entry ], [ %iv.next, %latch ]343 %cmp1 = icmp samesign ule i32 %iv, %M344 br i1 %cmp1, label %latch, label %exit345 346latch:347 %iv.next = add nuw nsw i32 %iv, 1348 %exitcond.not = icmp eq i32 %iv, %N349 br i1 %exitcond.not, label %exit, label %loop350 351exit:352 ret void353}354 355define void @sle_from_unknown(i32 %M, i32 %N, i32 %S) {356; CHECK-LABEL: 'sle_from_unknown'357; CHECK-NEXT: Determining loop execution counts for: @sle_from_unknown358; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))359; CHECK-NEXT: exit count for loop: ((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>))360; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N)361; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295362; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))363; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (sext i32 %S to i64))<nsw> + ((sext i32 %S to i64) smax (1 + (sext i32 %M to i64))<nsw>))364; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N)365; CHECK-NEXT: Loop %loop: Trip multiple is 1366;367entry:368 br label %loop369 370loop:371 %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]372 %cmp1 = icmp sle i32 %iv, %M373 br i1 %cmp1, label %latch, label %exit374 375latch:376 %iv.next = add nsw i32 %iv, 1377 %exitcond.not = icmp eq i32 %iv, %N378 br i1 %exitcond.not, label %exit, label %loop379 380exit:381 ret void382}383 384define void @le_from_unknown(i32 %M, i32 %N, i32 %S) {385; CHECK-LABEL: 'le_from_unknown'386; CHECK-NEXT: Determining loop execution counts for: @le_from_unknown387; CHECK-NEXT: Loop %loop: <multiple exits> backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))388; CHECK-NEXT: exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>))389; CHECK-NEXT: exit count for latch: ((-1 * %S) + %N)390; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 4294967295391; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>)) umin_seq (zext i32 ((-1 * %S) + %N) to i64))392; CHECK-NEXT: symbolic max exit count for loop: ((-1 * (zext i32 %S to i64))<nsw> + ((zext i32 %S to i64) umax (1 + (zext i32 %M to i64))<nuw><nsw>))393; CHECK-NEXT: symbolic max exit count for latch: ((-1 * %S) + %N)394; CHECK-NEXT: Loop %loop: Trip multiple is 1395;396entry:397 br label %loop398 399loop:400 %iv = phi i32 [ %S, %entry ], [ %iv.next, %latch ]401 %cmp1 = icmp samesign ule i32 %iv, %M402 br i1 %cmp1, label %latch, label %exit403 404latch:405 %iv.next = add nuw nsw i32 %iv, 1406 %exitcond.not = icmp eq i32 %iv, %N407 br i1 %exitcond.not, label %exit, label %loop408 409exit:410 ret void411}412 413define void @sle_from_int_min_no_nsw(i32 %M, i32 %N) {414; CHECK-LABEL: 'sle_from_int_min_no_nsw'415; CHECK-NEXT: Determining loop execution counts for: @sle_from_int_min_no_nsw416; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.417; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***418; CHECK-NEXT: predicated exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>419; CHECK-NEXT: Predicates:420; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw>421; CHECK-EMPTY:422; CHECK-NEXT: exit count for latch: (-2147483648 + %N)423; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1424; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)425; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***426; CHECK-NEXT: predicated symbolic max exit count for loop: (2147483649 + (sext i32 %M to i64))<nsw>427; CHECK-NEXT: Predicates:428; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw>429; CHECK-EMPTY:430; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)431; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)432; CHECK-NEXT: Predicates:433; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw>434; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 4294967295435; CHECK-NEXT: Predicates:436; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw>437; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((zext i32 (-2147483648 + %N) to i64) umin (2147483649 + (sext i32 %M to i64))<nsw>)438; CHECK-NEXT: Predicates:439; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nssw>440;441entry:442 br label %loop443 444loop:445 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]446 %cmp1 = icmp sle i32 %iv, %M447 br i1 %cmp1, label %latch, label %exit448 449latch:450 %iv.next = add i32 %iv, 1451 %exitcond.not = icmp eq i32 %iv, %N452 br i1 %exitcond.not, label %exit, label %loop453 454exit:455 ret void456}457 458define void @le_from_int_min_no_nuw_nsw(i32 %M, i32 %N) {459; CHECK-LABEL: 'le_from_int_min_no_nuw_nsw'460; CHECK-NEXT: Determining loop execution counts for: @le_from_int_min_no_nuw_nsw461; CHECK-NEXT: Loop %loop: <multiple exits> Unpredictable backedge-taken count.462; CHECK-NEXT: exit count for loop: ***COULDNOTCOMPUTE***463; CHECK-NEXT: predicated exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw>464; CHECK-NEXT: Predicates:465; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>466; CHECK-EMPTY:467; CHECK-NEXT: exit count for latch: (-2147483648 + %N)468; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1469; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-2147483648 + %N)470; CHECK-NEXT: symbolic max exit count for loop: ***COULDNOTCOMPUTE***471; CHECK-NEXT: predicated symbolic max exit count for loop: (-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw>472; CHECK-NEXT: Predicates:473; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>474; CHECK-EMPTY:475; CHECK-NEXT: symbolic max exit count for latch: (-2147483648 + %N)476; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> umin_seq (zext i32 (-2147483648 + %N) to i64))477; CHECK-NEXT: Predicates:478; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>479; CHECK-NEXT: Loop %loop: Predicated constant max backedge-taken count is i64 2147483648480; CHECK-NEXT: Predicates:481; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>482; CHECK-NEXT: Loop %loop: Predicated symbolic max backedge-taken count is ((-2147483648 + (2147483648 umax (1 + (zext i32 %M to i64))<nuw><nsw>))<nsw> umin_seq (zext i32 (-2147483648 + %N) to i64))483; CHECK-NEXT: Predicates:484; CHECK-NEXT: {-2147483648,+,1}<%loop> Added Flags: <nusw>485;486entry:487 br label %loop488 489loop:490 %iv = phi i32 [ u0x80000000, %entry ], [ %iv.next, %latch ]491 %cmp1 = icmp samesign ule i32 %iv, %M492 br i1 %cmp1, label %latch, label %exit493 494latch:495 %iv.next = add i32 %iv, 1496 %exitcond.not = icmp eq i32 %iv, %N497 br i1 %exitcond.not, label %exit, label %loop498 499exit:500 ret void501}502