[llvm-commits] [llvm] r54184 - in /llvm/trunk: lib/Analysis/ScalarEvolution.cpp test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll

Eli Friedman eli.friedman at gmail.com
Tue Jul 29 17:04:08 PDT 2008


Author: efriedma
Date: Tue Jul 29 19:04:08 2008
New Revision: 54184

URL: http://llvm.org/viewvc/llvm-project?rev=54184&view=rev
Log:
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.


Added:
    llvm/trunk/test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll
Modified:
    llvm/trunk/lib/Analysis/ScalarEvolution.cpp

Modified: llvm/trunk/lib/Analysis/ScalarEvolution.cpp
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/lib/Analysis/ScalarEvolution.cpp?rev=54184&r1=54183&r2=54184&view=diff

==============================================================================
--- llvm/trunk/lib/Analysis/ScalarEvolution.cpp (original)
+++ llvm/trunk/lib/Analysis/ScalarEvolution.cpp Tue Jul 29 19:04:08 2008
@@ -1976,8 +1976,8 @@
     break;
   }
   case ICmpInst::ICMP_SGT: {
-    SCEVHandle TC = HowManyLessThans(SE.getNegativeSCEV(LHS),
-                                     SE.getNegativeSCEV(RHS), L, true);
+    SCEVHandle TC = HowManyLessThans(SE.getNotSCEV(LHS),
+                                     SE.getNotSCEV(RHS), L, true);
     if (!isa<SCEVCouldNotCompute>(TC)) return TC;
     break;
   }
@@ -2724,7 +2724,11 @@
 
   if (!PreCondLHS->getType()->isInteger()) return false;
 
-  return LHS == getSCEV(PreCondLHS) && RHS == getSCEV(PreCondRHS);
+  SCEVHandle PreCondLHSSCEV = getSCEV(PreCondLHS);
+  SCEVHandle PreCondRHSSCEV = getSCEV(PreCondRHS);
+  return (LHS == PreCondLHSSCEV && RHS == PreCondRHSSCEV) ||
+         (LHS == SE.getNotSCEV(PreCondRHSSCEV) &&
+          RHS == SE.getNotSCEV(PreCondLHSSCEV));
 }
 
 /// HowManyLessThans - Return the number of times a backedge containing the

Added: llvm/trunk/test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll
URL: http://llvm.org/viewvc/llvm-project/llvm/trunk/test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll?rev=54184&view=auto

==============================================================================
--- llvm/trunk/test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll (added)
+++ llvm/trunk/test/Analysis/ScalarEvolution/2008-07-29-SGTTripCount.ll Tue Jul 29 19:04:08 2008
@@ -0,0 +1,27 @@
+; 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
+}
+





More information about the llvm-commits mailing list