If the LHS of the comparison is a loop-invariant we also want to move it
authorWojciech Matyjewicz <wmatyjewicz@fastmail.fm>
Mon, 11 Feb 2008 18:37:34 +0000 (18:37 +0000)
committerWojciech Matyjewicz <wmatyjewicz@fastmail.fm>
Mon, 11 Feb 2008 18:37:34 +0000 (18:37 +0000)
to the RHS. This simple change allows to compute loop iteration count
for loops with condition similar to the one in the testcase (which seems
to be quite common).

git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@46959 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp
test/Analysis/ScalarEvolution/2008-02-11-ReversedCondition.ll [new file with mode: 0644]

index cbfc56373aea72c834376e2d902daa15b5cb9956..122dba3e6ac08b4b8bd0476a47e17069327d5e6c 100644 (file)
@@ -1819,8 +1819,8 @@ SCEVHandle ScalarEvolutionsImpl::ComputeIterationCount(const Loop *L) {
 
   // At this point, we would like to compute how many iterations of the 
   // loop the predicate will return true for these inputs.
-  if (isa<SCEVConstant>(LHS) && !isa<SCEVConstant>(RHS)) {
-    // If there is a constant, force it into the RHS.
+  if (LHS->isLoopInvariant(L) && !RHS->isLoopInvariant(L)) {
+    // If there is a loop-invariant, force it into the RHS.
     std::swap(LHS, RHS);
     Cond = ICmpInst::getSwappedPredicate(Cond);
   }
diff --git a/test/Analysis/ScalarEvolution/2008-02-11-ReversedCondition.ll b/test/Analysis/ScalarEvolution/2008-02-11-ReversedCondition.ll
new file mode 100644 (file)
index 0000000..3cdb1e3
--- /dev/null
@@ -0,0 +1,15 @@
+; RUN: llvm-as < %s | opt -scalar-evolution -analyze | not grep Unpredictable
+
+define void @foo(i32 %n) {
+entry:
+       br label %header
+header:
+       %i = phi i32 [ 0, %entry ], [ %i.inc, %next ]
+       %cond = icmp sgt i32 %n, %i
+       br i1 %cond, label %next, label %return
+next:
+        %i.inc = add i32 %i, 1
+       br label %header
+return:
+       ret void
+}