MIPS: Fixed Hydrogen environment handling for mul-i ARM and ARM64.
Port a7d67a64f1
Original commit message:
The whole logic in DoMul makes me cry, so I made only the minimal
change to fix the issue...
BUG=v8:451322
LOG=y
Review URL: https://codereview.chromium.org/879473002
Cr-Commit-Position: refs/heads/master@{#26277}
This commit is contained in:
parent
7c81161b97
commit
0ae9eb038f
@ -1500,9 +1500,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))) {
|
||||
@ -1525,7 +1526,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);
|
||||
|
@ -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);
|
||||
|
Loading…
Reference in New Issue
Block a user