Index: src/hydrogen.cc |
diff --git a/src/hydrogen.cc b/src/hydrogen.cc |
index d9d1a68d0fb33db1086e4b2c8bab6a34c6c4ce53..5e36f68684f28e9556b8e90e2cbbc9d1253c36d4 100644 |
--- a/src/hydrogen.cc |
+++ b/src/hydrogen.cc |
@@ -887,6 +887,9 @@ HGraph* HGraphBuilder::CreateGraph() { |
HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
ASSERT(current_block() != NULL); |
current_block()->AddInstruction(instr); |
+ if (no_side_effects_scope_count_ > 0) { |
+ instr->SetFlag(HValue::kHasNoObservableSideEffects); |
+ } |
return instr; |
} |
@@ -894,6 +897,7 @@ HInstruction* HGraphBuilder::AddInstruction(HInstruction* instr) { |
void HGraphBuilder::AddSimulate(BailoutId id, |
RemovableSimulate removable) { |
ASSERT(current_block() != NULL); |
+ ASSERT(no_side_effects_scope_count_ == 0); |
current_block()->AddSimulate(id, removable); |
environment()->set_previous_ast_id(id); |
} |
@@ -1041,7 +1045,6 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
HValue* length, |
HValue* key, |
bool is_js_array) { |
- BailoutId ast_id = environment()->previous_ast_id(); |
Zone* zone = this->zone(); |
IfBuilder length_checker(this); |
@@ -1074,7 +1077,6 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
HAdd::New(zone, context, length, graph_->GetConstant1())); |
new_length->ChangeRepresentation(Representation::Integer32()); |
new_length->ClearFlag(HValue::kCanOverflow); |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
Factory* factory = isolate()->factory(); |
HInstruction* length_store = AddInstruction(new(zone) HStoreNamedField( |
@@ -1083,7 +1085,6 @@ HValue* HGraphBuilder::BuildCheckForCapacityGrow(HValue* object, |
new_length, true, |
JSArray::kLengthOffset)); |
length_store->SetGVNFlag(kChangesArrayLengths); |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
} |
length_checker.BeginElse(); |
@@ -1210,6 +1211,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
} |
if (IsGrowStoreMode(store_mode)) { |
+ NoObservableSideEffectsScope no_effects(this); |
+ |
elements = BuildCheckForCapacityGrow(object, elements, elements_kind, |
length, key, is_js_array); |
checked_key = key; |
@@ -1219,6 +1222,8 @@ HInstruction* HGraphBuilder::BuildUncheckedMonomorphicElementAccess( |
if (is_store && (fast_elements || fast_smi_only_elements)) { |
if (store_mode == STORE_NO_TRANSITION_HANDLE_COW) { |
+ NoObservableSideEffectsScope no_effects(this); |
+ |
elements = BuildCopyElementsOnWrite(object, elements, elements_kind, |
length); |
} else { |
@@ -1292,7 +1297,6 @@ void HGraphBuilder::BuildInitializeElements(HValue* elements, |
new(zone) HStoreNamedField(elements, fixed_array_length_field_name, |
capacity, true, FixedArray::kLengthOffset); |
AddInstruction(store_length); |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
} |
@@ -1317,7 +1321,6 @@ HInstruction* HGraphBuilder::BuildStoreMap(HValue* object, |
true, JSObject::kMapOffset); |
store_map->SetGVNFlag(kChangesMaps); |
AddInstruction(store_map); |
- AddSimulate(id, REMOVABLE_SIMULATE); |
return store_map; |
} |
@@ -1410,7 +1413,6 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* context, |
ElementsKind elements_kind, |
HValue* from, |
HValue* to) { |
- BailoutId ast_id = current_block()->last_environment()->previous_ast_id(); |
// Fast elements kinds need to be initialized in case statements below cause |
// a garbage collection. |
Factory* factory = isolate()->factory(); |
@@ -1428,7 +1430,6 @@ void HGraphBuilder::BuildFillElementsWithHole(HValue* context, |
HValue* key = builder.BeginBody(from, to, Token::LT); |
AddInstruction(new(zone) HStoreKeyed(elements, key, hole, elements_kind)); |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
builder.EndBody(); |
} |
@@ -1441,7 +1442,6 @@ void HGraphBuilder::BuildCopyElements(HValue* context, |
ElementsKind to_elements_kind, |
HValue* length, |
HValue* capacity) { |
- BailoutId ast_id = environment()->previous_ast_id(); |
bool pre_fill_with_holes = |
IsFastDoubleElementsKind(from_elements_kind) && |
IsFastObjectElementsKind(to_elements_kind); |
@@ -1465,7 +1465,6 @@ void HGraphBuilder::BuildCopyElements(HValue* context, |
AddInstruction(new(zone()) HStoreKeyed(to_elements, key, element, |
to_elements_kind)); |
- AddSimulate(ast_id, REMOVABLE_SIMULATE); |
builder.EndBody(); |
@@ -1486,6 +1485,8 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
Zone* zone = this->zone(); |
Factory* factory = isolate()->factory(); |
+ NoObservableSideEffectsScope no_effects(this); |
+ |
// All sizes here are multiples of kPointerSize. |
int size = JSArray::kSize; |
if (mode == TRACK_ALLOCATION_SITE) { |
@@ -1524,7 +1525,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
factory->empty_string(), |
value, |
true, i)); |
- AddSimulate(id); |
} else { |
BuildStoreMap(object, value, id); |
} |
@@ -1542,7 +1542,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
factory->empty_string(), |
boilerplate, |
true, alloc_payload_offset)); |
- AddSimulate(id); |
} |
if (length > 0) { |
@@ -1556,7 +1555,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
factory->elements_field_string(), |
object_elements, |
true, JSObject::kElementsOffset)); |
- AddSimulate(id); |
// Copy the elements array header. |
for (int i = 0; i < FixedArrayBase::kHeaderSize; i += kPointerSize) { |
@@ -1567,7 +1565,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
factory->empty_string(), |
value, |
true, i)); |
- AddSimulate(id); |
} |
// Copy the elements array contents. |
@@ -1586,7 +1583,6 @@ HValue* HGraphBuilder::BuildCloneShallowArray(HContext* context, |
key_constant, |
value, |
kind)); |
- AddSimulate(id); |
} |
} |
@@ -10099,6 +10095,8 @@ HInstruction* HOptimizedGraphBuilder::BuildFastLiteral( |
BailoutId id) { |
Zone* zone = this->zone(); |
+ NoObservableSideEffectsScope no_effects(this); |
+ |
HValue* size_in_bytes = |
AddInstruction(new(zone) HConstant(size, Representation::Integer32())); |
HInstruction* result = |
@@ -10172,7 +10170,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
AddInstruction(new(zone) HStoreNamedField( |
object_properties, factory->unknown_field_string(), value_instruction, |
true, boilerplate_object->GetInObjectPropertyOffset(i))); |
- AddSimulate(id); |
BuildEmitDeepCopy(value_object, original_value_object, target, |
offset, DONT_TRACK_ALLOCATION_SITE, id); |
} else { |
@@ -10181,7 +10178,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
AddInstruction(new(zone) HStoreNamedField( |
object_properties, factory->unknown_field_string(), value_instruction, |
true, boilerplate_object->GetInObjectPropertyOffset(i))); |
- AddSimulate(id); |
} |
} |
@@ -10196,7 +10192,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
factory->payload_string(), |
original_boilerplate, |
true, alloc_payload_offset)); |
- AddSimulate(id); |
} |
if (object_elements != NULL) { |
@@ -10220,7 +10215,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
boilerplate_elements, key_constant, NULL, kind)); |
AddInstruction(new(zone) HStoreKeyed( |
object_elements, key_constant, value_instruction, kind)); |
- AddSimulate(id); |
} |
} else if (elements->IsFixedArray()) { |
Handle<FixedArray> fast_elements = Handle<FixedArray>::cast(elements); |
@@ -10238,7 +10232,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
AddInstruction(new(zone) HInnerAllocatedObject(target, *offset)); |
AddInstruction(new(zone) HStoreKeyed( |
object_elements, key_constant, value_instruction, kind)); |
- AddSimulate(id); |
BuildEmitDeepCopy(value_object, original_value_object, target, |
offset, DONT_TRACK_ALLOCATION_SITE, id); |
} else { |
@@ -10247,7 +10240,6 @@ void HOptimizedGraphBuilder::BuildEmitDeepCopy( |
boilerplate_elements, key_constant, NULL, kind)); |
AddInstruction(new(zone) HStoreKeyed( |
object_elements, key_constant, value_instruction, kind)); |
- AddSimulate(id); |
} |
} |
} else { |
@@ -10291,7 +10283,6 @@ HValue* HOptimizedGraphBuilder::BuildCopyObjectHeader( |
elements, |
true, JSObject::kElementsOffset)); |
elements_store->SetGVNFlag(kChangesElementsPointer); |
- AddSimulate(id); |
Handle<Object> properties_field = |
Handle<Object>(boilerplate_object->properties(), isolate()); |
@@ -10302,7 +10293,6 @@ HValue* HOptimizedGraphBuilder::BuildCopyObjectHeader( |
factory->empty_string(), |
properties, |
true, JSObject::kPropertiesOffset)); |
- AddSimulate(id); |
if (boilerplate_object->IsJSArray()) { |
Handle<JSArray> boilerplate_array = |
@@ -10317,7 +10307,6 @@ HValue* HOptimizedGraphBuilder::BuildCopyObjectHeader( |
length, |
true, JSArray::kLengthOffset)); |
length_store->SetGVNFlag(kChangesArrayLengths); |
- AddSimulate(id); |
} |
return result; |