[crankshaft] For-in index increment cannot overflow.
The internal index used to implement for-in can never leave the valid smi range, so there's no need to actually check for overflow in Crankshaft. In fact the overflow only triggered a false alert in the deopt fuzzer. R=jarin@chromium.org BUG=v8:3650 LOG=n Review URL: https://codereview.chromium.org/1621623002 Cr-Commit-Position: refs/heads/master@{#33456}
This commit is contained in:
parent
379bbd5024
commit
c7d2adc0a2
@ -5444,7 +5444,10 @@ void HOptimizedGraphBuilder::BuildForInBody(ForInStatement* stmt,
|
||||
set_current_block(body_exit);
|
||||
|
||||
HValue* current_index = Pop();
|
||||
Push(AddUncasted<HAdd>(current_index, graph()->GetConstant1()));
|
||||
HValue* increment =
|
||||
AddUncasted<HAdd>(current_index, graph()->GetConstant1());
|
||||
increment->ClearFlag(HValue::kCanOverflow);
|
||||
Push(increment);
|
||||
body_exit = current_block();
|
||||
}
|
||||
|
||||
|
22
test/mjsunit/regress/regress-3650-1.js
Normal file
22
test/mjsunit/regress/regress-3650-1.js
Normal file
@ -0,0 +1,22 @@
|
||||
// Copyright 2016 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 --deopt-every-n-times=55
|
||||
// Flags: --nodead-code-elimination
|
||||
|
||||
function f(t) {
|
||||
var result = [];
|
||||
for (var i in t) {
|
||||
for (var j in t) {
|
||||
result.push(i + j + t[i] + t[j]);
|
||||
continue;
|
||||
}
|
||||
}
|
||||
return result.join('');
|
||||
}
|
||||
|
||||
var t = {a: "1", b: "2"};
|
||||
assertEquals("aa11ab12ba21bb22", f(t));
|
||||
%OptimizeFunctionOnNextCall(f);
|
||||
assertEquals("aa11ab12ba21bb22", f(t));
|
Loading…
Reference in New Issue
Block a user