Files
clang-p2996/llvm/test/Analysis/ScalarEvolution/trip-count.ll
Philip Reames 1a37147af5 [SCEV] Match both (-1)b + a and a + (-1)b as a - b (#84247)
In our analysis of guarding conditions, we were converting a-b == 0 into
a == b alternate form, but we were only checking for one of the two
forms for the sub. There's no requirement that the multiply only be on
the LHS of the add.
2024-03-06 15:57:34 -08:00

214 lines
7.4 KiB
LLVM

; 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
}