Chromium Code Reviews| Index: src/hydrogen.cc |
| diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
| index 3698a322c046681ec8471a14fa3db2110a8b678a..d1694a49ffa32c6e3d2642bd69607d0f27c1d2af 100644 |
| --- a/src/hydrogen.cc |
| +++ b/src/hydrogen.cc |
| @@ -1199,7 +1199,7 @@ void HGraphBuilder::AddIncrementCounter(StatsCounter* counter) { |
| HValue* new_value = AddUncasted<HAdd>(old_value, graph()->GetConstant1()); |
| new_value->ClearFlag(HValue::kCanOverflow); // Ignore counter overflow |
| Add<HStoreNamedField>(reference, HObjectAccess::ForCounter(), |
| - new_value); |
| + new_value, STORE_TO_INITIALIZED_ENTRY); |
|
Igor Sheludko
2014/01/27 15:14:16
The counter should have been already initialized.
|
| } |
| } |
| @@ -1337,7 +1337,7 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
| new_length->ClearFlag(HValue::kCanOverflow); |
| Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength(kind), |
| - new_length); |
| + new_length, INITIALIZING_STORE); |
| } |
| if (is_store && kind == FAST_SMI_ELEMENTS) { |
| @@ -1421,7 +1421,8 @@ void HGraphBuilder::BuildTransitionElementsKind(HValue* object, |
| if_builder.End(); |
| } |
| - Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map); |
| + Add<HStoreNamedField>(object, HObjectAccess::ForMap(), map, |
| + INITIALIZING_STORE); |
| } |
| @@ -1808,10 +1809,14 @@ HValue* HGraphBuilder::BuildCreateConsString( |
| // Initialize the cons string fields. |
| Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), |
| - Add<HConstant>(String::kEmptyHashField)); |
| - Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); |
| - Add<HStoreNamedField>(result, HObjectAccess::ForConsStringFirst(), left); |
| - Add<HStoreNamedField>(result, HObjectAccess::ForConsStringSecond(), right); |
| + Add<HConstant>(String::kEmptyHashField), |
| + INITIALIZING_STORE); |
| + Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length, |
| + INITIALIZING_STORE); |
| + Add<HStoreNamedField>(result, HObjectAccess::ForConsStringFirst(), left, |
| + INITIALIZING_STORE); |
| + Add<HStoreNamedField>(result, HObjectAccess::ForConsStringSecond(), right, |
| + INITIALIZING_STORE); |
| // Count the native string addition. |
| AddIncrementCounter(isolate()->counters()->string_add_native()); |
| @@ -1960,8 +1965,10 @@ HValue* HGraphBuilder::BuildUncheckedStringAdd( |
| // Initialize the string fields. |
| Add<HStoreNamedField>(result, HObjectAccess::ForStringHashField(), |
| - Add<HConstant>(String::kEmptyHashField)); |
| - Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length); |
| + Add<HConstant>(String::kEmptyHashField), |
| + INITIALIZING_STORE); |
| + Add<HStoreNamedField>(result, HObjectAccess::ForStringLength(), length, |
| + INITIALIZING_STORE); |
| // Copy characters to the result string. |
| IfBuilder if_twobyte(this); |
| @@ -2258,7 +2265,7 @@ void HGraphBuilder::BuildInitializeElementsHeader(HValue* elements, |
| AddStoreMapConstant(elements, map); |
| Add<HStoreNamedField>(elements, HObjectAccess::ForFixedArrayLength(), |
| - capacity); |
| + capacity, INITIALIZING_STORE); |
| } |
| @@ -2281,15 +2288,16 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
| HValue* allocation_site_payload, |
| HValue* length_field) { |
| - Add<HStoreNamedField>(array, HObjectAccess::ForMap(), array_map); |
| + Add<HStoreNamedField>(array, HObjectAccess::ForMap(), array_map, |
| + INITIALIZING_STORE); |
| HConstant* empty_fixed_array = |
| Add<HConstant>(isolate()->factory()->empty_fixed_array()); |
| HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
| - Add<HStoreNamedField>(array, access, empty_fixed_array); |
| + Add<HStoreNamedField>(array, access, empty_fixed_array, INITIALIZING_STORE); |
| Add<HStoreNamedField>(array, HObjectAccess::ForArrayLength(elements_kind), |
| - length_field); |
| + length_field, INITIALIZING_STORE); |
| if (mode == TRACK_ALLOCATION_SITE) { |
| BuildCreateAllocationMemento( |
| @@ -2303,7 +2311,8 @@ HInnerAllocatedObject* HGraphBuilder::BuildJSArrayHeader(HValue* array, |
| HInnerAllocatedObject* elements = Add<HInnerAllocatedObject>( |
| array, Add<HConstant>(elements_location)); |
| - Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements); |
| + Add<HStoreNamedField>(array, HObjectAccess::ForElementsPointer(), elements, |
| + INITIALIZING_STORE); |
| return elements; |
| } |
| @@ -2394,7 +2403,7 @@ HValue* HGraphBuilder::BuildGrowElementsCapacity(HValue* object, |
| length, new_capacity); |
| Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| - new_elements); |
| + new_elements, INITIALIZING_STORE); |
| return new_elements; |
| } |
| @@ -2435,14 +2444,15 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* elements, |
| if (initial_capacity >= 0) { |
| for (int i = 0; i < initial_capacity; i++) { |
| HInstruction* key = Add<HConstant>(i); |
| - Add<HStoreKeyed>(elements, key, hole, elements_kind); |
| + Add<HStoreKeyed>(elements, key, hole, elements_kind, |
| + PREINITIALIZING_STORE); |
| } |
| } else { |
| LoopBuilder builder(this, context(), LoopBuilder::kPostIncrement); |
| HValue* key = builder.BeginBody(from, to, Token::LT); |
| - Add<HStoreKeyed>(elements, key, hole, elements_kind); |
| + Add<HStoreKeyed>(elements, key, hole, elements_kind, PREINITIALIZING_STORE); |
| builder.EndBody(); |
| } |
| @@ -2532,7 +2542,8 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HValue* boilerplate, |
| if ((i != JSArray::kElementsOffset) || (length == 0)) { |
| HObjectAccess access = HObjectAccess::ForJSArrayOffset(i); |
| Add<HStoreNamedField>(object, access, |
| - Add<HLoadNamedField>(boilerplate, access)); |
| + Add<HLoadNamedField>(boilerplate, access), |
| + INITIALIZING_STORE); |
| } |
| } |
| @@ -2555,13 +2566,14 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HValue* boilerplate, |
| NOT_TENURED, FIXED_ARRAY_TYPE); |
| } |
| Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| - object_elements); |
| + object_elements, INITIALIZING_STORE); |
| // Copy the elements array header. |
| for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { |
| HObjectAccess access = HObjectAccess::ForFixedArrayHeader(i); |
| Add<HStoreNamedField>(object_elements, access, |
| - Add<HLoadNamedField>(boilerplate_elements, access)); |
| + Add<HLoadNamedField>(boilerplate_elements, access), |
| + INITIALIZING_STORE); |
| } |
| // Copy the elements array contents. |
| @@ -2642,9 +2654,8 @@ void HGraphBuilder::BuildCreateAllocationMemento( |
| AddStoreMapConstant( |
| allocation_memento, isolate()->factory()->allocation_memento_map()); |
| Add<HStoreNamedField>( |
| - allocation_memento, |
| - HObjectAccess::ForAllocationMementoSite(), |
| - allocation_site); |
| + allocation_memento, HObjectAccess::ForAllocationMementoSite(), |
| + allocation_site, INITIALIZING_STORE); |
| if (FLAG_allocation_site_pretenuring) { |
| HValue* memento_create_count = Add<HLoadNamedField>( |
| allocation_site, HObjectAccess::ForAllocationSiteOffset( |
| @@ -2656,7 +2667,8 @@ void HGraphBuilder::BuildCreateAllocationMemento( |
| memento_create_count->ClearFlag(HValue::kCanOverflow); |
| HStoreNamedField* store = Add<HStoreNamedField>( |
| allocation_site, HObjectAccess::ForAllocationSiteOffset( |
| - AllocationSite::kPretenureCreateCountOffset), memento_create_count); |
| + AllocationSite::kPretenureCreateCountOffset), memento_create_count, |
| + INITIALIZING_STORE); |
| // No write barrier needed to store a smi. |
| store->SkipWriteBarrier(); |
| } |
| @@ -2871,7 +2883,7 @@ HValue* HGraphBuilder::JSArrayBuilder::AllocateArray(HValue* size_in_bytes, |
| HStoreNamedField* HGraphBuilder::AddStoreMapConstant(HValue *object, |
| Handle<Map> map) { |
| return Add<HStoreNamedField>(object, HObjectAccess::ForMap(), |
| - Add<HConstant>(map)); |
| + Add<HConstant>(map), INITIALIZING_STORE); |
| } |
| @@ -5263,10 +5275,10 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
| HEAP_NUMBER_TYPE); |
| AddStoreMapConstant(heap_number, isolate()->factory()->heap_number_map()); |
| Add<HStoreNamedField>(heap_number, HObjectAccess::ForHeapNumberValue(), |
| - value); |
| + value, INITIALIZING_STORE); |
| instr = New<HStoreNamedField>(checked_object->ActualValue(), |
| heap_number_access, |
| - heap_number); |
| + heap_number, INITIALIZING_STORE); |
| } else { |
| // Already holds a HeapNumber; load the box and write its value field. |
| HInstruction* heap_number = Add<HLoadNamedField>(checked_object, |
| @@ -5274,7 +5286,7 @@ HInstruction* HOptimizedGraphBuilder::BuildStoreNamedField( |
| heap_number->set_type(HType::HeapNumber()); |
| instr = New<HStoreNamedField>(heap_number, |
| HObjectAccess::ForHeapNumberValue(), |
| - value); |
| + value, STORE_TO_INITIALIZED_ENTRY); |
|
Igor Sheludko
2014/01/27 15:14:16
The heap number should have been initialized when
|
| } |
| } else { |
| // This is a normal store. |
| @@ -7654,7 +7666,7 @@ bool HOptimizedGraphBuilder::TryInlineBuiltinMethodCall( |
| } |
| Add<HStoreNamedField>( |
| checked_object, HObjectAccess::ForArrayLength(elements_kind), |
| - reduced_length); |
| + reduced_length, STORE_TO_INITIALIZED_ENTRY); |
|
Igor Sheludko
2014/01/27 15:14:16
The array length should have been initialized earl
|
| if (!ast_context()->IsEffect()) Push(result); |
| Add<HSimulate>(expr->id(), REMOVABLE_SIMULATE); |
| if (!ast_context()->IsEffect()) Drop(1); |
| @@ -8192,21 +8204,21 @@ void HOptimizedGraphBuilder::VisitCallNew(CallNew* expr) { |
| ASSERT(initial_map->instance_type() == JS_OBJECT_TYPE); |
| Add<HStoreNamedField>(receiver, |
| HObjectAccess::ForJSObjectOffset(JSObject::kMapOffset), |
| - initial_map_value); |
| + initial_map_value, INITIALIZING_STORE); |
| HValue* empty_fixed_array = Add<HConstant>(factory->empty_fixed_array()); |
| Add<HStoreNamedField>(receiver, |
| HObjectAccess::ForJSObjectOffset(JSObject::kPropertiesOffset), |
| - empty_fixed_array); |
| + empty_fixed_array, INITIALIZING_STORE); |
| Add<HStoreNamedField>(receiver, |
| HObjectAccess::ForJSObjectOffset(JSObject::kElementsOffset), |
| - empty_fixed_array); |
| + empty_fixed_array, INITIALIZING_STORE); |
| if (initial_map->inobject_properties() != 0) { |
| HConstant* undefined = graph()->GetConstantUndefined(); |
| for (int i = 0; i < initial_map->inobject_properties(); i++) { |
| int property_offset = JSObject::kHeaderSize + i * kPointerSize; |
| Add<HStoreNamedField>(receiver, |
| HObjectAccess::ForJSObjectOffset(property_offset), |
| - undefined); |
| + undefined, PREINITIALIZING_STORE); |
| } |
| } |
| } |
| @@ -8291,27 +8303,29 @@ void HGraphBuilder::BuildArrayBufferViewInitialization( |
| offset += kPointerSize) { |
| Add<HStoreNamedField>(obj, |
| HObjectAccess::ForJSObjectOffset(offset), |
| - Add<HConstant>(static_cast<int32_t>(0))); |
| + graph()->GetConstant0(), INITIALIZING_STORE); |
| } |
| Add<HStoreNamedField>( |
| obj, |
| - HObjectAccess::ForJSArrayBufferViewBuffer(), buffer); |
| + HObjectAccess::ForJSArrayBufferViewBuffer(), buffer, INITIALIZING_STORE); |
| Add<HStoreNamedField>( |
| obj, |
| HObjectAccess::ForJSArrayBufferViewByteOffset(), |
| - byte_offset); |
| + byte_offset, INITIALIZING_STORE); |
| Add<HStoreNamedField>( |
| obj, |
| HObjectAccess::ForJSArrayBufferViewByteLength(), |
| - byte_length); |
| + byte_length, INITIALIZING_STORE); |
| HObjectAccess weak_first_view_access = |
| HObjectAccess::ForJSArrayBufferWeakFirstView(); |
| Add<HStoreNamedField>(obj, |
| HObjectAccess::ForJSArrayBufferViewWeakNext(), |
| - Add<HLoadNamedField>(buffer, weak_first_view_access)); |
| - Add<HStoreNamedField>(buffer, weak_first_view_access, obj); |
| + Add<HLoadNamedField>(buffer, weak_first_view_access), |
| + INITIALIZING_STORE); |
| + Add<HStoreNamedField>( |
| + buffer, weak_first_view_access, obj, INITIALIZING_STORE); |
| } |
| @@ -8401,7 +8415,7 @@ void HOptimizedGraphBuilder::VisitTypedArrayInitialize( |
| Add<HStoreNamedField>(obj, |
| HObjectAccess::ForJSTypedArrayLength(), |
| - length); |
| + length, INITIALIZING_STORE); |
| HValue* elements = |
| Add<HAllocate>( |
| @@ -8412,9 +8426,7 @@ void HOptimizedGraphBuilder::VisitTypedArrayInitialize( |
| Handle<Map> external_array_map( |
| isolate()->heap()->MapForExternalArrayType(array_type)); |
| - Add<HStoreNamedField>(elements, |
| - HObjectAccess::ForMap(), |
| - Add<HConstant>(external_array_map)); |
| + AddStoreMapConstant(elements, external_array_map); |
| HValue* backing_store = Add<HLoadNamedField>( |
| buffer, HObjectAccess::ForJSArrayBufferBackingStore()); |
| @@ -8431,14 +8443,14 @@ void HOptimizedGraphBuilder::VisitTypedArrayInitialize( |
| typed_array_start = external_pointer; |
| } |
| - Add<HStoreNamedField>(elements, |
| - HObjectAccess::ForExternalArrayExternalPointer(), |
| - typed_array_start); |
| - Add<HStoreNamedField>(elements, |
| - HObjectAccess::ForFixedArrayLength(), |
| - length); |
| Add<HStoreNamedField>( |
| - obj, HObjectAccess::ForElementsPointer(), elements); |
| + elements, HObjectAccess::ForExternalArrayExternalPointer(), |
| + typed_array_start, INITIALIZING_STORE); |
| + Add<HStoreNamedField>( |
| + elements, HObjectAccess::ForFixedArrayLength(), length, |
| + INITIALIZING_STORE); |
| + Add<HStoreNamedField>( |
| + obj, HObjectAccess::ForElementsPointer(), elements, INITIALIZING_STORE); |
| } |
| if (!is_zero_byte_offset) { |
| @@ -9675,7 +9687,7 @@ void HOptimizedGraphBuilder::BuildEmitObjectHeader( |
| ASSERT(*properties_field == isolate()->heap()->empty_fixed_array()); |
| HInstruction* properties = Add<HConstant>(properties_field); |
| HObjectAccess access = HObjectAccess::ForPropertiesPointer(); |
| - Add<HStoreNamedField>(object, access, properties); |
| + Add<HStoreNamedField>(object, access, properties, INITIALIZING_STORE); |
| if (boilerplate_object->IsJSArray()) { |
| Handle<JSArray> boilerplate_array = |
| @@ -9686,7 +9698,7 @@ void HOptimizedGraphBuilder::BuildEmitObjectHeader( |
| ASSERT(boilerplate_array->length()->IsSmi()); |
| Add<HStoreNamedField>(object, HObjectAccess::ForArrayLength( |
| - boilerplate_array->GetElementsKind()), length); |
| + boilerplate_array->GetElementsKind()), length, INITIALIZING_STORE); |
| } |
| } |
| @@ -9702,7 +9714,7 @@ void HOptimizedGraphBuilder::BuildInitElementsInObjectHeader( |
| object_elements = Add<HConstant>(elements_field); |
| } |
| Add<HStoreNamedField>(object, HObjectAccess::ForElementsPointer(), |
| - object_elements); |
| + object_elements, INITIALIZING_STORE); |
| } |
| @@ -9738,7 +9750,7 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| HInstruction* result = |
| BuildFastLiteral(value_object, site_context); |
| site_context->ExitScope(current_site, value_object); |
| - Add<HStoreNamedField>(object, access, result); |
| + Add<HStoreNamedField>(object, access, result, INITIALIZING_STORE); |
| } else { |
| Representation representation = details.representation(); |
| HInstruction* value_instruction; |
| @@ -9756,7 +9768,7 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| AddStoreMapConstant(double_box, |
| isolate()->factory()->heap_number_map()); |
| Add<HStoreNamedField>(double_box, HObjectAccess::ForHeapNumberValue(), |
| - Add<HConstant>(value)); |
| + Add<HConstant>(value), INITIALIZING_STORE); |
| value_instruction = double_box; |
| } else if (representation.IsSmi() && value->IsUninitialized()) { |
| value_instruction = graph()->GetConstant0(); |
| @@ -9764,7 +9776,8 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| value_instruction = Add<HConstant>(value); |
| } |
| - Add<HStoreNamedField>(object, access, value_instruction); |
| + Add<HStoreNamedField>(object, access, value_instruction, |
| + INITIALIZING_STORE); |
| } |
| } |
| @@ -9775,7 +9788,8 @@ void HOptimizedGraphBuilder::BuildEmitInObjectProperties( |
| ASSERT(boilerplate_object->IsJSObject()); |
| int property_offset = boilerplate_object->GetInObjectPropertyOffset(i); |
| HObjectAccess access = HObjectAccess::ForJSObjectOffset(property_offset); |
| - Add<HStoreNamedField>(object, access, value_instruction); |
| + Add<HStoreNamedField>(object, access, value_instruction, |
| + PREINITIALIZING_STORE); |
|
Igor Sheludko
2014/01/27 15:14:16
It seems that we are initializing data "outside" o
|
| } |
| } |
| @@ -10228,7 +10242,8 @@ void HOptimizedGraphBuilder::GenerateSetValueOf(CallRuntime* call) { |
| // Create in-object property store to kValueOffset. |
| set_current_block(if_js_value); |
| Add<HStoreNamedField>(object, |
| - HObjectAccess::ForJSObjectOffset(JSValue::kValueOffset), value); |
| + HObjectAccess::ForJSObjectOffset(JSValue::kValueOffset), value, |
| + INITIALIZING_STORE); |
| Goto(if_js_value, join); |
| join->SetJoinId(call->id()); |
| set_current_block(join); |