| Index: src/compiler/loop-variable-optimizer.cc
|
| diff --git a/src/compiler/loop-variable-optimizer.cc b/src/compiler/loop-variable-optimizer.cc
|
| index 64a6409caf933d011f330a0b146f1b04e4d68e9c..8331963a7d8087b1b2d68c0e722f42507875d67b 100644
|
| --- a/src/compiler/loop-variable-optimizer.cc
|
| +++ b/src/compiler/loop-variable-optimizer.cc
|
| @@ -188,7 +188,7 @@ void LoopVariableOptimizer::VisitBackedge(Node* from, Node* loop) {
|
| NodeProperties::GetControlInput(constraint->right()) == loop) {
|
| auto var = induction_vars_.find(constraint->right()->id());
|
| if (var != induction_vars_.end()) {
|
| - var->second->AddUpperBound(constraint->left(), constraint->kind());
|
| + var->second->AddLowerBound(constraint->left(), constraint->kind());
|
| }
|
| }
|
| }
|
| @@ -303,10 +303,15 @@ InductionVariable* LoopVariableOptimizer::TryGetInductionVariable(Node* phi) {
|
| DCHECK_EQ(IrOpcode::kLoop, NodeProperties::GetControlInput(phi)->opcode());
|
| Node* initial = phi->InputAt(0);
|
| Node* arith = phi->InputAt(1);
|
| - // TODO(jarin) Support subtraction.
|
| - if (arith->opcode() != IrOpcode::kJSAdd) {
|
| + InductionVariable::ArithmeticType arithmeticType;
|
| + if (arith->opcode() == IrOpcode::kJSAdd) {
|
| + arithmeticType = InductionVariable::ArithmeticType::kAddition;
|
| + } else if (arith->opcode() == IrOpcode::kJSSubtract) {
|
| + arithmeticType = InductionVariable::ArithmeticType::kSubtraction;
|
| + } else {
|
| return nullptr;
|
| }
|
| +
|
| // TODO(jarin) Support both sides.
|
| if (arith->InputAt(0) != phi) {
|
| if (arith->InputAt(0)->opcode() != IrOpcode::kJSToNumber ||
|
| @@ -315,7 +320,8 @@ InductionVariable* LoopVariableOptimizer::TryGetInductionVariable(Node* phi) {
|
| }
|
| }
|
| Node* incr = arith->InputAt(1);
|
| - return new (zone()) InductionVariable(phi, arith, incr, initial, zone());
|
| + return new (zone())
|
| + InductionVariable(phi, arith, incr, initial, zone(), arithmeticType);
|
| }
|
|
|
| void LoopVariableOptimizer::DetectInductionVariables(Node* loop) {
|
|
|