Fix a thinko in the code that adapted SCEVMulExpr operands for
use in expanding SCEVAddExprs with GEPs. The operands of a
SCEVMulExpr need to be multiplied together, not added.


git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@72250 91177308-0d34-0410-b5e6-96231b3b80d8
diff --git a/lib/Analysis/ScalarEvolutionExpander.cpp b/lib/Analysis/ScalarEvolutionExpander.cpp
index d110385..507ced7 100644
--- a/lib/Analysis/ScalarEvolutionExpander.cpp
+++ b/lib/Analysis/ScalarEvolutionExpander.cpp
@@ -168,6 +168,8 @@
     std::vector<SCEVHandle> ScaledOps;
     for (unsigned i = 0, e = Ops.size(); i != e; ++i) {
       if (ElSize != 0) {
+        // For a Constant, check for a multiple of the pointer type's
+        // scale size.
         if (const SCEVConstant *C = dyn_cast<SCEVConstant>(Ops[i]))
           if (!C->getValue()->getValue().srem(ElSize)) {
             ConstantInt *CI =
@@ -176,13 +178,19 @@
             ScaledOps.push_back(Div);
             continue;
           }
+        // In a Mul, check if there is a constant operand which is a multiple
+        // of the pointer type's scale size.
         if (const SCEVMulExpr *M = dyn_cast<SCEVMulExpr>(Ops[i]))
           if (const SCEVConstant *C = dyn_cast<SCEVConstant>(M->getOperand(0)))
-            if (C->getValue()->getValue() == ElSize) {
-              for (unsigned j = 1, f = M->getNumOperands(); j != f; ++j)
-                ScaledOps.push_back(M->getOperand(j));
+            if (!C->getValue()->getValue().srem(ElSize)) {
+              std::vector<SCEVHandle> NewMulOps(M->getOperands());
+              NewMulOps[0] =
+                SE.getConstant(C->getValue()->getValue().sdiv(ElSize));
+              ScaledOps.push_back(SE.getMulExpr(NewMulOps));
               continue;
             }
+        // In an Unknown, check if the underlying value is a Mul by a constant
+        // which is equal to the pointer type's scale size.
         if (const SCEVUnknown *U = dyn_cast<SCEVUnknown>(Ops[i]))
           if (BinaryOperator *BO = dyn_cast<BinaryOperator>(U->getValue()))
             if (BO->getOpcode() == Instruction::Mul)
@@ -191,6 +199,8 @@
                   ScaledOps.push_back(SE.getUnknown(BO->getOperand(0)));
                   continue;
                 }
+        // If the pointer type's scale size is 1, no scaling is necessary
+        // and any value can be used.
         if (ElSize == 1) {
           ScaledOps.push_back(Ops[i]);
           continue;