Skip to content

Commit 0cd991e

Browse files
jaro-sevcikCommit bot
authored andcommitted
Do not inline array push for arrays with dictionary mode elements.
BUG=chromium:452878 LOG=n Review URL: https://codereview.chromium.org/880233002 Cr-Commit-Position: refs/heads/master@{#26357}
1 parent 5d12b28 commit 0cd991e

3 files changed

Lines changed: 39 additions & 18 deletions

File tree

src/hydrogen.cc

Lines changed: 15 additions & 18 deletions
Original file line numberDiff line numberDiff line change
@@ -8222,6 +8222,18 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinFunctionCall(Call* expr) {
82228222
}
82238223

82248224

8225+
// static
8226+
bool HOptimizedGraphBuilder::CanInlineArrayResizeOperation(
8227+
Handle<Map> receiver_map) {
8228+
return !receiver_map.is_null() &&
8229+
receiver_map->instance_type() == JS_ARRAY_TYPE &&
8230+
IsFastElementsKind(receiver_map->elements_kind()) &&
8231+
!receiver_map->is_dictionary_map() &&
8232+
!JSArray::IsReadOnlyLengthDescriptor(receiver_map) &&
8233+
!receiver_map->is_observed() && receiver_map->is_extensible();
8234+
}
8235+
8236+
82258237
bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
82268238
Call* expr, Handle<JSFunction> function, Handle<Map> receiver_map,
82278239
int args_count_no_receiver) {
@@ -8341,13 +8353,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
83418353
}
83428354
break;
83438355
case kArrayPop: {
8344-
if (receiver_map.is_null()) return false;
8345-
if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false;
8356+
if (!CanInlineArrayResizeOperation(receiver_map)) return false;
83468357
ElementsKind elements_kind = receiver_map->elements_kind();
8347-
if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false;
8348-
if (!IsFastElementsKind(elements_kind)) return false;
8349-
if (receiver_map->is_observed()) return false;
8350-
if (!receiver_map->is_extensible()) return false;
83518358

83528359
Drop(args_count_no_receiver);
83538360
HValue* result;
@@ -8404,13 +8411,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
84048411
return true;
84058412
}
84068413
case kArrayPush: {
8407-
if (receiver_map.is_null()) return false;
8408-
if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false;
8414+
if (!CanInlineArrayResizeOperation(receiver_map)) return false;
84098415
ElementsKind elements_kind = receiver_map->elements_kind();
8410-
if (!IsFastElementsKind(elements_kind)) return false;
8411-
if (receiver_map->is_observed()) return false;
8412-
if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false;
8413-
if (!receiver_map->is_extensible()) return false;
84148416

84158417
// If there may be elements accessors in the prototype chain, the fast
84168418
// inlined version can't be used.
@@ -8457,13 +8459,8 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall(
84578459
return true;
84588460
}
84598461
case kArrayShift: {
8460-
if (receiver_map.is_null()) return false;
8461-
if (receiver_map->instance_type() != JS_ARRAY_TYPE) return false;
8462+
if (!CanInlineArrayResizeOperation(receiver_map)) return false;
84628463
ElementsKind kind = receiver_map->elements_kind();
8463-
if (JSArray::IsReadOnlyLengthDescriptor(receiver_map)) return false;
8464-
if (!IsFastElementsKind(kind)) return false;
8465-
if (receiver_map->is_observed()) return false;
8466-
if (!receiver_map->is_extensible()) return false;
84678464

84688465
// If there may be elements accessors in the prototype chain, the fast
84698466
// inlined version can't be used.

src/hydrogen.h

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -2391,6 +2391,7 @@ class HOptimizedGraphBuilder : public HGraphBuilder, public AstVisitor {
23912391
int argc,
23922392
BailoutId ast_id,
23932393
ApiCallType call_type);
2394+
static bool CanInlineArrayResizeOperation(Handle<Map> receiver_map);
23942395

23952396
// If --trace-inlining, print a line of the inlining trace. Inlining
23962397
// succeeded if the reason string is NULL and failed if there is a

test/mjsunit/array-push12.js

Lines changed: 23 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,23 @@
1+
// Copyright 2015 the V8 project authors. All rights reserved.
2+
// Use of this source code is governed by a BSD-style license that can be
3+
// found in the LICENSE file.
4+
5+
// Flags: --allow-natives-syntax
6+
7+
var a = [];
8+
for (var i = -20; i < 0; ++i) {
9+
a[i] = 0;
10+
}
11+
12+
function g() {
13+
[].push.apply(a, arguments);
14+
}
15+
16+
function f() {
17+
g();
18+
}
19+
20+
g();
21+
g();
22+
%OptimizeFunctionOnNextCall(f);
23+
f();

0 commit comments

Comments
 (0)