1; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 2 2; RUN: opt -passes='print<scalar-evolution>' -disable-output %s 2>&1 | FileCheck %s 3 4define void @loop_guard_improves_exact_backedge_taken_count_1(i32 %conv) { 5; CHECK-LABEL: 'loop_guard_improves_exact_backedge_taken_count_1' 6; CHECK-NEXT: Classifying expressions for: @loop_guard_improves_exact_backedge_taken_count_1 7; CHECK-NEXT: %and = and i32 %conv, 1 8; CHECK-NEXT: --> (zext i1 (trunc i32 %conv to i1) to i32) U: [0,2) S: [0,2) 9; CHECK-NEXT: %conv8 = zext i32 %and to i64 10; CHECK-NEXT: --> (zext i1 (trunc i32 %conv to i1) to i64) U: [0,2) S: [0,2) 11; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 12; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,1) S: [0,1) Exits: 0 LoopDispositions: { %loop: Computable } 13; CHECK-NEXT: %iv.next = add i64 %iv, 1 14; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,2) S: [1,2) Exits: 1 LoopDispositions: { %loop: Computable } 15; CHECK-NEXT: Determining loop execution counts for: @loop_guard_improves_exact_backedge_taken_count_1 16; CHECK-NEXT: Loop %loop: backedge-taken count is i64 0 17; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 0 18; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i64 0 19; CHECK-NEXT: Loop %loop: Trip multiple is 1 20; 21entry: 22 %and = and i32 %conv, 1 23 %conv8 = zext i32 %and to i64 24 %c = icmp ugt i32 %and, 0 25 br i1 %c, label %exit, label %loop 26 27loop: 28 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 29 call void @clobber() 30 %iv.next = add i64 %iv, 1 31 %exitcond = icmp eq i64 %iv, %conv8 32 br i1 %exitcond, label %exit, label %loop 33 34exit: 35 ret void 36} 37 38define void @loop_guard_improves_exact_backedge_taken_count_2(i32 %conv) { 39; CHECK-LABEL: 'loop_guard_improves_exact_backedge_taken_count_2' 40; CHECK-NEXT: Classifying expressions for: @loop_guard_improves_exact_backedge_taken_count_2 41; CHECK-NEXT: %and = and i32 %conv, 1 42; CHECK-NEXT: --> (zext i1 (trunc i32 %conv to i1) to i32) U: [0,2) S: [0,2) 43; CHECK-NEXT: %conv8 = zext i32 %and to i64 44; CHECK-NEXT: --> (zext i1 (trunc i32 %conv to i1) to i64) U: [0,2) S: [0,2) 45; CHECK-NEXT: %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 46; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%loop> U: [0,2) S: [0,2) Exits: (zext i1 (trunc i32 %conv to i1) to i64) LoopDispositions: { %loop: Computable } 47; CHECK-NEXT: %iv.next = add i64 %iv, 1 48; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%loop> U: [1,3) S: [1,3) Exits: (1 + (zext i1 (trunc i32 %conv to i1) to i64))<nuw><nsw> LoopDispositions: { %loop: Computable } 49; CHECK-NEXT: Determining loop execution counts for: @loop_guard_improves_exact_backedge_taken_count_2 50; CHECK-NEXT: Loop %loop: backedge-taken count is (zext i1 (trunc i32 %conv to i1) to i64) 51; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i64 1 52; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (zext i1 (trunc i32 %conv to i1) to i64) 53; CHECK-NEXT: Loop %loop: Trip multiple is 2 54; 55entry: 56 %and = and i32 %conv, 1 57 %conv8 = zext i32 %and to i64 58 %c = icmp eq i32 %and, 1 59 br i1 %c, label %loop, label %exit 60 61loop: 62 %iv = phi i64 [ 0, %entry ], [ %iv.next, %loop ] 63 call void @clobber() 64 %iv.next = add i64 %iv, 1 65 %exitcond = icmp eq i64 %iv, %conv8 66 br i1 %exitcond, label %exit, label %loop 67 68exit: 69 ret void 70} 71 72declare void @use(i32) 73 74define void @rewrite_preserve_add_nsw(i32 %a) { 75; CHECK-LABEL: 'rewrite_preserve_add_nsw' 76; CHECK-NEXT: Classifying expressions for: @rewrite_preserve_add_nsw 77; CHECK-NEXT: %add = add nsw i32 %a, 4 78; CHECK-NEXT: --> (4 + %a)<nsw> U: [-2147483644,-2147483648) S: [-2147483644,-2147483648) 79; CHECK-NEXT: %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 80; CHECK-NEXT: --> {0,+,1}<nuw><%loop> U: [0,-2147483648) S: [0,-2147483648) Exits: (4 + %a)<nsw> LoopDispositions: { %loop: Computable } 81; CHECK-NEXT: %iv.next = add i32 %iv, 1 82; CHECK-NEXT: --> {1,+,1}<nuw><%loop> U: [1,-2147483647) S: [1,-2147483647) Exits: (5 + %a) LoopDispositions: { %loop: Computable } 83; CHECK-NEXT: Determining loop execution counts for: @rewrite_preserve_add_nsw 84; CHECK-NEXT: Loop %loop: backedge-taken count is (4 + %a)<nsw> 85; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 2147483647 86; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (4 + %a)<nsw> 87; CHECK-NEXT: Loop %loop: Trip multiple is 1 88; 89entry: 90 %add = add nsw i32 %a, 4 91 call void @use(i32 noundef %add) 92 %pre = icmp sgt i32 %a, -4 93 br i1 %pre, label %loop, label %exit 94 95loop: 96 %iv = phi i32 [ 0, %entry ], [ %iv.next, %loop ] 97 call void @clobber() 98 %iv.next = add i32 %iv, 1 99 %ec = icmp slt i32 %iv, %add 100 br i1 %ec, label %loop, label %exit 101 102exit: 103 ret void 104} 105 106declare void @clobber() 107