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

Side by Side Diff: src/hydrogen-instructions.cc

Issue 6708085: Enable GVN for polymorphic loads by not expanding them at the HIR level. (Closed) Base URL: http://v8.googlecode.com/svn/branches/bleeding_edge/
Patch Set: '' Created 9 years, 9 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
OLDNEW
1 // Copyright 2011 the V8 project authors. All rights reserved. 1 // Copyright 2011 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 1138 matching lines...) Expand 10 before | Expand all | Expand 10 after
1149 stream->Add("%u", index()); 1149 stream->Add("%u", index());
1150 } 1150 }
1151 1151
1152 1152
1153 void HLoadNamedField::PrintDataTo(StringStream* stream) { 1153 void HLoadNamedField::PrintDataTo(StringStream* stream) {
1154 object()->PrintNameTo(stream); 1154 object()->PrintNameTo(stream);
1155 stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : ""); 1155 stream->Add(" @%d%s", offset(), is_in_object() ? "[in-object]" : "");
1156 } 1156 }
1157 1157
1158 1158
1159 HLoadNamedFieldPolymorphic::HLoadNamedFieldPolymorphic(HValue* object,
1160 ZoneMapList* types,
1161 Handle<String> name)
1162 : HUnaryOperation(object),
1163 types_(Min(types->length(), kMaxLoadPolymorphism)),
1164 name_(name),
1165 need_generic_(false) {
1166 set_representation(Representation::Tagged());
1167 SetFlag(kDependsOnMaps);
1168 for (int i = 0;
1169 i < types->length() && types_.length() < kMaxLoadPolymorphism;
1170 ++i) {
1171 Handle<Map> map = types->at(i);
1172 LookupResult lookup;
1173 map->LookupInDescriptors(NULL, *name, &lookup);
1174 if (lookup.IsProperty() && lookup.type() == FIELD) {
1175 types_.Add(types->at(i));
1176 int index = lookup.GetLocalFieldIndexFromMap(*map);
1177 if (index < 0) {
1178 SetFlag(kDependsOnInobjectFields);
1179 } else {
1180 SetFlag(kDependsOnBackingStoreFields);
1181 }
1182 }
1183 }
1184
1185 if (types_.length() == types->length() && FLAG_deoptimize_uncommon_cases) {
1186 SetFlag(kUseGVN);
1187 } else {
1188 SetAllSideEffects();
1189 need_generic_ = true;
1190 }
1191 }
1192
1193
1194 bool HLoadNamedFieldPolymorphic::DataEquals(HValue* value) {
1195 HLoadNamedFieldPolymorphic* other = HLoadNamedFieldPolymorphic::cast(value);
1196 if (types_.length() != other->types()->length()) return false;
1197 if (!name_.is_identical_to(other->name())) return false;
1198 if (need_generic_ != other->need_generic_) return false;
1199 for (int i = 0; i < types_.length(); i++) {
1200 bool found = false;
1201 for (int j = 0; j < types_.length(); j++) {
1202 if (types_.at(j).is_identical_to(other->types()->at(i))) {
1203 found = true;
1204 break;
1205 }
1206 }
1207 if (!found) return false;
1208 }
1209 return true;
1210 }
1211
1212
1159 void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) { 1213 void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
1160 object()->PrintNameTo(stream); 1214 object()->PrintNameTo(stream);
1161 stream->Add("["); 1215 stream->Add("[");
1162 key()->PrintNameTo(stream); 1216 key()->PrintNameTo(stream);
1163 stream->Add("]"); 1217 stream->Add("]");
1164 } 1218 }
1165 1219
1166 1220
1167 void HLoadKeyedGeneric::PrintDataTo(StringStream* stream) { 1221 void HLoadKeyedGeneric::PrintDataTo(StringStream* stream) {
1168 object()->PrintNameTo(stream); 1222 object()->PrintNameTo(stream);
(...skipping 338 matching lines...) Expand 10 before | Expand all | Expand 10 after
1507 1561
1508 1562
1509 void HCheckPrototypeMaps::Verify() { 1563 void HCheckPrototypeMaps::Verify() {
1510 HInstruction::Verify(); 1564 HInstruction::Verify();
1511 ASSERT(HasNoUses()); 1565 ASSERT(HasNoUses());
1512 } 1566 }
1513 1567
1514 #endif 1568 #endif
1515 1569
1516 } } // namespace v8::internal 1570 } } // namespace v8::internal
OLDNEW

Powered by Google App Engine
This is Rietveld 408576698