| Index: src/hydrogen.cc
|
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc
|
| index 38ed57503aa6f07292186700b5a3e4abeee741fd..a41be5e6b47624238e6383126ac8473f9f447527 100644
|
| --- a/src/hydrogen.cc
|
| +++ b/src/hydrogen.cc
|
| @@ -1310,9 +1310,9 @@ HValue* HGraphBuilder::BuildLookupNumberStringCache(
|
|
|
| // Load the key.
|
| HValue* key_index = Add<HShl>(hash, graph()->GetConstant1());
|
| - HValue* key = AddFastElementAccess(number_string_cache, key_index,
|
| - NULL, NULL, FAST_ELEMENTS, false,
|
| - ALLOW_RETURN_HOLE, STANDARD_STORE);
|
| + HValue* key = Add<HLoadKeyed>(number_string_cache, key_index,
|
| + static_cast<HValue*>(NULL),
|
| + FAST_ELEMENTS, ALLOW_RETURN_HOLE);
|
|
|
| // Check if object == key.
|
| IfBuilder if_objectiskey(this);
|
| @@ -1342,9 +1342,9 @@ HValue* HGraphBuilder::BuildLookupNumberStringCache(
|
|
|
| // Load the key.
|
| HValue* key_index = Add<HShl>(hash, graph()->GetConstant1());
|
| - HValue* key = AddFastElementAccess(number_string_cache, key_index,
|
| - NULL, NULL, FAST_ELEMENTS, false,
|
| - ALLOW_RETURN_HOLE, STANDARD_STORE);
|
| + HValue* key = Add<HLoadKeyed>(number_string_cache, key_index,
|
| + static_cast<HValue*>(NULL),
|
| + FAST_ELEMENTS, ALLOW_RETURN_HOLE);
|
|
|
| // Check if key is a heap number.
|
| IfBuilder if_keyisnumber(this);
|
| @@ -1379,9 +1379,9 @@ HValue* HGraphBuilder::BuildLookupNumberStringCache(
|
| // Load the value in case of cache hit.
|
| HValue* key_index = Pop();
|
| HValue* value_index = Add<HAdd>(key_index, graph()->GetConstant1());
|
| - HValue* value = AddFastElementAccess(number_string_cache, value_index,
|
| - NULL, NULL, FAST_ELEMENTS, false,
|
| - ALLOW_RETURN_HOLE, STANDARD_STORE);
|
| + HValue* value = Add<HLoadKeyed>(number_string_cache, value_index,
|
| + static_cast<HValue*>(NULL),
|
| + FAST_ELEMENTS, ALLOW_RETURN_HOLE);
|
| AddIncrementCounter(isolate()->counters()->number_to_string_native());
|
|
|
| if_found.CaptureContinuation(continuation);
|
| @@ -1469,7 +1469,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
|
| HValue* bounds_check = negative_checker.If<HCompareNumericAndBranch>(
|
| key, graph()->GetConstant0(), Token::GTE);
|
| negative_checker.Then();
|
| - HInstruction* result = AddExternalArrayElementAccess(
|
| + HInstruction* result = AddElementAccess(
|
| external_elements, key, val, bounds_check, elements_kind, is_store);
|
| negative_checker.ElseDeopt("Negative key encountered");
|
| length_checker.End();
|
| @@ -1479,7 +1479,7 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
|
| checked_key = Add<HBoundsCheck>(key, length);
|
| HLoadExternalArrayPointer* external_elements =
|
| Add<HLoadExternalArrayPointer>(elements);
|
| - return AddExternalArrayElementAccess(
|
| + return AddElementAccess(
|
| external_elements, checked_key, val,
|
| checked_object, elements_kind, is_store);
|
| }
|
| @@ -1512,14 +1512,13 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess(
|
| elements_kind, length);
|
| } else {
|
| HCheckMaps* check_cow_map = Add<HCheckMaps>(
|
| - elements, isolate()->factory()->fixed_array_map(),
|
| - top_info());
|
| + elements, isolate()->factory()->fixed_array_map(), top_info());
|
| check_cow_map->ClearGVNFlag(kDependsOnElementsKind);
|
| }
|
| }
|
| }
|
| - return AddFastElementAccess(elements, checked_key, val, checked_object,
|
| - elements_kind, is_store, load_mode, store_mode);
|
| + return AddElementAccess(elements, checked_key, val, checked_object,
|
| + elements_kind, is_store, load_mode);
|
| }
|
|
|
|
|
| @@ -1609,85 +1608,31 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array,
|
| }
|
|
|
|
|
| -HInstruction* HGraphBuilder::AddExternalArrayElementAccess(
|
| - HValue* external_elements,
|
| +HInstruction* HGraphBuilder::AddElementAccess(
|
| + HValue* elements,
|
| HValue* checked_key,
|
| HValue* val,
|
| HValue* dependency,
|
| ElementsKind elements_kind,
|
| - bool is_store) {
|
| + bool is_store,
|
| + LoadKeyedHoleMode load_mode) {
|
| if (is_store) {
|
| ASSERT(val != NULL);
|
| - switch (elements_kind) {
|
| - case EXTERNAL_PIXEL_ELEMENTS: {
|
| - val = Add<HClampToUint8>(val);
|
| - break;
|
| - }
|
| - case EXTERNAL_BYTE_ELEMENTS:
|
| - case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
|
| - case EXTERNAL_SHORT_ELEMENTS:
|
| - case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
|
| - case EXTERNAL_INT_ELEMENTS:
|
| - case EXTERNAL_UNSIGNED_INT_ELEMENTS: {
|
| - break;
|
| - }
|
| - case EXTERNAL_FLOAT_ELEMENTS:
|
| - case EXTERNAL_DOUBLE_ELEMENTS:
|
| - break;
|
| - case FAST_SMI_ELEMENTS:
|
| - case FAST_ELEMENTS:
|
| - case FAST_DOUBLE_ELEMENTS:
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_HOLEY_ELEMENTS:
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| - case DICTIONARY_ELEMENTS:
|
| - case NON_STRICT_ARGUMENTS_ELEMENTS:
|
| - UNREACHABLE();
|
| - break;
|
| + if (elements_kind == EXTERNAL_PIXEL_ELEMENTS) {
|
| + val = Add<HClampToUint8>(val);
|
| }
|
| - return Add<HStoreKeyed>(external_elements, checked_key, val, elements_kind);
|
| - } else {
|
| - ASSERT(val == NULL);
|
| - HLoadKeyed* load = Add<HLoadKeyed>(external_elements,
|
| - checked_key,
|
| - dependency,
|
| - elements_kind);
|
| - if (FLAG_opt_safe_uint32_operations &&
|
| - elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) {
|
| - graph()->RecordUint32Instruction(load);
|
| - }
|
| - return load;
|
| + return Add<HStoreKeyed>(elements, checked_key, val, elements_kind);
|
| }
|
| -}
|
|
|
| -
|
| -HInstruction* HGraphBuilder::AddFastElementAccess(
|
| - HValue* elements,
|
| - HValue* checked_key,
|
| - HValue* val,
|
| - HValue* load_dependency,
|
| - ElementsKind elements_kind,
|
| - bool is_store,
|
| - LoadKeyedHoleMode load_mode,
|
| - KeyedAccessStoreMode store_mode) {
|
| - if (is_store) {
|
| - ASSERT(val != NULL);
|
| - switch (elements_kind) {
|
| - case FAST_SMI_ELEMENTS:
|
| - case FAST_HOLEY_SMI_ELEMENTS:
|
| - case FAST_ELEMENTS:
|
| - case FAST_HOLEY_ELEMENTS:
|
| - case FAST_DOUBLE_ELEMENTS:
|
| - case FAST_HOLEY_DOUBLE_ELEMENTS:
|
| - return Add<HStoreKeyed>(elements, checked_key, val, elements_kind);
|
| - default:
|
| - UNREACHABLE();
|
| - return NULL;
|
| - }
|
| + ASSERT(!is_store);
|
| + ASSERT(val == NULL);
|
| + HLoadKeyed* load = Add<HLoadKeyed>(
|
| + elements, checked_key, dependency, elements_kind, load_mode);
|
| + if (FLAG_opt_safe_uint32_operations &&
|
| + elements_kind == EXTERNAL_UNSIGNED_INT_ELEMENTS) {
|
| + graph()->RecordUint32Instruction(load);
|
| }
|
| - // It's an element load (!is_store).
|
| - return Add<HLoadKeyed>(
|
| - elements, checked_key, load_dependency, elements_kind, load_mode);
|
| + return load;
|
| }
|
|
|
|
|
| @@ -5126,8 +5071,7 @@ void HOptimizedGraphBuilder::BuildStore(Expression* expr,
|
| HValue* key = environment()->ExpressionStackAt(1);
|
| HValue* object = environment()->ExpressionStackAt(2);
|
| bool has_side_effects = false;
|
| - HandleKeyedElementAccess(object, key, value, expr, return_id,
|
| - expr->position(),
|
| + HandleKeyedElementAccess(object, key, value, expr, expr->position(),
|
| true, // is_store
|
| &has_side_effects);
|
| Drop(3);
|
| @@ -5676,7 +5620,6 @@ HValue* HOptimizedGraphBuilder::HandlePolymorphicElementAccess(
|
| HValue* key,
|
| HValue* val,
|
| SmallMapList* maps,
|
| - BailoutId ast_id,
|
| int position,
|
| bool is_store,
|
| KeyedAccessStoreMode store_mode,
|
| @@ -5808,7 +5751,6 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
|
| HValue* key,
|
| HValue* val,
|
| Expression* expr,
|
| - BailoutId ast_id,
|
| int position,
|
| bool is_store,
|
| bool* has_side_effects) {
|
| @@ -5831,7 +5773,7 @@ HValue* HOptimizedGraphBuilder::HandleKeyedElementAccess(
|
| }
|
| } else if (types != NULL && !types->is_empty()) {
|
| return HandlePolymorphicElementAccess(
|
| - obj, key, val, types, ast_id, position, is_store,
|
| + obj, key, val, types, position, is_store,
|
| expr->GetStoreMode(), has_side_effects);
|
| } else {
|
| if (is_store) {
|
| @@ -6020,7 +5962,7 @@ void HOptimizedGraphBuilder::BuildLoad(Property* expr,
|
|
|
| bool has_side_effects = false;
|
| HValue* load = HandleKeyedElementAccess(
|
| - obj, key, NULL, expr, ast_id, position,
|
| + obj, key, NULL, expr, position,
|
| false, // is_store
|
| &has_side_effects);
|
| if (has_side_effects) {
|
|
|