Please use GitHub pull requests for new patches. Avoid migrating existing patches. Phabricator shutdown timeline
Changeset View
Changeset View
Standalone View
Standalone View
llvm/test/Analysis/ScalarEvolution/finite-trip-count.ll
; NOTE: Assertions have been autogenerated by utils/update_analyze_test_checks.py | ; 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 | ; 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 datalayout = "e-m:e-i64:64-f80:128-n8:16:32:64-S128" | ||||
target triple = "x86_64-unknown-linux-gnu" | target triple = "x86_64-unknown-linux-gnu" | ||||
declare void @non_exit_use(i32 %i) #0 | declare void @non_exit_use(i32 %i) #0 | ||||
define void @SLE(i32 %len) willreturn { | define void @SLE(i32 %len) willreturn { | ||||
; CHECK-LABEL: 'SLE' | ; CHECK-LABEL: 'SLE' | ||||
; CHECK-NEXT: Determining loop execution counts for: @SLE | ; CHECK-NEXT: Determining loop execution counts for: @SLE | ||||
; CHECK-NEXT: Loop %for.body: backedge-taken count is (0 smax (1 + %len)<nsw>) | ; CHECK-NEXT: Loop %for.body: backedge-taken count is (0 smax (1 + %len)) | ||||
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 2147483647 | ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is 2147483647 | ||||
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (0 smax (1 + %len)<nsw>) | ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (0 smax (1 + %len)) | ||||
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (0 smax (1 + %len)<nsw>) | ; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (0 smax (1 + %len)) | ||||
; CHECK-NEXT: Predicates: | ; CHECK-NEXT: Predicates: | ||||
; CHECK: Loop %for.body: Trip multiple is 1 | ; CHECK: Loop %for.body: Trip multiple is 1 | ||||
; | ; | ||||
entry: | entry: | ||||
br label %for.body | br label %for.body | ||||
for.body: | for.body: | ||||
%iv = phi i32 [ %inc, %for.body ], [ 0, %entry ] | %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ] | ||||
Show All 26 Lines | |||||
for.end: | for.end: | ||||
ret void | ret void | ||||
} | } | ||||
define void @ULE(i32 %len) willreturn { | define void @ULE(i32 %len) willreturn { | ||||
; CHECK-LABEL: 'ULE' | ; CHECK-LABEL: 'ULE' | ||||
; CHECK-NEXT: Determining loop execution counts for: @ULE | ; CHECK-NEXT: Determining loop execution counts for: @ULE | ||||
; CHECK-NEXT: Loop %for.body: backedge-taken count is (1 + %len)<nuw> | ; CHECK-NEXT: Loop %for.body: backedge-taken count is (1 + %len) | ||||
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -1 | ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -1 | ||||
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (1 + %len)<nuw> | ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (1 + %len) | ||||
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (1 + %len)<nuw> | ; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (1 + %len) | ||||
; CHECK-NEXT: Predicates: | ; CHECK-NEXT: Predicates: | ||||
; CHECK: Loop %for.body: Trip multiple is 1 | ; CHECK: Loop %for.body: Trip multiple is 1 | ||||
; | ; | ||||
entry: | entry: | ||||
br label %for.body | br label %for.body | ||||
for.body: | for.body: | ||||
%iv = phi i32 [ %inc, %for.body ], [ 0, %entry ] | %iv = phi i32 [ %inc, %for.body ], [ 0, %entry ] | ||||
Show All 26 Lines | |||||
for.end: | for.end: | ||||
ret void | ret void | ||||
} | } | ||||
define void @SGE(i32 %end) willreturn { | define void @SGE(i32 %end) willreturn { | ||||
; CHECK-LABEL: 'SGE' | ; CHECK-LABEL: 'SGE' | ||||
; CHECK-NEXT: Determining loop execution counts for: @SGE | ; CHECK-NEXT: Determining loop execution counts for: @SGE | ||||
; CHECK-NEXT: Loop %for.body: backedge-taken count is (100 + (-1 * (100 smin (-1 + %end)<nsw>))) | ; CHECK-NEXT: Loop %for.body: backedge-taken count is (100 + (-1 * (100 smin (-1 + %end)))) | ||||
; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -2147483548 | ; CHECK-NEXT: Loop %for.body: constant max backedge-taken count is -2147483548 | ||||
; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 smin (-1 + %end)<nsw>))) | ; CHECK-NEXT: Loop %for.body: symbolic max backedge-taken count is (100 + (-1 * (100 smin (-1 + %end)))) | ||||
; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (100 + (-1 * (100 smin (-1 + %end)<nsw>))) | ; CHECK-NEXT: Loop %for.body: Predicated backedge-taken count is (100 + (-1 * (100 smin (-1 + %end)))) | ||||
; CHECK-NEXT: Predicates: | ; CHECK-NEXT: Predicates: | ||||
; CHECK: Loop %for.body: Trip multiple is 1 | ; CHECK: Loop %for.body: Trip multiple is 1 | ||||
; | ; | ||||
entry: | entry: | ||||
br label %for.body | br label %for.body | ||||
for.body: | for.body: | ||||
%iv = phi i32 [ %inc, %for.body ], [ 100, %entry ] | %iv = phi i32 [ %inc, %for.body ], [ 100, %entry ] | ||||
▲ Show 20 Lines • Show All 69 Lines • ▼ Show 20 Lines | for.body: | ||||
%inc = add i32 %iv, -1 | %inc = add i32 %iv, -1 | ||||
%cmp = icmp uge i32 %iv, %end | %cmp = icmp uge i32 %iv, %end | ||||
br i1 %cmp, label %for.body, label %for.end | br i1 %cmp, label %for.body, label %for.end | ||||
for.end: | for.end: | ||||
ret void | ret void | ||||
} | } | ||||
; FIXME: It would be better to compute ((-2 + %n) /u 2) as trip count here. | |||||
define void @pr54191(i64 %n) mustprogress { | define void @pr54191(i64 %n) mustprogress { | ||||
; CHECK-LABEL: 'pr54191' | ; CHECK-LABEL: 'pr54191' | ||||
; CHECK-NEXT: Determining loop execution counts for: @pr54191 | ; CHECK-NEXT: Determining loop execution counts for: @pr54191 | ||||
; CHECK-NEXT: Loop %loop: backedge-taken count is ((-3 + (4 smax (1 + %n)<nsw>))<nsw> /u 2) | ; CHECK-NEXT: Loop %loop: backedge-taken count is ((-2 + %n) /u 2) | ||||
; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4611686018427387901 | ; CHECK-NEXT: Loop %loop: constant max backedge-taken count is 4611686018427387902 | ||||
; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-3 + (4 smax (1 + %n)<nsw>))<nsw> /u 2) | ; CHECK-NEXT: Loop %loop: symbolic max backedge-taken count is ((-2 + %n) /u 2) | ||||
; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-3 + (4 smax (1 + %n)<nsw>))<nsw> /u 2) | ; CHECK-NEXT: Loop %loop: Predicated backedge-taken count is ((-2 + %n) /u 2) | ||||
; CHECK-NEXT: Predicates: | ; CHECK-NEXT: Predicates: | ||||
; CHECK: Loop %loop: Trip multiple is 1 | ; CHECK: Loop %loop: Trip multiple is 1 | ||||
; | ; | ||||
entry: | entry: | ||||
%guard = icmp sgt i64 %n, 1 | %guard = icmp sgt i64 %n, 1 | ||||
br i1 %guard, label %loop, label %exit | br i1 %guard, label %loop, label %exit | ||||
loop: | loop: | ||||
%iv = phi i64 [ 2, %entry ], [ %iv.next, %loop ] | %iv = phi i64 [ 2, %entry ], [ %iv.next, %loop ] | ||||
%iv.next = add nuw nsw i64 %iv, 2 | %iv.next = add nuw nsw i64 %iv, 2 | ||||
%cmp = icmp sle i64 %iv.next, %n | %cmp = icmp sle i64 %iv.next, %n | ||||
br i1 %cmp, label %loop, label %exit | br i1 %cmp, label %loop, label %exit | ||||
exit: | exit: | ||||
ret void | ret void | ||||
} | } |