Allow removal of obsolete map checks after transitions.

This allows side effect dominator tracking to remove map checks that are
dominated by a single HStoreNamedField that performs a transition on the
same object. A similar trick could be applied to HAllocateObject.

R=jkummerow@chromium.org

Review URL: https://codereview.chromium.org/12035026

git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@13488 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent c14b9b37
...@@ -1167,6 +1167,26 @@ void HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) { ...@@ -1167,6 +1167,26 @@ void HCheckInstanceType::GetCheckMaskAndTag(uint8_t* mask, uint8_t* tag) {
} }
void HCheckMaps::SetSideEffectDominator(GVNFlag side_effect,
HValue* dominator) {
ASSERT(side_effect == kChangesMaps);
// TODO(mstarzinger): For now we specialize on HStoreNamedField, but once
// type information is rich enough we should generalize this to any HType
// for which the map is known.
if (dominator->IsStoreNamedField()) {
HStoreNamedField* store = HStoreNamedField::cast(dominator);
Handle<Map> map = store->transition();
if (map.is_null() || store->object() != value()) return;
for (int i = 0; i < map_set()->length(); i++) {
if (map.is_identical_to(map_set()->at(i))) {
DeleteAndReplaceWith(NULL);
return;
}
}
}
}
void HLoadElements::PrintDataTo(StringStream* stream) { void HLoadElements::PrintDataTo(StringStream* stream) {
value()->PrintNameTo(stream); value()->PrintNameTo(stream);
if (HasTypeCheck()) { if (HasTypeCheck()) {
......
...@@ -193,6 +193,7 @@ class LChunkBuilder; ...@@ -193,6 +193,7 @@ class LChunkBuilder;
V(WrapReceiver) V(WrapReceiver)
#define GVN_TRACKED_FLAG_LIST(V) \ #define GVN_TRACKED_FLAG_LIST(V) \
V(Maps) \
V(NewSpacePromotion) V(NewSpacePromotion)
#define GVN_UNTRACKED_FLAG_LIST(V) \ #define GVN_UNTRACKED_FLAG_LIST(V) \
...@@ -205,7 +206,6 @@ class LChunkBuilder; ...@@ -205,7 +206,6 @@ class LChunkBuilder;
V(DoubleArrayElements) \ V(DoubleArrayElements) \
V(SpecializedArrayElements) \ V(SpecializedArrayElements) \
V(GlobalVars) \ V(GlobalVars) \
V(Maps) \
V(ArrayLengths) \ V(ArrayLengths) \
V(ContextSlots) \ V(ContextSlots) \
V(OsrEntries) V(OsrEntries)
...@@ -2248,6 +2248,7 @@ class HCheckMaps: public HTemplateInstruction<2> { ...@@ -2248,6 +2248,7 @@ class HCheckMaps: public HTemplateInstruction<2> {
SetOperandAt(1, typecheck != NULL ? typecheck : value); SetOperandAt(1, typecheck != NULL ? typecheck : value);
set_representation(Representation::Tagged()); set_representation(Representation::Tagged());
SetFlag(kUseGVN); SetFlag(kUseGVN);
SetFlag(kTrackSideEffectDominators);
SetGVNFlag(kDependsOnMaps); SetGVNFlag(kDependsOnMaps);
SetGVNFlag(kDependsOnElementsKind); SetGVNFlag(kDependsOnElementsKind);
map_set()->Add(map, zone); map_set()->Add(map, zone);
...@@ -2257,6 +2258,7 @@ class HCheckMaps: public HTemplateInstruction<2> { ...@@ -2257,6 +2258,7 @@ class HCheckMaps: public HTemplateInstruction<2> {
SetOperandAt(1, value); SetOperandAt(1, value);
set_representation(Representation::Tagged()); set_representation(Representation::Tagged());
SetFlag(kUseGVN); SetFlag(kUseGVN);
SetFlag(kTrackSideEffectDominators);
SetGVNFlag(kDependsOnMaps); SetGVNFlag(kDependsOnMaps);
SetGVNFlag(kDependsOnElementsKind); SetGVNFlag(kDependsOnElementsKind);
for (int i = 0; i < maps->length(); i++) { for (int i = 0; i < maps->length(); i++) {
...@@ -2291,7 +2293,7 @@ class HCheckMaps: public HTemplateInstruction<2> { ...@@ -2291,7 +2293,7 @@ class HCheckMaps: public HTemplateInstruction<2> {
virtual Representation RequiredInputRepresentation(int index) { virtual Representation RequiredInputRepresentation(int index) {
return Representation::Tagged(); return Representation::Tagged();
} }
virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator);
virtual void PrintDataTo(StringStream* stream); virtual void PrintDataTo(StringStream* stream);
virtual HType CalculateInferredType(); virtual HType CalculateInferredType();
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment