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

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

Issue 9141016: Improve GVN handling of ElementTransitions. (Closed) Base URL: https://v8.googlecode.com/svn/branches/bleeding_edge
Patch Set: nits Created 8 years, 10 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 2012 the V8 project authors. All rights reserved. 1 // Copyright 2012 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 168 matching lines...) Expand 10 before | Expand all | Expand 10 after
179 V(UnaryMathOperation) \ 179 V(UnaryMathOperation) \
180 V(UnknownOSRValue) \ 180 V(UnknownOSRValue) \
181 V(UseConst) \ 181 V(UseConst) \
182 V(ValueOf) 182 V(ValueOf)
183 183
184 #define GVN_FLAG_LIST(V) \ 184 #define GVN_FLAG_LIST(V) \
185 V(Calls) \ 185 V(Calls) \
186 V(InobjectFields) \ 186 V(InobjectFields) \
187 V(BackingStoreFields) \ 187 V(BackingStoreFields) \
188 V(ElementsKind) \ 188 V(ElementsKind) \
189 V(ElementsPointer) \
189 V(ArrayElements) \ 190 V(ArrayElements) \
190 V(DoubleArrayElements) \ 191 V(DoubleArrayElements) \
191 V(SpecializedArrayElements) \ 192 V(SpecializedArrayElements) \
192 V(GlobalVars) \ 193 V(GlobalVars) \
193 V(Maps) \ 194 V(Maps) \
194 V(ArrayLengths) \ 195 V(ArrayLengths) \
195 V(ContextSlots) \ 196 V(ContextSlots) \
196 V(OsrEntries) 197 V(OsrEntries)
197 198
198 #define DECLARE_ABSTRACT_INSTRUCTION(type) \ 199 #define DECLARE_ABSTRACT_INSTRUCTION(type) \
(...skipping 440 matching lines...) Expand 10 before | Expand all | Expand 10 after
639 void ClearAllSideEffects() { 640 void ClearAllSideEffects() {
640 gvn_flags_.Remove(AllSideEffectsFlagSet()); 641 gvn_flags_.Remove(AllSideEffectsFlagSet());
641 } 642 }
642 bool HasSideEffects() const { 643 bool HasSideEffects() const {
643 return gvn_flags_.ContainsAnyOf(AllSideEffectsFlagSet()); 644 return gvn_flags_.ContainsAnyOf(AllSideEffectsFlagSet());
644 } 645 }
645 bool HasObservableSideEffects() const { 646 bool HasObservableSideEffects() const {
646 return gvn_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet()); 647 return gvn_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet());
647 } 648 }
648 649
650 GVNFlagSet DependsOnFlags() const {
651 GVNFlagSet result = gvn_flags_;
652 result.Intersect(AllDependsOnFlagSet());
653 return result;
654 }
655
656 GVNFlagSet SideEffectFlags() const {
657 GVNFlagSet result = gvn_flags_;
658 result.Intersect(AllSideEffectsFlagSet());
659 return result;
660 }
661
649 GVNFlagSet ChangesFlags() const { 662 GVNFlagSet ChangesFlags() const {
650 GVNFlagSet result = gvn_flags_; 663 GVNFlagSet result = gvn_flags_;
651 result.Intersect(AllChangesFlagSet()); 664 result.Intersect(AllChangesFlagSet());
652 return result; 665 return result;
653 } 666 }
654 667
655 GVNFlagSet ObservableChangesFlags() const { 668 GVNFlagSet ObservableChangesFlags() const {
656 GVNFlagSet result = gvn_flags_; 669 GVNFlagSet result = gvn_flags_;
657 result.Intersect(AllChangesFlagSet()); 670 result.Intersect(AllChangesFlagSet());
658 result.Intersect(AllObservableSideEffectsFlagSet()); 671 result.Intersect(AllObservableSideEffectsFlagSet());
659 return result; 672 return result;
660 } 673 }
661 674
675 virtual bool HasOneTimeSideEffects() const {
676 return false;
677 }
678
662 Range* range() const { return range_; } 679 Range* range() const { return range_; }
663 bool HasRange() const { return range_ != NULL; } 680 bool HasRange() const { return range_ != NULL; }
664 void AddNewRange(Range* r); 681 void AddNewRange(Range* r);
665 void RemoveLastAddedRange(); 682 void RemoveLastAddedRange();
666 void ComputeInitialRange(); 683 void ComputeInitialRange();
667 684
668 // Representation helpers. 685 // Representation helpers.
669 virtual Representation RequiredInputRepresentation(int index) = 0; 686 virtual Representation RequiredInputRepresentation(int index) = 0;
670 687
671 virtual Representation InferredRepresentation() { 688 virtual Representation InferredRepresentation() {
(...skipping 43 matching lines...) Expand 10 before | Expand all | Expand 10 after
715 ASSERT(block_ != NULL); 732 ASSERT(block_ != NULL);
716 block_ = NULL; 733 block_ = NULL;
717 } 734 }
718 735
719 void set_representation(Representation r) { 736 void set_representation(Representation r) {
720 // Representation is set-once. 737 // Representation is set-once.
721 ASSERT(representation_.IsNone() && !r.IsNone()); 738 ASSERT(representation_.IsNone() && !r.IsNone());
722 representation_ = r; 739 representation_ = r;
723 } 740 }
724 741
742 static GVNFlagSet AllDependsOnFlagSet() {
743 GVNFlagSet result;
744 // Create changes mask.
745 #define ADD_FLAG(type) result.Add(kDependsOn##type);
746 GVN_FLAG_LIST(ADD_FLAG)
747 #undef ADD_FLAG
748 return result;
749 }
750
725 static GVNFlagSet AllChangesFlagSet() { 751 static GVNFlagSet AllChangesFlagSet() {
726 GVNFlagSet result; 752 GVNFlagSet result;
727 // Create changes mask. 753 // Create changes mask.
728 #define ADD_FLAG(type) result.Add(kChanges##type); 754 #define ADD_FLAG(type) result.Add(kChanges##type);
729 GVN_FLAG_LIST(ADD_FLAG) 755 GVN_FLAG_LIST(ADD_FLAG)
730 #undef ADD_FLAG 756 #undef ADD_FLAG
731 return result; 757 return result;
732 } 758 }
733 759
734 // A flag mask to mark an instruction as having arbitrary side effects. 760 // A flag mask to mark an instruction as having arbitrary side effects.
735 static GVNFlagSet AllSideEffectsFlagSet() { 761 static GVNFlagSet AllSideEffectsFlagSet() {
736 GVNFlagSet result = AllChangesFlagSet(); 762 GVNFlagSet result = AllChangesFlagSet();
737 result.Remove(kChangesOsrEntries); 763 result.Remove(kChangesOsrEntries);
738 return result; 764 return result;
739 } 765 }
740 766
741 // A flag mask of all side effects that can make observable changes in 767 // A flag mask of all side effects that can make observable changes in
742 // an executing program (i.e. are not safe to repeat, move or remove); 768 // an executing program (i.e. are not safe to repeat, move or remove);
743 static GVNFlagSet AllObservableSideEffectsFlagSet() { 769 static GVNFlagSet AllObservableSideEffectsFlagSet() {
744 GVNFlagSet result = AllChangesFlagSet(); 770 GVNFlagSet result = AllChangesFlagSet();
745 result.Remove(kChangesElementsKind); 771 result.Remove(kChangesElementsKind);
772 result.Remove(kChangesElementsPointer);
773 result.Remove(kChangesMaps);
746 return result; 774 return result;
747 } 775 }
748 776
749 // Remove the matching use from the use list if present. Returns the 777 // Remove the matching use from the use list if present. Returns the
750 // removed list node or NULL. 778 // removed list node or NULL.
751 HUseListNode* RemoveUse(HValue* value, int index); 779 HUseListNode* RemoveUse(HValue* value, int index);
752 780
753 void RegisterUse(int index, HValue* new_value); 781 void RegisterUse(int index, HValue* new_value);
754 782
755 HBasicBlock* block_; 783 HBasicBlock* block_;
(...skipping 1157 matching lines...) Expand 10 before | Expand all | Expand 10 after
1913 private: 1941 private:
1914 BuiltinFunctionId op_; 1942 BuiltinFunctionId op_;
1915 }; 1943 };
1916 1944
1917 1945
1918 class HLoadElements: public HUnaryOperation { 1946 class HLoadElements: public HUnaryOperation {
1919 public: 1947 public:
1920 explicit HLoadElements(HValue* value) : HUnaryOperation(value) { 1948 explicit HLoadElements(HValue* value) : HUnaryOperation(value) {
1921 set_representation(Representation::Tagged()); 1949 set_representation(Representation::Tagged());
1922 SetFlag(kUseGVN); 1950 SetFlag(kUseGVN);
1923 SetGVNFlag(kDependsOnMaps); 1951 SetGVNFlag(kDependsOnElementsPointer);
1924 SetGVNFlag(kDependsOnElementsKind);
1925 } 1952 }
1926 1953
1927 virtual Representation RequiredInputRepresentation(int index) { 1954 virtual Representation RequiredInputRepresentation(int index) {
1928 return Representation::Tagged(); 1955 return Representation::Tagged();
1929 } 1956 }
1930 1957
1931 DECLARE_CONCRETE_INSTRUCTION(LoadElements) 1958 DECLARE_CONCRETE_INSTRUCTION(LoadElements)
1932 1959
1933 protected: 1960 protected:
1934 virtual bool DataEquals(HValue* other) { return true; } 1961 virtual bool DataEquals(HValue* other) { return true; }
(...skipping 30 matching lines...) Expand all
1965 CompareMapMode mode = REQUIRE_EXACT_MAP) 1992 CompareMapMode mode = REQUIRE_EXACT_MAP)
1966 : map_(map), 1993 : map_(map),
1967 mode_(mode) { 1994 mode_(mode) {
1968 SetOperandAt(0, value); 1995 SetOperandAt(0, value);
1969 // If callers don't depend on a typecheck, they can pass in NULL. In that 1996 // If callers don't depend on a typecheck, they can pass in NULL. In that
1970 // case we use a copy of the |value| argument as a dummy value. 1997 // case we use a copy of the |value| argument as a dummy value.
1971 SetOperandAt(1, typecheck != NULL ? typecheck : value); 1998 SetOperandAt(1, typecheck != NULL ? typecheck : value);
1972 set_representation(Representation::Tagged()); 1999 set_representation(Representation::Tagged());
1973 SetFlag(kUseGVN); 2000 SetFlag(kUseGVN);
1974 SetGVNFlag(kDependsOnMaps); 2001 SetGVNFlag(kDependsOnMaps);
2002 // If the map to check doesn't have the untransitioned elements, it must not
2003 // be hoisted above TransitionElements instructions.
2004 if (mode == REQUIRE_EXACT_MAP || !map->has_fast_smi_only_elements()) {
2005 SetGVNFlag(kDependsOnElementsKind);
2006 }
1975 has_element_transitions_ = 2007 has_element_transitions_ =
1976 map->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, NULL) != NULL || 2008 map->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, NULL) != NULL ||
1977 map->LookupElementsTransitionMap(FAST_ELEMENTS, NULL) != NULL; 2009 map->LookupElementsTransitionMap(FAST_ELEMENTS, NULL) != NULL;
1978 } 2010 }
1979 2011
1980 virtual Representation RequiredInputRepresentation(int index) { 2012 virtual Representation RequiredInputRepresentation(int index) {
1981 return Representation::Tagged(); 2013 return Representation::Tagged();
1982 } 2014 }
1983 virtual void PrintDataTo(StringStream* stream); 2015 virtual void PrintDataTo(StringStream* stream);
1984 virtual HType CalculateInferredType(); 2016 virtual HType CalculateInferredType();
(...skipping 2143 matching lines...) Expand 10 before | Expand all | Expand 10 after
4128 4160
4129 class HTransitionElementsKind: public HTemplateInstruction<1> { 4161 class HTransitionElementsKind: public HTemplateInstruction<1> {
4130 public: 4162 public:
4131 HTransitionElementsKind(HValue* object, 4163 HTransitionElementsKind(HValue* object,
4132 Handle<Map> original_map, 4164 Handle<Map> original_map,
4133 Handle<Map> transitioned_map) 4165 Handle<Map> transitioned_map)
4134 : original_map_(original_map), 4166 : original_map_(original_map),
4135 transitioned_map_(transitioned_map) { 4167 transitioned_map_(transitioned_map) {
4136 SetOperandAt(0, object); 4168 SetOperandAt(0, object);
4137 SetFlag(kUseGVN); 4169 SetFlag(kUseGVN);
4170 SetGVNFlag(kDependsOnMaps);
fschneider 2012/02/02 14:59:50 There is currently no instruction that has kChange
danno 2012/02/06 16:54:57 But if we ever add one, then it will be incorrect
4138 SetGVNFlag(kChangesElementsKind); 4171 SetGVNFlag(kChangesElementsKind);
4172 if (original_map->has_fast_double_elements()) {
4173 SetGVNFlag(kChangesElementsPointer);
4174 SetGVNFlag(kDependsOnElementsPointer);
4175 SetGVNFlag(kDependsOnDoubleArrayElements);
4176 } else if (transitioned_map->has_fast_double_elements()) {
4177 SetGVNFlag(kChangesElementsPointer);
4178 SetGVNFlag(kDependsOnElementsPointer);
4179 SetGVNFlag(kDependsOnArrayElements);
4180 }
4139 set_representation(Representation::Tagged()); 4181 set_representation(Representation::Tagged());
4140 } 4182 }
4141 4183
4142 virtual Representation RequiredInputRepresentation(int index) { 4184 virtual Representation RequiredInputRepresentation(int index) {
4143 return Representation::Tagged(); 4185 return Representation::Tagged();
4144 } 4186 }
4145 4187
4188 virtual bool HasOneTimeSideEffects() const {
fschneider 2012/02/02 14:59:50 It may be not worth making a predicate that applie
danno 2012/02/06 16:54:57 Done.
4189 return true;
4190 }
4191
4146 HValue* object() { return OperandAt(0); } 4192 HValue* object() { return OperandAt(0); }
4147 Handle<Map> original_map() { return original_map_; } 4193 Handle<Map> original_map() { return original_map_; }
4148 Handle<Map> transitioned_map() { return transitioned_map_; } 4194 Handle<Map> transitioned_map() { return transitioned_map_; }
4149 4195
4150 virtual void PrintDataTo(StringStream* stream); 4196 virtual void PrintDataTo(StringStream* stream);
4151 4197
4152 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind) 4198 DECLARE_CONCRETE_INSTRUCTION(TransitionElementsKind)
4153 4199
4154 protected: 4200 protected:
4155 virtual bool DataEquals(HValue* other) { 4201 virtual bool DataEquals(HValue* other) {
(...skipping 403 matching lines...) Expand 10 before | Expand all | Expand 10 after
4559 4605
4560 DECLARE_CONCRETE_INSTRUCTION(In) 4606 DECLARE_CONCRETE_INSTRUCTION(In)
4561 }; 4607 };
4562 4608
4563 #undef DECLARE_INSTRUCTION 4609 #undef DECLARE_INSTRUCTION
4564 #undef DECLARE_CONCRETE_INSTRUCTION 4610 #undef DECLARE_CONCRETE_INSTRUCTION
4565 4611
4566 } } // namespace v8::internal 4612 } } // namespace v8::internal
4567 4613
4568 #endif // V8_HYDROGEN_INSTRUCTIONS_H_ 4614 #endif // V8_HYDROGEN_INSTRUCTIONS_H_
OLDNEW
« src/hydrogen.cc ('K') | « src/hydrogen.cc ('k') | src/hydrogen-instructions.cc » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698