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); |