1
0
mirror of https://github.com/RPCS3/llvm-mirror.git synced 2024-11-24 03:33:20 +01:00
llvm-mirror/test/Analysis/ScalarEvolution/trip-count-pow2.ll
Sanjoy Das 49b37e626b [SCEV] Clarify behavior around max backedge taken count
This is a re-application of a r303497 that was reverted in r303498.
I thought it had broken a bot when it had not (the breakage did not
go away with the revert).

This change makes the split between the "exact" backedge taken count
and the "maximum" backedge taken count a bit more obvious.  Both of
these are upper bounds on the number of times the loop header
executes (since SCEV does not account for most kinds of abnormal
control flow), but the latter is guaranteed to be a constant.

There were a few places where the max backedge taken count *was* a
non-constant; I've changed those to compute constants instead.

At this point, I'm not sure if the constant max backedge count can be
computed by calling `getUnsignedRange(Exact).getUnsignedMax()` without
losing precision.  If it can, we can simplify even further by making
`getMaxBackedgeTakenCount` a thin wrapper around
`getBackedgeTakenCount` and `getUnsignedRange`.

llvm-svn: 303531
2017-05-22 06:46:04 +00:00

88 lines
2.0 KiB
LLVM

; RUN: opt < %s -scalar-evolution -analyze | FileCheck %s
define void @test1(i32 %n) {
entry:
%s = mul i32 %n, 96
br label %loop
loop:
%i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
%i.next = add i32 %i, 32
%t = icmp ne i32 %i.next, %s
br i1 %t, label %loop, label %exit
exit:
ret void
; CHECK-LABEL: @test1
; CHECK: Loop %loop: backedge-taken count is ((-32 + (96 * %n)) /u 32)
; CHECK: Loop %loop: max backedge-taken count is 134217727
}
; PR19183
define i32 @test2(i32 %n) {
entry:
%s = and i32 %n, -32
br label %loop
loop:
%i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
%i.next = add i32 %i, 32
%t = icmp ne i32 %i.next, %s
br i1 %t, label %loop, label %exit
exit:
ret i32 %i
; CHECK-LABEL: @test2
; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * (%n /u 32))) /u 32)
; CHECK: Loop %loop: max backedge-taken count is 134217727
}
define void @test3(i32 %n) {
entry:
%s = mul i32 %n, 96
br label %loop
loop:
%i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
%i.next = add i32 %i, 96
%t = icmp ne i32 %i.next, %s
br i1 %t, label %loop, label %exit
exit:
ret void
; CHECK-LABEL: @test3
; CHECK: Loop %loop: backedge-taken count is ((-32 + (32 * %n)) /u 32)
; CHECK: Loop %loop: max backedge-taken count is 134217727
}
define void @test4(i32 %n) {
entry:
%s = mul i32 %n, 4
br label %loop
loop:
%i = phi i32 [ 0, %entry ], [ %i.next, %loop ]
%i.next = add i32 %i, 12
%t = icmp ne i32 %i.next, %s
br i1 %t, label %loop, label %exit
exit:
ret void
; CHECK-LABEL: @test4
; CHECK: Loop %loop: backedge-taken count is ((-4 + (-1431655764 * %n)) /u 4)
; CHECK: Loop %loop: max backedge-taken count is 1073741823
}
define void @test5(i32 %n) {
entry:
%s = mul i32 %n, 4
br label %loop
loop:
%i = phi i32 [ %s, %entry ], [ %i.next, %loop ]
%i.next = add i32 %i, -4
%t = icmp ne i32 %i.next, 0
br i1 %t, label %loop, label %exit
exit:
ret void
; CHECK-LABEL: @test5
; CHECK: Loop %loop: backedge-taken count is ((-4 + (4 * %n)) /u 4)
; CHECK: Loop %loop: max backedge-taken count is 1073741823
}