1 2 3 4 5 6 7 8 9 10 11 12 13 14 15 16 17 18 19 20 21 22 23 24 25 26 27 28 29 30 31 32 33 34 35 36 37 38 39 40 41 42 43 44 45 46 47 48 49 50 51 52 53 54 55 56 57 58 59 60 61 62 63 64 65 66 67 68 69 70 71 72 73 74 75 76 77 78 79 80 81 82 83 84 85 86 87 88 89 90 91 92 93 94 95 96 97 98 99 100 101 102 103 104 105 106 107 108 109 110 111 112 113 114 115 116 117 118 119 120 121 122 123 124 125 126 127 128 129 130 131 132 133 134 135 136 137 138 139 140 141 142 143 144 145 146 147 148 149 150 151 152
|
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py UTC_ARGS: --version 2
; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" 2>&1 | FileCheck %s
; Tests loops with huge trip counts. Trip count of >=2^32 are huge. Huge trip counts have a trip multiple
; of the greatest power of 2 less than 2^32.
declare void @foo(...)
define void @trip_count_4294967295() {
; CHECK-LABEL: 'trip_count_4294967295'
; CHECK-NEXT: Classifying expressions for: @trip_count_4294967295
; CHECK-NEXT: %i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,4294967295) S: [0,4294967295) Exits: 4294967294 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: %add = add nuw nsw i64 %i.02, 1
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,4294967296) S: [1,4294967296) Exits: 4294967295 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: Determining loop execution counts for: @trip_count_4294967295
; CHECK-NEXT: Loop %for.body: backedge-taken count is 4294967294
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 4294967294
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is 4294967294
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is 4294967294
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 4294967295
;
entry:
br label %for.body
for.cond.cleanup: ; preds = %for.body
ret void
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
tail call void (...) @foo() #2
%add = add nuw nsw i64 %i.02, 1
%exitcond.not = icmp eq i64 %add, 4294967295
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}
define void @trip_count_4294967296() {
; CHECK-LABEL: 'trip_count_4294967296'
; CHECK-NEXT: Classifying expressions for: @trip_count_4294967296
; CHECK-NEXT: %i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,4294967296) S: [0,4294967296) Exits: 4294967295 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: %add = add nuw nsw i64 %i.02, 1
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,4294967297) S: [1,4294967297) Exits: 4294967296 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: Determining loop execution counts for: @trip_count_4294967296
; CHECK-NEXT: Loop %for.body: backedge-taken count is 4294967295
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is 4294967295
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is 4294967295
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 2147483648
;
entry:
br label %for.body
for.cond.cleanup: ; preds = %for.body
ret void
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
tail call void (...) @foo() #2
%add = add nuw nsw i64 %i.02, 1
%exitcond.not = icmp eq i64 %add, 4294967296
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}
define void @trip_count_8589935692() {
; CHECK-LABEL: 'trip_count_8589935692'
; CHECK-NEXT: Classifying expressions for: @trip_count_8589935692
; CHECK-NEXT: %i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,8589934592) S: [0,8589934592) Exits: 8589934591 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: %add = add nuw nsw i64 %i.02, 1
; CHECK-NEXT: --> {1,+,1}<nuw><nsw><%for.body> U: [1,8589934593) S: [1,8589934593) Exits: 8589934592 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: Determining loop execution counts for: @trip_count_8589935692
; CHECK-NEXT: Loop %for.body: backedge-taken count is 8589934591
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 8589934591
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is 8589934591
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is 8589934591
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 2147483648
;
entry:
br label %for.body
for.cond.cleanup: ; preds = %for.body
ret void
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
tail call void (...) @foo() #2
%add = add nuw nsw i64 %i.02, 1
%exitcond.not = icmp eq i64 %add, 8589934592
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}
define void @trip_count_9223372036854775808() {
; CHECK-LABEL: 'trip_count_9223372036854775808'
; CHECK-NEXT: Classifying expressions for: @trip_count_9223372036854775808
; CHECK-NEXT: %i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: 9223372036854775807 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: %add = add nuw nsw i64 %i.02, 1
; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,-9223372036854775807) S: [1,-9223372036854775807) Exits: -9223372036854775808 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: Determining loop execution counts for: @trip_count_9223372036854775808
; CHECK-NEXT: Loop %for.body: backedge-taken count is 9223372036854775807
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 9223372036854775807
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is 9223372036854775807
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is 9223372036854775807
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 2147483648
;
entry:
br label %for.body
for.cond.cleanup: ; preds = %for.body
ret void
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
tail call void (...) @foo() #2
%add = add nuw nsw i64 %i.02, 1
%exitcond.not = icmp eq i64 %add, 9223372036854775808
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}
define void @trip_count_18446744073709551615() {
; CHECK-LABEL: 'trip_count_18446744073709551615'
; CHECK-NEXT: Classifying expressions for: @trip_count_18446744073709551615
; CHECK-NEXT: %i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
; CHECK-NEXT: --> {0,+,1}<nuw><nsw><%for.body> U: [0,-9223372036854775808) S: [0,-9223372036854775808) Exits: -2 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: %add = add nuw nsw i64 %i.02, 1
; CHECK-NEXT: --> {1,+,1}<nuw><%for.body> U: [1,0) S: [1,0) Exits: -1 LoopDispositions: { %for.body: Computable }
; CHECK-NEXT: Determining loop execution counts for: @trip_count_18446744073709551615
; CHECK-NEXT: Loop %for.body: backedge-taken count is -2
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -2
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is -2
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is -2
; CHECK-NEXT: Predicates:
; CHECK: Loop %for.body: Trip multiple is 1
;
entry:
br label %for.body
for.cond.cleanup: ; preds = %for.body
ret void
for.body: ; preds = %entry, %for.body
%i.02 = phi i64 [ 0, %entry ], [ %add, %for.body ]
tail call void (...) @foo() #2
%add = add nuw nsw i64 %i.02, 1
%exitcond.not = icmp eq i64 %add, 18446744073709551615
br i1 %exitcond.not, label %for.cond.cleanup, label %for.body
}
|