Revision: 22739
Author:   [email protected]
Date:     Thu Jul 31 08:54:45 2014 UTC
Log:      Version 3.26.31.12 (merged r22616, r22617)

In GrowMode, force the value to the right representation to avoid deopts between storing the length and storing the value.

Smi arrays are only guaranteed to be initialized in non-holey case

BUG=16459193
LOG=y
[email protected]

Review URL: https://codereview.chromium.org/430103002
http://code.google.com/p/v8/source/detail?r=22739

Added:
 /branches/3.26/test/mjsunit/regress/regress-grow-deopt.js
Modified:
 /branches/3.26/src/hydrogen-instructions.h
 /branches/3.26/src/hydrogen.cc
 /branches/3.26/src/version.cc

=======================================
--- /dev/null
+++ /branches/3.26/test/mjsunit/regress/regress-grow-deopt.js Thu Jul 31 08:54:45 2014 UTC
@@ -0,0 +1,16 @@
+// 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
+
+function f(a, v) {
+  a[a.length] = v;
+}
+
+var a = [1.4];
+f(a, 1);
+f(a, 2);
+%OptimizeFunctionOnNextCall(f);
+f(a, {});
+assertEquals(4, a.length);
=======================================
--- /branches/3.26/src/hydrogen-instructions.h  Tue Jun 17 04:40:51 2014 UTC
+++ /branches/3.26/src/hydrogen-instructions.h  Thu Jul 31 08:54:45 2014 UTC
@@ -6766,19 +6766,28 @@
     }

     ASSERT_EQ(index, 2);
-    if (IsDoubleOrFloatElementsKind(elements_kind())) {
+    return RequiredValueRepresentation(elements_kind_, store_mode_);
+  }
+
+  static Representation RequiredValueRepresentation(
+      ElementsKind kind, StoreFieldOrKeyedMode mode) {
+    if (IsDoubleOrFloatElementsKind(kind)) {
       return Representation::Double();
     }
- if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
+
+    if (kind == FAST_SMI_ELEMENTS && SmiValuesAre32Bits() &&
+        mode == STORE_TO_INITIALIZED_ENTRY) {
       return Representation::Integer32();
     }
-    if (IsFastSmiElementsKind(elements_kind())) {
+
+    if (IsFastSmiElementsKind(kind)) {
       return Representation::Smi();
     }

-    return is_external() || is_fixed_typed_array()
-        ? Representation::Integer32()
-        : Representation::Tagged();
+    return IsExternalArrayElementsKind(kind) ||
+                   IsFixedTypedArrayElementsKind(kind)
+               ? Representation::Integer32()
+               : Representation::Tagged();
   }

   bool is_external() const {
@@ -6798,20 +6807,9 @@
     if (IsUninitialized()) {
       return Representation::None();
     }
-    if (IsDoubleOrFloatElementsKind(elements_kind())) {
-      return Representation::Double();
-    }
- if (SmiValuesAre32Bits() && store_mode_ == STORE_TO_INITIALIZED_ENTRY) {
-      return Representation::Integer32();
-    }
-    if (IsFastSmiElementsKind(elements_kind())) {
-      return Representation::Smi();
-    }
-    if (is_typed_elements()) {
-      return Representation::Integer32();
-    }
-    // For fast object elements kinds, don't assume anything.
-    return Representation::None();
+ Representation r = RequiredValueRepresentation(elements_kind_, store_mode_);
+    if (r.IsTagged()) return Representation::None();
+    return r;
   }

   HValue* elements() { return OperandAt(0); }
@@ -6879,9 +6877,6 @@
     SetOperandAt(1, key);
     SetOperandAt(2, val);

-    ASSERT(store_mode != STORE_TO_INITIALIZED_ENTRY ||
-           elements_kind == FAST_SMI_ELEMENTS);
-
     if (IsFastObjectElementsKind(elements_kind)) {
       SetFlag(kTrackSideEffectDominators);
       SetDependsOnFlag(kNewSpacePromotion);
=======================================
--- /branches/3.26/src/hydrogen.cc      Tue Jul  8 09:00:06 2014 UTC
+++ /branches/3.26/src/hydrogen.cc      Thu Jul 31 08:54:45 2014 UTC
@@ -2197,6 +2197,9 @@

   if (IsGrowStoreMode(store_mode)) {
     NoObservableSideEffectsScope no_effects(this);
+ Representation representation = HStoreKeyed::RequiredValueRepresentation(
+        elements_kind, STORE_TO_INITIALIZED_ENTRY);
+    val = AddUncasted<HForceRepresentation>(val, representation);
     elements = BuildCheckForCapacityGrow(checked_object, elements,
                                          elements_kind, length, key,
                                          is_js_array, access_type);
@@ -2368,9 +2371,7 @@
       val = Add<HClampToUint8>(val);
     }
     return Add<HStoreKeyed>(elements, checked_key, val, elements_kind,
-                            elements_kind == FAST_SMI_ELEMENTS
-                              ? STORE_TO_INITIALIZED_ENTRY
-                              : INITIALIZING_STORE);
+                            STORE_TO_INITIALIZED_ENTRY);
   }

   ASSERT(access_type == LOAD);
=======================================
--- /branches/3.26/src/version.cc       Tue Jul  8 09:00:06 2014 UTC
+++ /branches/3.26/src/version.cc       Thu Jul 31 08:54:45 2014 UTC
@@ -35,7 +35,7 @@
 #define MAJOR_VERSION     3
 #define MINOR_VERSION     26
 #define BUILD_NUMBER      31
-#define PATCH_LEVEL       11
+#define PATCH_LEVEL       12
 // Use 1 for candidates and 0 otherwise.
 // (Boolean macro values are not supported by all preprocessors.)
 #define IS_CANDIDATE_VERSION 0

--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
--- You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email 
to [email protected].
For more options, visit https://groups.google.com/d/optout.

Reply via email to