Fix a bug in GetConstantFactor for affine expressions, in which the existing
authorChris Lattner <sabre@nondot.org>
Tue, 19 Dec 2006 01:16:02 +0000 (01:16 +0000)
committerChris Lattner <sabre@nondot.org>
Tue, 19 Dec 2006 01:16:02 +0000 (01:16 +0000)
code was wrong for things like 3+4*i.

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

lib/Analysis/ScalarEvolution.cpp

index 7d73d7d39819916cfcb503ce4a154ff6deb10337..6cc89bd8019f3d4308418d1efa1ea13bd58eba59 100644 (file)
@@ -74,6 +74,7 @@
 #include "llvm/Support/ConstantRange.h"
 #include "llvm/Support/InstIterator.h"
 #include "llvm/Support/ManagedStatic.h"
+#include "llvm/Support/MathExtras.h"
 #include "llvm/Support/Streams.h"
 #include "llvm/ADT/Statistic.h"
 #include <ostream>
@@ -1372,11 +1373,14 @@ static uint64_t GetConstantFactor(SCEVHandle S) {
   }
     
   if (SCEVAddRecExpr *A = dyn_cast<SCEVAddRecExpr>(S)) {
-    // FIXME: Generalize.
-    if (A->getNumOperands() == 2)
-      return std::min(GetConstantFactor(A->getOperand(0)),
-                      GetConstantFactor(A->getOperand(1)));
-    // ?
+    // For now, we just handle linear expressions.
+    if (A->getNumOperands() == 2) {
+      // We want the GCD between the start and the stride value.
+      uint64_t Start = GetConstantFactor(A->getOperand(0));
+      if (Start == 1) return 1;
+      uint64_t Stride = GetConstantFactor(A->getOperand(1));
+      return GreatestCommonDivisor64(Start, Stride);
+    }
   }
   
   // SCEVSDivExpr, SCEVUnknown.