mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-11-01 16:33:37 +01:00
5e06a05a16
have trouble with an intermediate add overflowing. Also, be more conservative about the case where the induction variable in an SLT loop exit can step past the RHS of the SLT and overflow in a single step. Make getSignedRange more aggressive, to recover for some common cases which the above fixes pessimized. This addresses rdar://7561161. llvm-svn: 94512
409 lines
11 KiB
LLVM
409 lines
11 KiB
LLVM
; RUN: opt -analyze -scalar-evolution -S < %s | FileCheck %s
|
|
|
|
; Every combination of
|
|
; - starting at 0, 1, or %x
|
|
; - steping by 1 or 2
|
|
; - stopping at %n or %n*2
|
|
; - using nsw, or not
|
|
|
|
; Some of these represent missed opportunities.
|
|
|
|
; CHECK: Determining loop execution counts for: @foo
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + %n)
|
|
; CHECK: Loop %loop: max backedge-taken count is 6
|
|
define void @foo(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: Unpredictable max backedge-taken count.
|
|
define void @step2(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @start1
|
|
; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax %n))
|
|
; CHECK: Loop %loop: max backedge-taken count is 5
|
|
define void @start1(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @start1_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: Unpredictable max backedge-taken count.
|
|
define void @start1_step2(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @startx
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
|
|
; CHECK: Loop %loop: max backedge-taken count is -1
|
|
define void @startx(i4 %n, i4 %x) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @startx_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: Unpredictable max backedge-taken count.
|
|
define void @startx_step2(i4 %n, i4 %x) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @nsw
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + %n)
|
|
; CHECK: Loop %loop: max backedge-taken count is 6
|
|
define void @nsw(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; Be careful with this one. If %n is INT4_MAX, %i.next will wrap. The nsw bit
|
|
; says that the result is undefined, but ScalarEvolution must respect that
|
|
; subsequent passes may result the undefined behavior in predictable ways.
|
|
; CHECK: Determining loop execution counts for: @nsw_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: Unpredictable max backedge-taken count.
|
|
define void @nsw_step2(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @nsw_start1
|
|
; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax %n))
|
|
; CHECK: Loop %loop: max backedge-taken count is 5
|
|
define void @nsw_start1(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @nsw_start1_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: Unpredictable max backedge-taken count.
|
|
define void @nsw_start1_step2(i4 %n) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @nsw_startx
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax %n))
|
|
; CHECK: Loop %loop: max backedge-taken count is -1
|
|
define void @nsw_startx(i4 %n, i4 %x) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @nsw_startx_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: Unpredictable max backedge-taken count.
|
|
define void @nsw_startx_step2(i4 %n, i4 %x) {
|
|
entry:
|
|
%s = icmp sgt i4 %n, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %n
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + (2 * %n))
|
|
; CHECK: Loop %loop: max backedge-taken count is 5
|
|
define void @even(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: max backedge-taken count is 2
|
|
define void @even_step2(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_start1
|
|
; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax (2 * %n)))
|
|
; CHECK: Loop %loop: max backedge-taken count is 4
|
|
define void @even_start1(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_start1_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: max backedge-taken count is 2
|
|
define void @even_start1_step2(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_startx
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
|
|
; CHECK: Loop %loop: max backedge-taken count is -1
|
|
define void @even_startx(i4 %n, i4 %x) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_startx_step2
|
|
; CHECK: Loop %loop: Unpredictable backedge-taken count.
|
|
; CHECK: Loop %loop: max backedge-taken count is 7
|
|
define void @even_startx_step2(i4 %n, i4 %x) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_nsw
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + (2 * %n))
|
|
; CHECK: Loop %loop: max backedge-taken count is 5
|
|
define void @even_nsw(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_nsw_step2
|
|
; CHECK: Loop %loop: backedge-taken count is ((-1 + (2 * %n)) /u 2)
|
|
; CHECK: Loop %loop: max backedge-taken count is 2
|
|
define void @even_nsw_step2(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 0, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_nsw_start1
|
|
; CHECK: Loop %loop: backedge-taken count is (-2 + (2 smax (2 * %n)))
|
|
; CHECK: Loop %loop: max backedge-taken count is 4
|
|
define void @even_nsw_start1(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_nsw_start1_step2
|
|
; CHECK: Loop %loop: backedge-taken count is ((-2 + (3 smax (2 * %n))) /u 2)
|
|
; CHECK: Loop %loop: max backedge-taken count is 2
|
|
define void @even_nsw_start1_step2(i4 %n) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ 1, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_nsw_startx
|
|
; CHECK: Loop %loop: backedge-taken count is (-1 + (-1 * %x) + ((1 + %x) smax (2 * %n)))
|
|
; CHECK: Loop %loop: max backedge-taken count is -1
|
|
define void @even_nsw_startx(i4 %n, i4 %x) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 1
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|
|
|
|
; CHECK: Determining loop execution counts for: @even_nsw_startx_step2
|
|
; CHECK: Loop %loop: backedge-taken count is ((-1 + (-1 * %x) + ((2 + %x) smax (2 * %n))) /u 2)
|
|
; CHECK: Loop %loop: max backedge-taken count is 7
|
|
define void @even_nsw_startx_step2(i4 %n, i4 %x) {
|
|
entry:
|
|
%m = shl i4 %n, 1
|
|
%s = icmp sgt i4 %m, 0
|
|
br i1 %s, label %loop, label %exit
|
|
loop:
|
|
%i = phi i4 [ %x, %entry ], [ %i.next, %loop ]
|
|
%i.next = add nsw i4 %i, 2
|
|
%t = icmp slt i4 %i.next, %m
|
|
br i1 %t, label %loop, label %exit
|
|
exit:
|
|
ret void
|
|
}
|