| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 2d1e844ecc37c565004575764d88af7554bb83a9..54a522506287259d83a7684002e5ad1fac33fc07 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -1586,7 +1586,10 @@ void HGraphBuilder::BuildCopyElements(HValue* context,
|
| ? FAST_HOLEY_ELEMENTS : to_elements_kind;
|
| HInstruction* holey_store = AddInstruction(
|
| new(zone()) HStoreKeyed(to_elements, key, element, holey_kind));
|
| - holey_store->ClearFlag(HValue::kDeoptimizeOnUndefined);
|
| + // Allow NaN hole values to converted to their tagged counterparts.
|
| + if (IsFastHoleyElementsKind(to_elements_kind)) {
|
| + holey_store->SetFlag(HValue::kAllowUndefinedAsNaN);
|
| + }
|
|
|
| builder.EndBody();
|
|
|
| @@ -3100,8 +3103,8 @@ void HGraph::InsertRepresentationChangeForUse(HValue* value,
|
| // change instructions for them.
|
| HInstruction* new_value = NULL;
|
| bool is_truncating = use_value->CheckFlag(HValue::kTruncatingToInt32);
|
| - bool deoptimize_on_undefined =
|
| - use_value->CheckFlag(HValue::kDeoptimizeOnUndefined);
|
| + bool allow_undefined_as_nan =
|
| + use_value->CheckFlag(HValue::kAllowUndefinedAsNaN);
|
| if (value->IsConstant()) {
|
| HConstant* constant = HConstant::cast(value);
|
| // Try to create a new copy of the constant with the new representation.
|
| @@ -3112,7 +3115,7 @@ void HGraph::InsertRepresentationChangeForUse(HValue* value,
|
|
|
| if (new_value == NULL) {
|
| new_value = new(zone()) HChange(value, to,
|
| - is_truncating, deoptimize_on_undefined);
|
| + is_truncating, allow_undefined_as_nan);
|
| }
|
|
|
| new_value->InsertBefore(next);
|
| @@ -3219,8 +3222,8 @@ void HGraph::InsertRepresentationChanges() {
|
|
|
|
|
| void HGraph::RecursivelyMarkPhiDeoptimizeOnUndefined(HPhi* phi) {
|
| - if (phi->CheckFlag(HValue::kDeoptimizeOnUndefined)) return;
|
| - phi->SetFlag(HValue::kDeoptimizeOnUndefined);
|
| + if (!phi->CheckFlag(HValue::kAllowUndefinedAsNaN)) return;
|
| + phi->ClearFlag(HValue::kAllowUndefinedAsNaN);
|
| for (int i = 0; i < phi->OperandCount(); ++i) {
|
| HValue* input = phi->OperandAt(i);
|
| if (input->IsPhi()) {
|
| @@ -3240,16 +3243,11 @@ void HGraph::MarkDeoptimizeOnUndefined() {
|
| // if one of its uses has this flag set.
|
| for (int i = 0; i < phi_list()->length(); i++) {
|
| HPhi* phi = phi_list()->at(i);
|
| - if (phi->representation().IsDouble()) {
|
| - for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) {
|
| - int use_index = it.index();
|
| - HValue* use_value = it.value();
|
| - Representation req = use_value->RequiredInputRepresentation(use_index);
|
| - if (!req.IsDouble() ||
|
| - use_value->CheckFlag(HValue::kDeoptimizeOnUndefined)) {
|
| - RecursivelyMarkPhiDeoptimizeOnUndefined(phi);
|
| - break;
|
| - }
|
| + for (HUseIterator it(phi->uses()); !it.Done(); it.Advance()) {
|
| + HValue* use_value = it.value();
|
| + if (!use_value->CheckFlag(HValue::kAllowUndefinedAsNaN)) {
|
| + RecursivelyMarkPhiDeoptimizeOnUndefined(phi);
|
| + break;
|
| }
|
| }
|
| }
|
| @@ -10109,7 +10107,7 @@ void HOptimizedGraphBuilder::BuildEmitFixedDoubleArray(
|
| boilerplate_elements, key_constant, NULL, kind, ALLOW_RETURN_HOLE));
|
| HInstruction* store = AddInstruction(new(zone) HStoreKeyed(
|
| object_elements, key_constant, value_instruction, kind));
|
| - store->ClearFlag(HValue::kDeoptimizeOnUndefined);
|
| + store->SetFlag(HValue::kAllowUndefinedAsNaN);
|
| }
|
| }
|
|
|
|
|