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

Side by Side Diff: src/hydrogen.cc

Issue 18887002: Add support to turn polymorphic loads from the same prototype into a monomorphic load. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Created 7 years, 5 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 | « no previous file | no next file » | 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 4960 matching lines...) Expand 10 before | Expand all | Expand 10 after
4971 } else if (access.offset() != new_access.offset()) { 4971 } else if (access.offset() != new_access.offset()) {
4972 // Offsets did not match. 4972 // Offsets did not match.
4973 break; 4973 break;
4974 } else if (access.IsInobject() != new_access.IsInobject()) { 4974 } else if (access.IsInobject() != new_access.IsInobject()) {
4975 // In-objectness did not match. 4975 // In-objectness did not match.
4976 break; 4976 break;
4977 } 4977 }
4978 representation = representation.generalize(new_representation); 4978 representation = representation.generalize(new_representation);
4979 } 4979 }
4980 4980
4981 if (count != types->length()) return NULL; 4981 if (count == types->length()) {
4982 // Everything matched; can use monomorphic load.
4983 BuildCheckHeapObject(object);
4984 AddInstruction(HCheckMaps::New(object, types, zone()));
4985 return BuildLoadNamedField(object, access, representation);
4986 }
4982 4987
4983 // Everything matched; can use monomorphic load. 4988 if (count != 0) return NULL;
4989
4990 // Second chance: the property is on the prototype and all maps have the
4991 // same prototype.
4992 Handle<Map> map(types->at(0));
4993 if (map->has_named_interceptor()) return NULL;
4994 if (map->is_dictionary_map()) return NULL;
4995
4996 Handle<Object> prototype(map->prototype(), isolate());
4997 for (count = 1; count < types->length(); ++count) {
4998 Handle<Map> test_map(types->at(count));
4999 // Ensure the property is on the prototype, not the object itself.
5000 if (map->has_named_interceptor()) return NULL;
5001 if (test_map->is_dictionary_map()) return NULL;
5002 test_map->LookupDescriptor(NULL, *name, &lookup);
5003 if (lookup.IsFound()) return NULL;
5004 if (test_map->prototype() != *prototype) return NULL;
5005 }
5006
5007 LookupInPrototypes(map, name, &lookup);
5008 if (!lookup.IsField()) return NULL;
5009
4984 BuildCheckHeapObject(object); 5010 BuildCheckHeapObject(object);
4985 AddInstruction(HCheckMaps::New(object, types, zone())); 5011 AddInstruction(HCheckMaps::New(object, types, zone()));
4986 return BuildLoadNamedField(object, access, representation); 5012 Handle<JSObject> holder(lookup.holder());
5013 Handle<Map> holder_map(holder->map());
5014 AddInstruction(new(zone()) HCheckPrototypeMaps(
5015 Handle<JSObject>::cast(prototype), holder, zone(), top_info()));
5016 HValue* holder_value = AddInstruction(new(zone()) HConstant(holder));
5017 return BuildLoadNamedField(holder_value,
5018 HObjectAccess::ForField(holder_map, &lookup, name),
5019 ComputeLoadStoreRepresentation(map, &lookup));
4987 } 5020 }
4988 5021
4989 5022
4990 void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField( 5023 void HOptimizedGraphBuilder::HandlePolymorphicLoadNamedField(
4991 Property* expr, 5024 Property* expr,
4992 HValue* object, 5025 HValue* object,
4993 SmallMapList* types, 5026 SmallMapList* types,
4994 Handle<String> name) { 5027 Handle<String> name) {
4995 HInstruction* instr = TryLoadPolymorphicAsMonomorphic( 5028 HInstruction* instr = TryLoadPolymorphicAsMonomorphic(
4996 expr, object, types, name); 5029 expr, object, types, name);
(...skipping 5146 matching lines...) Expand 10 before | Expand all | Expand 10 after
10143 if (ShouldProduceTraceOutput()) { 10176 if (ShouldProduceTraceOutput()) {
10144 isolate()->GetHTracer()->TraceHydrogen(name(), graph_); 10177 isolate()->GetHTracer()->TraceHydrogen(name(), graph_);
10145 } 10178 }
10146 10179
10147 #ifdef DEBUG 10180 #ifdef DEBUG
10148 graph_->Verify(false); // No full verify. 10181 graph_->Verify(false); // No full verify.
10149 #endif 10182 #endif
10150 } 10183 }
10151 10184
10152 } } // namespace v8::internal 10185 } } // namespace v8::internal
OLDNEW
« no previous file with comments | « no previous file | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698