Guard further against APInt operations with operands of unequal bit width.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34897 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/ScalarEvolution.cpp b/lib/Analysis/ScalarEvolution.cpp
index d2eca4a..051631e 100644
--- a/lib/Analysis/ScalarEvolution.cpp
+++ b/lib/Analysis/ScalarEvolution.cpp
@@ -1354,16 +1354,22 @@
     // The result is the min of all operands.
     APInt Res = GetConstantFactor(A->getOperand(0));
     for (unsigned i = 1, e = A->getNumOperands(); 
-         i != e && Res.ugt(APInt(Res.getBitWidth(),1)); ++i)
-      Res = APIntOps::umin(Res, GetConstantFactor(A->getOperand(i)));
+         i != e && Res.ugt(APInt(Res.getBitWidth(),1)); ++i) {
+      APInt Tmp(GetConstantFactor(A->getOperand(i)));
+      Tmp.zextOrTrunc(Res.getBitWidth());
+      Res = APIntOps::umin(Res, Tmp);
+    }
     return Res;
   }
 
   if (SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(S)) {
     // The result is the product of all the operands.
     APInt Res = GetConstantFactor(M->getOperand(0));
-    for (unsigned i = 1, e = M->getNumOperands(); i != e; ++i)
-      Res *= GetConstantFactor(M->getOperand(i));
+    for (unsigned i = 1, e = M->getNumOperands(); i != e; ++i) {
+      APInt Tmp(GetConstantFactor(M->getOperand(i)));
+      Tmp.zextOrTrunc(Res.getBitWidth());
+      Res *= Tmp;
+    }
     return Res;
   }
     
@@ -1375,6 +1381,7 @@
       if (Start == 1) 
         return APInt(A->getBitWidth(),1);
       APInt Stride = GetConstantFactor(A->getOperand(1));
+      Start.zextOrTrunc(Stride.getBitWidth());
       return APIntOps::GreatestCommonDivisor(Start, Stride);
     }
   }