[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:
bmeurer 2016-01-21 23:54:40 -08:00 committed by Commit bot
parent 379bbd5024
commit c7d2adc0a2
2 changed files with 26 additions and 1 deletions

View File

@ -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();
}

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