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 153 154 155 156 157 158 159 160 161 162 163 164 165 166 167 168 169 170 171 172 173 174 175 176 177 178 179 180 181 182 183 184 185 186 187 188 189 190 191 192 193 194 195 196 197 198 199 200 201 202 203 204 205 206 207 208 209 210 211 212 213
|
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py
; RUN: opt < %s -disable-output "-passes=print<scalar-evolution>" -scalar-evolution-max-iterations=0 -scalar-evolution-classify-expressions=0 2>&1 | FileCheck %s
target datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128"
target triple = "x86_64-unknown-linux-gnu"
@A = weak global [1000 x i32] zeroinitializer, align 32
define void @PR1101(i32 %N) {
; CHECK-LABEL: 'PR1101'
; CHECK-NEXT: Determining loop execution counts for: @PR1101
; CHECK-NEXT: Loop %bb3: backedge-taken count is i32 10000
; CHECK-NEXT: Loop %bb3: constant max backedge-taken count is i32 10000
; CHECK-NEXT: Loop %bb3: symbolic max backedge-taken count is i32 10000
; CHECK-NEXT: Loop %bb3: Trip multiple is 10001
;
entry:
br label %bb3
bb: ; preds = %bb3
%tmp = getelementptr [1000 x i32], ptr @A, i32 0, i32 %i.0 ; <ptr> [#uses=1]
store i32 123, ptr %tmp
%tmp2 = add i32 %i.0, 1 ; <i32> [#uses=1]
br label %bb3
bb3: ; preds = %bb, %entry
%i.0 = phi i32 [ 0, %entry ], [ %tmp2, %bb ] ; <i32> [#uses=3]
%tmp3 = icmp sle i32 %i.0, 9999 ; <i1> [#uses=1]
br i1 %tmp3, label %bb, label %bb5
bb5: ; preds = %bb3
br label %return
return: ; preds = %bb5
ret void
}
define i32 @PR22795() {
; CHECK-LABEL: 'PR22795'
; CHECK-NEXT: Determining loop execution counts for: @PR22795
; CHECK-NEXT: Loop %preheader: backedge-taken count is i64 7
; CHECK-NEXT: Loop %preheader: constant max backedge-taken count is i64 7
; CHECK-NEXT: Loop %preheader: symbolic max backedge-taken count is i64 7
; CHECK-NEXT: Loop %preheader: Trip multiple is 8
;
entry:
%bins = alloca [16 x i64], align 16
call void @llvm.memset.p0.i64(ptr align 16 %bins, i8 0, i64 128, i1 false)
br label %preheader
preheader: ; preds = %for.inc.1, %entry
%v11 = phi i64 [ 0, %entry ], [ %next12.1, %for.inc.1 ]
%iv = phi i32 [ -1, %entry ], [ %next.1, %for.inc.1 ]
%cmp = icmp sgt i64 %v11, 0
br i1 %cmp, label %for.body, label %for.inc
for.body: ; preds = %preheader
%zext = zext i32 %iv to i64
%arrayidx = getelementptr [16 x i64], ptr %bins, i64 0, i64 %v11
%loaded = load i64, ptr %arrayidx, align 8
%add = add i64 %loaded, 1
%add2 = add i64 %add, %zext
store i64 %add2, ptr %arrayidx, align 8
br label %for.inc
for.inc: ; preds = %for.body, %preheader
%next12 = add nuw nsw i64 %v11, 1
%next = add nsw i32 %iv, 1
br i1 true, label %for.body.1, label %for.inc.1
end: ; preds = %for.inc.1
%arrayidx8 = getelementptr [16 x i64], ptr %bins, i64 0, i64 2
%load = load i64, ptr %arrayidx8, align 16
%shr4 = lshr i64 %load, 32
%conv = trunc i64 %shr4 to i32
ret i32 %conv
for.body.1: ; preds = %for.inc
%zext.1 = zext i32 %next to i64
%arrayidx.1 = getelementptr [16 x i64], ptr %bins, i64 0, i64 %next12
%loaded.1 = load i64, ptr %arrayidx.1, align 8
%add.1 = add i64 %loaded.1, 1
%add2.1 = add i64 %add.1, %zext.1
store i64 %add2.1, ptr %arrayidx.1, align 8
br label %for.inc.1
for.inc.1: ; preds = %for.body.1, %for.inc
%next12.1 = add nuw nsw i64 %next12, 1
%next.1 = add nuw nsw i32 %next, 1
%exitcond.1 = icmp eq i64 %next12.1, 16
br i1 %exitcond.1, label %end, label %preheader
}
; Function Attrs: nounwind
declare void @llvm.memset.p0.i64(ptr nocapture, i8, i64, i1) #0
declare void @may_exit() nounwind
define void @pr28012(i32 %n) {
; CHECK-LABEL: 'pr28012'
; CHECK-NEXT: Determining loop execution counts for: @pr28012
; CHECK-NEXT: Loop %loop: backedge-taken count is i32 -1431655751
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i32 -1431655751
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is i32 -1431655751
; CHECK-NEXT: Loop %loop: Trip multiple is 2863311546
;
entry:
br label %loop
loop:
%iv = phi i32 [ 0, %entry ], [ %iv.inc, %loop ]
%iv.inc = add nsw i32 %iv, 3
call void @may_exit()
%becond = icmp ne i32 %iv.inc, 46
br i1 %becond, label %loop, label %leave
leave:
ret void
}
define void @non_zero_from_loop_guard(i16 %n) {
; CHECK-LABEL: 'non_zero_from_loop_guard'
; CHECK-NEXT: Determining loop execution counts for: @non_zero_from_loop_guard
; CHECK-NEXT: Loop %loop: backedge-taken count is (-1 + (%n /u 2))<nsw>
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is i16 32766
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is (-1 + (%n /u 2))<nsw>
; CHECK-NEXT: Loop %loop: Trip multiple is 1
;
entry:
%shr = lshr i16 %n, 1
%precond = icmp ult i16 %n, 2
br i1 %precond, label %exit, label %loop
loop:
%iv = phi i16 [ %inc, %loop ], [ 0, %entry ]
%inc = add nuw nsw i16 %iv, 1
%cmp = icmp ult i16 %inc, %shr
br i1 %cmp, label %loop, label %exit
exit:
ret void
}
define void @dual_sext_ne_with_slt_guard(i8 %s, i8 %n) {
; CHECK-LABEL: 'dual_sext_ne_with_slt_guard'
; CHECK-NEXT: Determining loop execution counts for: @dual_sext_ne_with_slt_guard
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (sext i8 %n to i64) + (-1 * (sext i8 %s to i64))<nsw>)
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i64 -2
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (sext i8 %n to i64) + (-1 * (sext i8 %s to i64))<nsw>)
; CHECK-NEXT: Loop %for.body: Trip multiple is 1
;
entry:
%cmp4 = icmp slt i8 %s, %n
br i1 %cmp4, label %for.body.preheader, label %exit
for.body.preheader:
%0 = sext i8 %s to i64
%wide.trip.count = sext i8 %n to i64
br label %for.body
for.body:
%iv = phi i64 [ %0, %for.body.preheader ], [ %iv.next, %for.body ]
%iv.next = add nsw i64 %iv, 1
%exitcond.not = icmp eq i64 %iv.next, %wide.trip.count
br i1 %exitcond.not, label %exit, label %for.body
exit:
ret void
}
define void @dual_sext_ne_with_nsw_inc(i8 %s, i64 %n) {
; CHECK-LABEL: 'dual_sext_ne_with_nsw_inc'
; CHECK-NEXT: Determining loop execution counts for: @dual_sext_ne_with_nsw_inc
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (-1 * (sext i8 %s to i64))<nsw> + %n)
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (-1 * (sext i8 %s to i64))<nsw> + %n)
; CHECK-NEXT: Loop %for.body: Trip multiple is 1
;
entry:
%0 = sext i8 %s to i64
br label %for.body
for.body:
%iv = phi i64 [ %0, %entry ], [ %iv.next, %for.body ]
%iv.next = add nsw i64 %iv, 1
%exitcond.not = icmp eq i64 %iv.next, %n
br i1 %exitcond.not, label %exit, label %for.body
exit:
ret void
}
define void @dual_sext_ne_with_nuw_inc(i8 %s, i64 %n) {
; CHECK-LABEL: 'dual_sext_ne_with_nuw_inc'
; CHECK-NEXT: Determining loop execution counts for: @dual_sext_ne_with_nuw_inc
; CHECK-NEXT: Loop %for.body: backedge-taken count is (-1 + (-1 * (sext i8 %s to i64))<nsw> + %n)
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is i64 -1
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (-1 + (-1 * (sext i8 %s to i64))<nsw> + %n)
; CHECK-NEXT: Loop %for.body: Trip multiple is 1
;
entry:
%0 = sext i8 %s to i64
br label %for.body
for.body:
%iv = phi i64 [ %0, %entry ], [ %iv.next, %for.body ]
%iv.next = add nuw i64 %iv, 1
%exitcond.not = icmp eq i64 %iv.next, %n
br i1 %exitcond.not, label %exit, label %for.body
exit:
ret void
}
|