| Index: src/mips64/lithium-mips64.cc
|
| diff --git a/src/mips64/lithium-mips64.cc b/src/mips64/lithium-mips64.cc
|
| index a12764b202af432b936726e127ac68fa3a25bd3c..f78cb9314ba0ed99ea718ded9c66f0606382b49d 100644
|
| --- a/src/mips64/lithium-mips64.cc
|
| +++ b/src/mips64/lithium-mips64.cc
|
| @@ -1501,9 +1501,10 @@ LInstruction* LChunkBuilder::DoMul(HMul* instr) {
|
| bool can_overflow = instr->CheckFlag(HValue::kCanOverflow);
|
| bool bailout_on_minus_zero = instr->CheckFlag(HValue::kBailoutOnMinusZero);
|
|
|
| + int32_t constant_value = 0;
|
| if (right->IsConstant()) {
|
| HConstant* constant = HConstant::cast(right);
|
| - int32_t constant_value = constant->Integer32Value();
|
| + constant_value = constant->Integer32Value();
|
| // Constants -1, 0 and 1 can be optimized if the result can overflow.
|
| // For other constants, it can be optimized only without overflow.
|
| if (!can_overflow || ((constant_value >= -1) && (constant_value <= 1))) {
|
| @@ -1526,7 +1527,10 @@ LInstruction* LChunkBuilder::DoMul(HMul* instr) {
|
| right_op = UseRegister(right);
|
| }
|
| LMulI* mul = new(zone()) LMulI(left_op, right_op);
|
| - if (can_overflow || bailout_on_minus_zero) {
|
| + if (right_op->IsConstantOperand()
|
| + ? ((can_overflow && constant_value == -1) ||
|
| + (bailout_on_minus_zero && constant_value <= 0))
|
| + : (can_overflow || bailout_on_minus_zero)) {
|
| AssignEnvironment(mul);
|
| }
|
| return DefineAsRegister(mul);
|
|
|