handle special cases when findGCD returns 1
[oota-llvm.git] / lib / Analysis / ScalarEvolution.cpp
index d6165111dbabf29324b7e5ec949bfec1b71bc33c..6ccf8aac3b893c4ba3b8ec344cf980ee7eb1bad0 100644 (file)
@@ -7001,12 +7001,17 @@ public:
 
     const SCEV *Rem = Zero;
     const SCEV *Res = findGCD(SE, Expr->getOperand(0), GCD, &Rem);
+    if (Res == One || Res->isAllOnesValue()) {
+      Remainder = Expr;
+      return GCD;
+    }
+
     if (Rem != Zero)
       Remainder = SE.getAddExpr(Remainder, Rem);
 
     Rem = Zero;
     Res = findGCD(SE, Expr->getOperand(1), Res, &Rem);
-    if (Rem != Zero) {
+    if (Rem != Zero || Res == One || Res->isAllOnesValue()) {
       Remainder = Expr;
       return GCD;
     }