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

Unified Diff: src/hydrogen-instructions.cc

Issue 11238016: Consolidated all the key store/load classes in the Hydrogen and Lithium (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: Fixed the 2 failing mjsunit tests Created 8 years, 2 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 side-by-side diff with in-line comments
Download patch
Index: src/hydrogen-instructions.cc
diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc
index 939b4f49748e3ea9acd0c7b6594d1e70e74071ff..a40dfe9241b97d8cb553b55718dfc201dc207238 100644
--- a/src/hydrogen-instructions.cc
+++ b/src/hydrogen-instructions.cc
@@ -1622,7 +1622,7 @@ Range* HShl::InferRange(Zone* zone) {
}
-Range* HLoadKeyedSpecializedArrayElement::InferRange(Zone* zone) {
+Range* HLoadKeyed::InferRange(Zone* zone) {
switch (elements_kind()) {
case EXTERNAL_PIXEL_ELEMENTS:
return new(zone) Range(0, 255);
@@ -1849,41 +1849,86 @@ void HLoadNamedGeneric::PrintDataTo(StringStream* stream) {
}
-void HLoadKeyedFastElement::PrintDataTo(StringStream* stream) {
- object()->PrintNameTo(stream);
- stream->Add("[");
- key()->PrintNameTo(stream);
- stream->Add("] ");
- dependency()->PrintNameTo(stream);
- if (RequiresHoleCheck()) {
- stream->Add(" check_hole");
+void HLoadKeyed::PrintDataTo(StringStream* stream) {
+ if (!is_external()) {
+ object()->PrintNameTo(stream);
+ stream->Add("[");
danno 2012/10/21 20:44:41 From the above line
mvstanton 2012/10/23 23:44:20 Done.
+ key()->PrintNameTo(stream);
+ stream->Add("] ");
+ dependency()->PrintNameTo(stream);
+ if (RequiresHoleCheck()) {
+ stream->Add(" check_hole");
+ }
danno 2012/10/21 20:44:41 To here can be shared at the end of the routine. R
mvstanton 2012/10/23 23:44:20 Done.
+ } else {
+ external_pointer()->PrintNameTo(stream);
+ stream->Add(".");
+ switch (elements_kind()) {
Sven Panne 2012/10/22 06:14:18 DBC: Add a new function ElementsKind2String and us
mvstanton 2012/10/23 23:44:20 Good idea, thanks Sven. Now, the string will be di
+ case EXTERNAL_BYTE_ELEMENTS:
+ stream->Add("byte");
+ break;
+ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
+ stream->Add("u_byte");
+ break;
+ case EXTERNAL_SHORT_ELEMENTS:
+ stream->Add("short");
+ break;
+ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
+ stream->Add("u_short");
+ break;
+ case EXTERNAL_INT_ELEMENTS:
+ stream->Add("int");
+ break;
+ case EXTERNAL_UNSIGNED_INT_ELEMENTS:
+ stream->Add("u_int");
+ break;
+ case EXTERNAL_FLOAT_ELEMENTS:
+ stream->Add("float");
+ break;
+ case EXTERNAL_DOUBLE_ELEMENTS:
+ stream->Add("double");
+ break;
+ case EXTERNAL_PIXEL_ELEMENTS:
+ stream->Add("pixel");
+ break;
+ case FAST_ELEMENTS:
+ case FAST_SMI_ELEMENTS:
+ case FAST_DOUBLE_ELEMENTS:
+ case FAST_HOLEY_ELEMENTS:
+ case FAST_HOLEY_SMI_ELEMENTS:
+ case FAST_HOLEY_DOUBLE_ELEMENTS:
+ case DICTIONARY_ELEMENTS:
+ case NON_STRICT_ARGUMENTS_ELEMENTS:
+ UNREACHABLE();
+ break;
+ }
+ stream->Add("[");
+ key()->PrintNameTo(stream);
+ stream->Add("] ");
+ dependency()->PrintNameTo(stream);
}
}
-bool HLoadKeyedFastElement::RequiresHoleCheck() const {
+bool HLoadKeyed::RequiresHoleCheck() const {
if (IsFastPackedElementsKind(elements_kind())) {
return false;
}
+ if (IsFastDoubleElementsKind(elements_kind())) {
+ return true;
+ }
+
for (HUseIterator it(uses()); !it.Done(); it.Advance()) {
HValue* use = it.value();
- if (!use->IsChange()) return true;
+ if (!use->IsChange()) {
+ return true;
+ }
}
return false;
}
-void HLoadKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
- elements()->PrintNameTo(stream);
- stream->Add("[");
- key()->PrintNameTo(stream);
- stream->Add("] ");
- dependency()->PrintNameTo(stream);
-}
-
-
void HLoadKeyedGeneric::PrintDataTo(StringStream* stream) {
object()->PrintNameTo(stream);
stream->Add("[");
@@ -1896,8 +1941,11 @@ HValue* HLoadKeyedGeneric::Canonicalize() {
// Recognize generic keyed loads that use property name generated
// by for-in statement as a key and rewrite them into fast property load
// by index.
- if (key()->IsLoadKeyedFastElement()) {
- HLoadKeyedFastElement* key_load = HLoadKeyedFastElement::cast(key());
+ if (key()->IsLoadKeyed()) {
+ HLoadKeyed* key_load = HLoadKeyed::cast(key());
+ // TODO(mvstanton): before this didn't recognize the fast double case,
+ // now it does. Is that okay? Do a test that calls Canonicalize on a
+ // fast double HLoadKeyed.
danno 2012/10/21 20:44:41 Yes, this should be OK
mvstanton 2012/10/23 23:44:20 Done.
if (key_load->object()->IsForInCacheArray()) {
HForInCacheArray* names_cache =
HForInCacheArray::cast(key_load->object());
@@ -1907,10 +1955,12 @@ HValue* HLoadKeyedGeneric::Canonicalize() {
names_cache->index_cache();
HCheckMapValue* map_check =
new(block()->zone()) HCheckMapValue(object(), names_cache->map());
- HInstruction* index = new(block()->zone()) HLoadKeyedFastElement(
+ HInstruction* index = new(block()->zone()) HLoadKeyed(
index_cache,
key_load->key(),
- key_load->key());
+ key_load->key(),
+ key_load->elements_kind(),
+ false);
map_check->InsertBefore(this);
index->InsertBefore(this);
HLoadFieldByIndex* load = new(block()->zone()) HLoadFieldByIndex(
@@ -1925,56 +1975,6 @@ HValue* HLoadKeyedGeneric::Canonicalize() {
}
-void HLoadKeyedSpecializedArrayElement::PrintDataTo(
- StringStream* stream) {
- external_pointer()->PrintNameTo(stream);
- stream->Add(".");
- switch (elements_kind()) {
- case EXTERNAL_BYTE_ELEMENTS:
- stream->Add("byte");
- break;
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
- stream->Add("u_byte");
- break;
- case EXTERNAL_SHORT_ELEMENTS:
- stream->Add("short");
- break;
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
- stream->Add("u_short");
- break;
- case EXTERNAL_INT_ELEMENTS:
- stream->Add("int");
- break;
- case EXTERNAL_UNSIGNED_INT_ELEMENTS:
- stream->Add("u_int");
- break;
- case EXTERNAL_FLOAT_ELEMENTS:
- stream->Add("float");
- break;
- case EXTERNAL_DOUBLE_ELEMENTS:
- stream->Add("double");
- break;
- case EXTERNAL_PIXEL_ELEMENTS:
- stream->Add("pixel");
- break;
- case FAST_ELEMENTS:
- case FAST_SMI_ELEMENTS:
- case FAST_DOUBLE_ELEMENTS:
- case FAST_HOLEY_ELEMENTS:
- case FAST_HOLEY_SMI_ELEMENTS:
- case FAST_HOLEY_DOUBLE_ELEMENTS:
- case DICTIONARY_ELEMENTS:
- case NON_STRICT_ARGUMENTS_ELEMENTS:
- UNREACHABLE();
- break;
- }
- stream->Add("[");
- key()->PrintNameTo(stream);
- stream->Add("] ");
- dependency()->PrintNameTo(stream);
-}
-
-
void HStoreNamedGeneric::PrintDataTo(StringStream* stream) {
object()->PrintNameTo(stream);
stream->Add(".");
@@ -2001,21 +2001,67 @@ void HStoreNamedField::PrintDataTo(StringStream* stream) {
}
-void HStoreKeyedFastElement::PrintDataTo(StringStream* stream) {
+void HStoreKeyed::PrintDataTo(StringStream* stream) {
object()->PrintNameTo(stream);
stream->Add("[");
key()->PrintNameTo(stream);
stream->Add("] = ");
value()->PrintNameTo(stream);
-}
-void HStoreKeyedFastDoubleElement::PrintDataTo(StringStream* stream) {
- elements()->PrintNameTo(stream);
- stream->Add("[");
- key()->PrintNameTo(stream);
- stream->Add("] = ");
- value()->PrintNameTo(stream);
+ if (!is_external()) {
+ object()->PrintNameTo(stream);
+ stream->Add("[");
danno 2012/10/21 20:44:41 Can share from above line...
mvstanton 2012/10/23 23:44:20 Done.
+ key()->PrintNameTo(stream);
+ stream->Add("] = ");
+ value()->PrintNameTo(stream);
danno 2012/10/21 20:44:41 ...to line above between both external and non-ext
mvstanton 2012/10/23 23:44:20 Done, also fixed duplicate code issue at line 2005
+ } else {
+ external_pointer()->PrintNameTo(stream);
+ stream->Add(".");
+ switch (elements_kind()) {
Sven Panne 2012/10/22 06:14:18 See my comment above...
mvstanton 2012/10/23 23:44:20 Done.
+ case EXTERNAL_BYTE_ELEMENTS:
+ stream->Add("byte");
+ break;
+ case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
+ stream->Add("u_byte");
+ break;
+ case EXTERNAL_SHORT_ELEMENTS:
+ stream->Add("short");
+ break;
+ case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
+ stream->Add("u_short");
+ break;
+ case EXTERNAL_INT_ELEMENTS:
+ stream->Add("int");
+ break;
+ case EXTERNAL_UNSIGNED_INT_ELEMENTS:
+ stream->Add("u_int");
+ break;
+ case EXTERNAL_FLOAT_ELEMENTS:
+ stream->Add("float");
+ break;
+ case EXTERNAL_DOUBLE_ELEMENTS:
+ stream->Add("double");
+ break;
+ case EXTERNAL_PIXEL_ELEMENTS:
+ stream->Add("pixel");
+ break;
+ case FAST_SMI_ELEMENTS:
+ case FAST_ELEMENTS:
+ case FAST_DOUBLE_ELEMENTS:
+ case FAST_HOLEY_SMI_ELEMENTS:
+ case FAST_HOLEY_ELEMENTS:
+ case FAST_HOLEY_DOUBLE_ELEMENTS:
+ case DICTIONARY_ELEMENTS:
+ case NON_STRICT_ARGUMENTS_ELEMENTS:
+ UNREACHABLE();
+ break;
+ }
+ stream->Add("[");
+ key()->PrintNameTo(stream);
+ stream->Add("] = ");
+ value()->PrintNameTo(stream);
+ }
}
@@ -2028,56 +2074,6 @@ void HStoreKeyedGeneric::PrintDataTo(StringStream* stream) {
}
-void HStoreKeyedSpecializedArrayElement::PrintDataTo(
- StringStream* stream) {
- external_pointer()->PrintNameTo(stream);
- stream->Add(".");
- switch (elements_kind()) {
- case EXTERNAL_BYTE_ELEMENTS:
- stream->Add("byte");
- break;
- case EXTERNAL_UNSIGNED_BYTE_ELEMENTS:
- stream->Add("u_byte");
- break;
- case EXTERNAL_SHORT_ELEMENTS:
- stream->Add("short");
- break;
- case EXTERNAL_UNSIGNED_SHORT_ELEMENTS:
- stream->Add("u_short");
- break;
- case EXTERNAL_INT_ELEMENTS:
- stream->Add("int");
- break;
- case EXTERNAL_UNSIGNED_INT_ELEMENTS:
- stream->Add("u_int");
- break;
- case EXTERNAL_FLOAT_ELEMENTS:
- stream->Add("float");
- break;
- case EXTERNAL_DOUBLE_ELEMENTS:
- stream->Add("double");
- break;
- case EXTERNAL_PIXEL_ELEMENTS:
- stream->Add("pixel");
- break;
- case FAST_SMI_ELEMENTS:
- case FAST_ELEMENTS:
- case FAST_DOUBLE_ELEMENTS:
- case FAST_HOLEY_SMI_ELEMENTS:
- case FAST_HOLEY_ELEMENTS:
- case FAST_HOLEY_DOUBLE_ELEMENTS:
- case DICTIONARY_ELEMENTS:
- case NON_STRICT_ARGUMENTS_ELEMENTS:
- UNREACHABLE();
- break;
- }
- stream->Add("[");
- key()->PrintNameTo(stream);
- stream->Add("] = ");
- value()->PrintNameTo(stream);
-}
-
-
void HTransitionElementsKind::PrintDataTo(StringStream* stream) {
object()->PrintNameTo(stream);
ElementsKind from_kind = original_map()->elements_kind();
@@ -2368,10 +2364,10 @@ HValue* HAdd::EnsureAndPropagateNotMinusZero(BitVector* visited) {
}
-bool HStoreKeyedFastDoubleElement::NeedsCanonicalization() {
+bool HStoreKeyed::NeedsCanonicalization() {
// If value was loaded from unboxed double backing store or
// converted from an integer then we don't have to canonicalize it.
- if (value()->IsLoadKeyedFastDoubleElement() ||
+ if (value()->IsLoadKeyed() ||
(value()->IsChange() && HChange::cast(value())->from().IsInteger32())) {
return false;
}

Powered by Google App Engine
This is Rietveld 408576698