Fixed environment handling for LFlooringDivI on ARM.

Beautiful code... :-}

BUG=chromium:437765
LOG=y

Review URL: https://codereview.chromium.org/775613002

Cr-Commit-Position: refs/heads/master@{#25613}
This commit is contained in:
svenpanne 2014-12-02 05:47:10 -08:00 committed by Commit bot
parent d3c217674f
commit c16b8f6cbb
2 changed files with 32 additions and 2 deletions

View File

@ -1397,8 +1397,16 @@ LInstruction* LChunkBuilder::DoFlooringDivI(HMathFloorOfDiv* instr) {
LOperand* divisor = UseRegister(instr->right());
LOperand* temp =
CpuFeatures::IsSupported(SUDIV) ? NULL : TempDoubleRegister();
LFlooringDivI* div = new(zone()) LFlooringDivI(dividend, divisor, temp);
return AssignEnvironment(DefineAsRegister(div));
LInstruction* result =
DefineAsRegister(new (zone()) LFlooringDivI(dividend, divisor, temp));
if (instr->CheckFlag(HValue::kCanBeDivByZero) ||
instr->CheckFlag(HValue::kBailoutOnMinusZero) ||
(instr->CheckFlag(HValue::kCanOverflow) &&
(!CpuFeatures::IsSupported(SUDIV) ||
!instr->CheckFlag(HValue::kAllUsesTruncatingToInt32)))) {
result = AssignEnvironment(result);
}
return result;
}

View File

@ -0,0 +1,22 @@
// Copyright 2014 the V8 project authors. All rights reserved.
// Use of this source code is governed by a BSD-style license that can be
// found in the LICENSE file.
// Flags: --allow-natives-syntax --no-fold-constants
function foo(x, y) {
return Math.floor(x / y);
}
function bar(x, y) {
return foo(x + 1, y + 1);
}
function baz() {
bar(64, 2);
}
baz();
baz();
%OptimizeFunctionOnNextCall(baz);
baz();