llvm-6502/test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll
Eli Friedman 068acc3caa Fix for PR2607: SCEV miscomputing the loop count for loops with an
SGT exit condition.  Essentially, the correct way to flip an inequality 
in 2's complement is the not operator, not the negation operator.  
That said, the difference only affects cases involving INT_MIN.

Also, enhance the pre-test search logic to be a bit smarter about 
inequalities flipped with a not operator, so it can eliminate the smax 
from the iteration count for simple loops.



git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@54184 91177308-0d34-0410-b5e6-96231b3b80d8
2008-07-30 00:04:08 +00:00

28 lines
786 B
LLVM

; RUN: llvm-as < %s | opt -analyze -scalar-evolution -disable-output \
; RUN: -scalar-evolution-max-iterations=0 | \
; RUN: grep -F "( -1 + ( -1 * %j)) iterations"
; PR2607
define i32 @_Z1aj(i32 %j) nounwind {
entry:
icmp sgt i32 0, %j ; <i1>:0 [#uses=1]
br i1 %0, label %bb.preheader, label %return
bb.preheader: ; preds = %entry
br label %bb
bb: ; preds = %bb, %bb.preheader
%i.01 = phi i32 [ %1, %bb ], [ 0, %bb.preheader ] ; <i32> [#uses=1]
add i32 %i.01, -1 ; <i32>:1 [#uses=3]
icmp sgt i32 %1, %j ; <i1>:2 [#uses=1]
br i1 %2, label %bb, label %return.loopexit
return.loopexit: ; preds = %bb
br label %return
return: ; preds = %return.loopexit, %entry
%i.0.lcssa = phi i32 [ 0, %entry ], [ %1, %return.loopexit ] ; <i32> [#uses=1]
ret i32 %i.0.lcssa
}