For PR1336:
authorReid Spencer <rspencer@reidspencer.com>
Mon, 16 Apr 2007 01:48:37 +0000 (01:48 +0000)
committerReid Spencer <rspencer@reidspencer.com>
Mon, 16 Apr 2007 01:48:37 +0000 (01:48 +0000)
Fix a div-by-zero bug noticed by APInt. This fixes:
test/Transforms/IndVarsSimplify/exit_value_tests.llx

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

lib/Analysis/ScalarEvolution.cpp

index 54848e96a219c03f4f094f8826d9427bd2001194..89067539c32e465c75baae7caca48c91a8a85773 100644 (file)
@@ -2125,7 +2125,12 @@ SolveQuadraticEquation(const SCEVAddRecExpr *AddRec) {
     // Compute the two solutions for the quadratic formula. 
     // The divisions must be performed as signed divisions.
     APInt NegB(-B);
-    APInt TwoA(A << 1);
+    APInt TwoA( A << Two );
+    if (TwoA == 0) {
+      const Type* Ty = LC->getValue()->getType();
+      return std::make_pair(SCEVUnknown::get(UndefValue::get(Ty)),
+                            SCEVUnknown::get(UndefValue::get(Ty)));
+    }
     ConstantInt *Solution1 = ConstantInt::get((NegB + SqrtVal).sdiv(TwoA));
     ConstantInt *Solution2 = ConstantInt::get((NegB - SqrtVal).sdiv(TwoA));