From 1d124f0a75b7925d967d5252619d13ac6b8302b7 Mon Sep 17 00:00:00 2001 From: "mstarzinger@chromium.org" Date: Thu, 24 Jan 2013 09:10:06 +0000 Subject: [PATCH] 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 --- src/hydrogen-instructions.cc | 20 ++++++++++++++++++++ src/hydrogen-instructions.h | 6 ++++-- 2 files changed, 24 insertions(+), 2 deletions(-) diff --git a/src/hydrogen-instructions.cc b/src/hydrogen-instructions.cc index f951b35..9c808c7 100644 --- a/src/hydrogen-instructions.cc +++ b/src/hydrogen-instructions.cc @@ -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 = 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) { value()->PrintNameTo(stream); if (HasTypeCheck()) { diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h index dc899b4..367d2b3 100644 --- a/src/hydrogen-instructions.h +++ b/src/hydrogen-instructions.h @@ -193,6 +193,7 @@ class LChunkBuilder; V(WrapReceiver) #define GVN_TRACKED_FLAG_LIST(V) \ + V(Maps) \ V(NewSpacePromotion) #define GVN_UNTRACKED_FLAG_LIST(V) \ @@ -205,7 +206,6 @@ class LChunkBuilder; V(DoubleArrayElements) \ V(SpecializedArrayElements) \ V(GlobalVars) \ - V(Maps) \ V(ArrayLengths) \ V(ContextSlots) \ V(OsrEntries) @@ -2248,6 +2248,7 @@ class HCheckMaps: public HTemplateInstruction<2> { SetOperandAt(1, typecheck != NULL ? typecheck : value); set_representation(Representation::Tagged()); SetFlag(kUseGVN); + SetFlag(kTrackSideEffectDominators); SetGVNFlag(kDependsOnMaps); SetGVNFlag(kDependsOnElementsKind); map_set()->Add(map, zone); @@ -2257,6 +2258,7 @@ class HCheckMaps: public HTemplateInstruction<2> { SetOperandAt(1, value); set_representation(Representation::Tagged()); SetFlag(kUseGVN); + SetFlag(kTrackSideEffectDominators); SetGVNFlag(kDependsOnMaps); SetGVNFlag(kDependsOnElementsKind); for (int i = 0; i < maps->length(); i++) { @@ -2291,7 +2293,7 @@ class HCheckMaps: public HTemplateInstruction<2> { virtual Representation RequiredInputRepresentation(int index) { return Representation::Tagged(); } - + virtual void SetSideEffectDominator(GVNFlag side_effect, HValue* dominator); virtual void PrintDataTo(StringStream* stream); virtual HType CalculateInferredType(); -- 2.7.4