Guard further against APInt operations with operands of unequal bit width.
authorReid Spencer <rspencer@reidspencer.com>
Sun, 4 Mar 2007 01:25:35 +0000 (01:25 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Sun, 4 Mar 2007 01:25:35 +0000 (01:25 +0000)
git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@34897 91177308-0d34-0410-b5e6-96231b3b80d8

lib/Analysis/ScalarEvolution.cpp

index d2eca4adeb4106d5183bddc259ef1b9dfc431598..051631e80d14f3196210714c9e94833b55eb281e 100644 (file)
@@ -1354,16 +1354,22 @@ static APInt GetConstantFactor(SCEVHandle S) {
     // 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 @@ static APInt GetConstantFactor(SCEVHandle S) {
       if (Start == 1) 
         return APInt(A->getBitWidth(),1);
       APInt Stride = GetConstantFactor(A->getOperand(1));
+      Start.zextOrTrunc(Stride.getBitWidth());
       return APIntOps::GreatestCommonDivisor(Start, Stride);
     }
   }