Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(4)

Side by Side Diff: src/hydrogen.cc

Issue 137863005: Revert "Use stability to only conditionally flush information from the CheckMaps table." (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 6 years, 10 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View unified diff | Download patch | Annotate | Revision Log
« no previous file with comments | « src/compiler.cc ('k') | src/hydrogen-check-elimination.cc » ('j') | no next file with comments »
Toggle Intra-line Diffs ('i') | Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
OLDNEW
1 // Copyright 2013 the V8 project authors. All rights reserved. 1 // Copyright 2013 the V8 project authors. All rights reserved.
2 // Redistribution and use in source and binary forms, with or without 2 // Redistribution and use in source and binary forms, with or without
3 // modification, are permitted provided that the following conditions are 3 // modification, are permitted provided that the following conditions are
4 // met: 4 // met:
5 // 5 //
6 // * Redistributions of source code must retain the above copyright 6 // * Redistributions of source code must retain the above copyright
7 // notice, this list of conditions and the following disclaimer. 7 // notice, this list of conditions and the following disclaimer.
8 // * Redistributions in binary form must reproduce the above 8 // * Redistributions in binary form must reproduce the above
9 // copyright notice, this list of conditions and the following 9 // copyright notice, this list of conditions and the following
10 // disclaimer in the documentation and/or other materials provided 10 // disclaimer in the documentation and/or other materials provided
(...skipping 1372 matching lines...) Expand 10 before | Expand all | Expand 10 after
1383 1383
1384 1384
1385 HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object, 1385 HValue* HGraphBuilder::BuildCopyElementsOnWrite(HValue* object,
1386 HValue* elements, 1386 HValue* elements,
1387 ElementsKind kind, 1387 ElementsKind kind,
1388 HValue* length) { 1388 HValue* length) {
1389 Factory* factory = isolate()->factory(); 1389 Factory* factory = isolate()->factory();
1390 1390
1391 IfBuilder cow_checker(this); 1391 IfBuilder cow_checker(this);
1392 1392
1393 cow_checker.If<HCompareMap>( 1393 cow_checker.If<HCompareMap>(elements, factory->fixed_cow_array_map());
1394 elements, factory->fixed_cow_array_map(), top_info());
1395 cow_checker.Then(); 1394 cow_checker.Then();
1396 1395
1397 HValue* capacity = AddLoadFixedArrayLength(elements); 1396 HValue* capacity = AddLoadFixedArrayLength(elements);
1398 1397
1399 HValue* new_elements = BuildGrowElementsCapacity(object, elements, kind, 1398 HValue* new_elements = BuildGrowElementsCapacity(object, elements, kind,
1400 kind, length, capacity); 1399 kind, length, capacity);
1401 1400
1402 environment()->Push(new_elements); 1401 environment()->Push(new_elements);
1403 1402
1404 cow_checker.Else(); 1403 cow_checker.Else();
(...skipping 296 matching lines...) Expand 10 before | Expand all | Expand 10 after
1701 if_objectiskey.JoinContinuation(&found); 1700 if_objectiskey.JoinContinuation(&found);
1702 } 1701 }
1703 if_objectissmi.Else(); 1702 if_objectissmi.Else();
1704 { 1703 {
1705 if (type->Is(Type::Smi())) { 1704 if (type->Is(Type::Smi())) {
1706 if_objectissmi.Deopt("Expected smi"); 1705 if_objectissmi.Deopt("Expected smi");
1707 } else { 1706 } else {
1708 // Check if the object is a heap number. 1707 // Check if the object is a heap number.
1709 IfBuilder if_objectisnumber(this); 1708 IfBuilder if_objectisnumber(this);
1710 HValue* objectisnumber = if_objectisnumber.If<HCompareMap>( 1709 HValue* objectisnumber = if_objectisnumber.If<HCompareMap>(
1711 object, isolate()->factory()->heap_number_map(), top_info()); 1710 object, isolate()->factory()->heap_number_map());
1712 if_objectisnumber.Then(); 1711 if_objectisnumber.Then();
1713 { 1712 {
1714 // Compute hash for heap number similar to double_get_hash(). 1713 // Compute hash for heap number similar to double_get_hash().
1715 HValue* low = Add<HLoadNamedField>( 1714 HValue* low = Add<HLoadNamedField>(
1716 object, objectisnumber, 1715 object, objectisnumber,
1717 HObjectAccess::ForHeapNumberValueLowestBits()); 1716 HObjectAccess::ForHeapNumberValueLowestBits());
1718 HValue* high = Add<HLoadNamedField>( 1717 HValue* high = Add<HLoadNamedField>(
1719 object, objectisnumber, 1718 object, objectisnumber,
1720 HObjectAccess::ForHeapNumberValueHighestBits()); 1719 HObjectAccess::ForHeapNumberValueHighestBits());
1721 HValue* hash = AddUncasted<HBitwise>(Token::BIT_XOR, low, high); 1720 HValue* hash = AddUncasted<HBitwise>(Token::BIT_XOR, low, high);
(...skipping 3923 matching lines...) Expand 10 before | Expand all | Expand 10 after
5645 } 5644 }
5646 } 5645 }
5647 ++count; 5646 ++count;
5648 HBasicBlock* if_true = graph()->CreateBasicBlock(); 5647 HBasicBlock* if_true = graph()->CreateBasicBlock();
5649 HBasicBlock* if_false = graph()->CreateBasicBlock(); 5648 HBasicBlock* if_false = graph()->CreateBasicBlock();
5650 HUnaryControlInstruction* compare; 5649 HUnaryControlInstruction* compare;
5651 5650
5652 HValue* dependency; 5651 HValue* dependency;
5653 if (info.type()->Is(Type::Number())) { 5652 if (info.type()->Is(Type::Number())) {
5654 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map(); 5653 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map();
5655 compare = New<HCompareMap>(object, heap_number_map, top_info(), 5654 compare = New<HCompareMap>(object, heap_number_map, if_true, if_false);
5656 if_true, if_false);
5657 dependency = smi_check; 5655 dependency = smi_check;
5658 } else if (info.type()->Is(Type::String())) { 5656 } else if (info.type()->Is(Type::String())) {
5659 compare = New<HIsStringAndBranch>(object, if_true, if_false); 5657 compare = New<HIsStringAndBranch>(object, if_true, if_false);
5660 dependency = compare; 5658 dependency = compare;
5661 } else { 5659 } else {
5662 compare = New<HCompareMap>(object, info.map(), top_info(), 5660 compare = New<HCompareMap>(object, info.map(), if_true, if_false);
5663 if_true, if_false);
5664 dependency = compare; 5661 dependency = compare;
5665 } 5662 }
5666 FinishCurrentBlock(compare); 5663 FinishCurrentBlock(compare);
5667 5664
5668 if (info.type()->Is(Type::Number())) { 5665 if (info.type()->Is(Type::Number())) {
5669 Goto(if_true, number_block); 5666 Goto(if_true, number_block);
5670 if_true = number_block; 5667 if_true = number_block;
5671 number_block->SetJoinId(ast_id); 5668 number_block->SetJoinId(ast_id);
5672 } 5669 }
5673 5670
(...skipping 619 matching lines...) Expand 10 before | Expand all | Expand 10 after
6293 // Remember the most general elements kind, the code for its load will 6290 // Remember the most general elements kind, the code for its load will
6294 // properly handle all of the more specific cases. 6291 // properly handle all of the more specific cases.
6295 if ((i == 0) || IsMoreGeneralElementsKindTransition( 6292 if ((i == 0) || IsMoreGeneralElementsKindTransition(
6296 most_general_consolidated_map->elements_kind(), 6293 most_general_consolidated_map->elements_kind(),
6297 map->elements_kind())) { 6294 map->elements_kind())) {
6298 most_general_consolidated_map = map; 6295 most_general_consolidated_map = map;
6299 } 6296 }
6300 } 6297 }
6301 if (!has_double_maps && !has_smi_or_object_maps) return NULL; 6298 if (!has_double_maps && !has_smi_or_object_maps) return NULL;
6302 6299
6303 HCheckMaps* checked_object = Add<HCheckMaps>(object, maps, top_info()); 6300 HCheckMaps* checked_object = Add<HCheckMaps>(object, maps);
6304 // FAST_ELEMENTS is considered more general than FAST_HOLEY_SMI_ELEMENTS. 6301 // FAST_ELEMENTS is considered more general than FAST_HOLEY_SMI_ELEMENTS.
6305 // If we've seen both, the consolidated load must use FAST_HOLEY_ELEMENTS. 6302 // If we've seen both, the consolidated load must use FAST_HOLEY_ELEMENTS.
6306 ElementsKind consolidated_elements_kind = has_seen_holey_elements 6303 ElementsKind consolidated_elements_kind = has_seen_holey_elements
6307 ? GetHoleyElementsKind(most_general_consolidated_map->elements_kind()) 6304 ? GetHoleyElementsKind(most_general_consolidated_map->elements_kind())
6308 : most_general_consolidated_map->elements_kind(); 6305 : most_general_consolidated_map->elements_kind();
6309 HInstruction* instr = BuildUncheckedMonomorphicElementAccess( 6306 HInstruction* instr = BuildUncheckedMonomorphicElementAccess(
6310 checked_object, key, val, 6307 checked_object, key, val,
6311 most_general_consolidated_map->instance_type() == JS_ARRAY_TYPE, 6308 most_general_consolidated_map->instance_type() == JS_ARRAY_TYPE,
6312 consolidated_elements_kind, 6309 consolidated_elements_kind,
6313 LOAD, NEVER_RETURN_HOLE, STANDARD_STORE); 6310 LOAD, NEVER_RETURN_HOLE, STANDARD_STORE);
(...skipping 77 matching lines...) Expand 10 before | Expand all | Expand 10 after
6391 6388
6392 HBasicBlock* join = graph()->CreateBasicBlock(); 6389 HBasicBlock* join = graph()->CreateBasicBlock();
6393 6390
6394 for (int i = 0; i < untransitionable_maps.length(); ++i) { 6391 for (int i = 0; i < untransitionable_maps.length(); ++i) {
6395 Handle<Map> map = untransitionable_maps[i]; 6392 Handle<Map> map = untransitionable_maps[i];
6396 if (!map->IsJSObjectMap()) continue; 6393 if (!map->IsJSObjectMap()) continue;
6397 ElementsKind elements_kind = map->elements_kind(); 6394 ElementsKind elements_kind = map->elements_kind();
6398 HBasicBlock* this_map = graph()->CreateBasicBlock(); 6395 HBasicBlock* this_map = graph()->CreateBasicBlock();
6399 HBasicBlock* other_map = graph()->CreateBasicBlock(); 6396 HBasicBlock* other_map = graph()->CreateBasicBlock();
6400 HCompareMap* mapcompare = 6397 HCompareMap* mapcompare =
6401 New<HCompareMap>(object, map, top_info(), this_map, other_map); 6398 New<HCompareMap>(object, map, this_map, other_map);
6402 FinishCurrentBlock(mapcompare); 6399 FinishCurrentBlock(mapcompare);
6403 6400
6404 set_current_block(this_map); 6401 set_current_block(this_map);
6405 HInstruction* access = NULL; 6402 HInstruction* access = NULL;
6406 if (IsDictionaryElementsKind(elements_kind)) { 6403 if (IsDictionaryElementsKind(elements_kind)) {
6407 access = AddInstruction(BuildKeyedGeneric(access_type, object, key, val)); 6404 access = AddInstruction(BuildKeyedGeneric(access_type, object, key, val));
6408 } else { 6405 } else {
6409 ASSERT(IsFastElementsKind(elements_kind) || 6406 ASSERT(IsFastElementsKind(elements_kind) ||
6410 IsExternalArrayElementsKind(elements_kind)); 6407 IsExternalArrayElementsKind(elements_kind));
6411 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map); 6408 LoadKeyedHoleMode load_mode = BuildKeyedHoleMode(map);
(...skipping 187 matching lines...) Expand 10 before | Expand all | Expand 10 after
6599 } 6596 }
6600 6597
6601 HValue* checked_object; 6598 HValue* checked_object;
6602 // Type::Number() is only supported by polymorphic load/call handling. 6599 // Type::Number() is only supported by polymorphic load/call handling.
6603 ASSERT(!info.type()->Is(Type::Number())); 6600 ASSERT(!info.type()->Is(Type::Number()));
6604 BuildCheckHeapObject(object); 6601 BuildCheckHeapObject(object);
6605 if (AreStringTypes(types)) { 6602 if (AreStringTypes(types)) {
6606 checked_object = 6603 checked_object =
6607 Add<HCheckInstanceType>(object, HCheckInstanceType::IS_STRING); 6604 Add<HCheckInstanceType>(object, HCheckInstanceType::IS_STRING);
6608 } else { 6605 } else {
6609 checked_object = Add<HCheckMaps>(object, types, top_info()); 6606 checked_object = Add<HCheckMaps>(object, types);
6610 } 6607 }
6611 return BuildMonomorphicAccess( 6608 return BuildMonomorphicAccess(
6612 &info, object, checked_object, value, ast_id, return_id); 6609 &info, object, checked_object, value, ast_id, return_id);
6613 } 6610 }
6614 6611
6615 return BuildNamedGeneric(access, object, name, value, is_uninitialized); 6612 return BuildNamedGeneric(access, object, name, value, is_uninitialized);
6616 } 6613 }
6617 6614
6618 6615
6619 void HOptimizedGraphBuilder::PushLoad(Property* expr, 6616 void HOptimizedGraphBuilder::PushLoad(Property* expr,
(...skipping 231 matching lines...) Expand 10 before | Expand all | Expand 10 after
6851 } 6848 }
6852 } 6849 }
6853 ++count; 6850 ++count;
6854 HBasicBlock* if_true = graph()->CreateBasicBlock(); 6851 HBasicBlock* if_true = graph()->CreateBasicBlock();
6855 HBasicBlock* if_false = graph()->CreateBasicBlock(); 6852 HBasicBlock* if_false = graph()->CreateBasicBlock();
6856 HUnaryControlInstruction* compare; 6853 HUnaryControlInstruction* compare;
6857 6854
6858 Handle<Map> map = info.map(); 6855 Handle<Map> map = info.map();
6859 if (info.type()->Is(Type::Number())) { 6856 if (info.type()->Is(Type::Number())) {
6860 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map(); 6857 Handle<Map> heap_number_map = isolate()->factory()->heap_number_map();
6861 compare = New<HCompareMap>(receiver, heap_number_map, top_info(), 6858 compare = New<HCompareMap>(receiver, heap_number_map, if_true, if_false);
6862 if_true, if_false);
6863 } else if (info.type()->Is(Type::String())) { 6859 } else if (info.type()->Is(Type::String())) {
6864 compare = New<HIsStringAndBranch>(receiver, if_true, if_false); 6860 compare = New<HIsStringAndBranch>(receiver, if_true, if_false);
6865 } else { 6861 } else {
6866 compare = New<HCompareMap>(receiver, map, top_info(), 6862 compare = New<HCompareMap>(receiver, map, if_true, if_false);
6867 if_true, if_false);
6868 } 6863 }
6869 FinishCurrentBlock(compare); 6864 FinishCurrentBlock(compare);
6870 6865
6871 if (info.type()->Is(Type::Number())) { 6866 if (info.type()->Is(Type::Number())) {
6872 Goto(if_true, number_block); 6867 Goto(if_true, number_block);
6873 if_true = number_block; 6868 if_true = number_block;
6874 number_block->SetJoinId(expr->id()); 6869 number_block->SetJoinId(expr->id());
6875 } 6870 }
6876 6871
6877 set_current_block(if_true); 6872 set_current_block(if_true);
(...skipping 824 matching lines...) Expand 10 before | Expand all | Expand 10 after
7702 PrintF("Inlining api function "); 7697 PrintF("Inlining api function ");
7703 function->ShortPrint(); 7698 function->ShortPrint();
7704 PrintF("\n"); 7699 PrintF("\n");
7705 } 7700 }
7706 7701
7707 bool drop_extra = false; 7702 bool drop_extra = false;
7708 switch (call_type) { 7703 switch (call_type) {
7709 case kCallApiFunction: 7704 case kCallApiFunction:
7710 case kCallApiMethod: 7705 case kCallApiMethod:
7711 // Need to check that none of the receiver maps could have changed. 7706 // Need to check that none of the receiver maps could have changed.
7712 Add<HCheckMaps>(receiver, receiver_maps, top_info()); 7707 Add<HCheckMaps>(receiver, receiver_maps);
7713 // Need to ensure the chain between receiver and api_holder is intact. 7708 // Need to ensure the chain between receiver and api_holder is intact.
7714 if (holder_lookup == CallOptimization::kHolderFound) { 7709 if (holder_lookup == CallOptimization::kHolderFound) {
7715 AddCheckPrototypeMaps(api_holder, receiver_maps->first()); 7710 AddCheckPrototypeMaps(api_holder, receiver_maps->first());
7716 } else { 7711 } else {
7717 ASSERT_EQ(holder_lookup, CallOptimization::kHolderIsReceiver); 7712 ASSERT_EQ(holder_lookup, CallOptimization::kHolderIsReceiver);
7718 } 7713 }
7719 // Includes receiver. 7714 // Includes receiver.
7720 PushArgumentsFromEnvironment(argc + 1); 7715 PushArgumentsFromEnvironment(argc + 1);
7721 // Drop function after call. 7716 // Drop function after call.
7722 drop_extra = true; 7717 drop_extra = true;
(...skipping 3464 matching lines...) Expand 10 before | Expand all | Expand 10 after
11187 if (ShouldProduceTraceOutput()) { 11182 if (ShouldProduceTraceOutput()) {
11188 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 11183 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
11189 } 11184 }
11190 11185
11191 #ifdef DEBUG 11186 #ifdef DEBUG
11192 graph_->Verify(false); // No full verify. 11187 graph_->Verify(false); // No full verify.
11193 #endif 11188 #endif
11194 } 11189 }
11195 11190
11196 } } // namespace v8::internal 11191 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « src/compiler.cc ('k') | src/hydrogen-check-elimination.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698