| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index 38277e955767d8e9723ed2bd8d9233defdba3dd3..d899c4b99702abda8fced4acbcded3ecb4ce38a6 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -186,6 +186,7 @@ class LChunkBuilder;
|
| V(InobjectFields) \
|
| V(BackingStoreFields) \
|
| V(ElementsKind) \
|
| + V(ElementsPointer) \
|
| V(ArrayElements) \
|
| V(DoubleArrayElements) \
|
| V(SpecializedArrayElements) \
|
| @@ -645,6 +646,12 @@ class HValue: public ZoneObject {
|
| return gvn_flags_.ContainsAnyOf(AllObservableSideEffectsFlagSet());
|
| }
|
|
|
| + GVNFlagSet DependsOnFlags() const {
|
| + GVNFlagSet result = gvn_flags_;
|
| + result.Intersect(AllDependsOnFlagSet());
|
| + return result;
|
| + }
|
| +
|
| GVNFlagSet ChangesFlags() const {
|
| GVNFlagSet result = gvn_flags_;
|
| result.Intersect(AllChangesFlagSet());
|
| @@ -658,6 +665,10 @@ class HValue: public ZoneObject {
|
| return result;
|
| }
|
|
|
| + virtual bool HasOneTimeSideEffects() const {
|
| + return false;
|
| + }
|
| +
|
| Range* range() const { return range_; }
|
| bool HasRange() const { return range_ != NULL; }
|
| void AddNewRange(Range* r);
|
| @@ -721,6 +732,15 @@ class HValue: public ZoneObject {
|
| representation_ = r;
|
| }
|
|
|
| + static GVNFlagSet AllDependsOnFlagSet() {
|
| + GVNFlagSet result;
|
| + // Create changes mask.
|
| +#define ADD_FLAG(type) result.Add(kDependsOn##type);
|
| + GVN_FLAG_LIST(ADD_FLAG)
|
| +#undef ADD_FLAG
|
| + return result;
|
| + }
|
| +
|
| static GVNFlagSet AllChangesFlagSet() {
|
| GVNFlagSet result;
|
| // Create changes mask.
|
| @@ -742,6 +762,8 @@ class HValue: public ZoneObject {
|
| static GVNFlagSet AllObservableSideEffectsFlagSet() {
|
| GVNFlagSet result = AllChangesFlagSet();
|
| result.Remove(kChangesElementsKind);
|
| + result.Remove(kChangesElementsPointer);
|
| + result.Remove(kChangesMaps);
|
| return result;
|
| }
|
|
|
| @@ -1919,8 +1941,7 @@ class HLoadElements: public HUnaryOperation {
|
| explicit HLoadElements(HValue* value) : HUnaryOperation(value) {
|
| set_representation(Representation::Tagged());
|
| SetFlag(kUseGVN);
|
| - SetGVNFlag(kDependsOnMaps);
|
| - SetGVNFlag(kDependsOnElementsKind);
|
| + SetGVNFlag(kDependsOnElementsPointer);
|
| }
|
|
|
| virtual Representation RequiredInputRepresentation(int index) {
|
| @@ -1971,6 +1992,9 @@ class HCheckMap: public HTemplateInstruction<2> {
|
| set_representation(Representation::Tagged());
|
| SetFlag(kUseGVN);
|
| SetGVNFlag(kDependsOnMaps);
|
| + if (mode == REQUIRE_EXACT_MAP) {
|
| + SetGVNFlag(kDependsOnElementsKind);
|
| + }
|
| has_element_transitions_ =
|
| map->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, NULL) != NULL ||
|
| map->LookupElementsTransitionMap(FAST_ELEMENTS, NULL) != NULL;
|
| @@ -4134,7 +4158,17 @@ class HTransitionElementsKind: public HTemplateInstruction<1> {
|
| transitioned_map_(transitioned_map) {
|
| SetOperandAt(0, object);
|
| SetFlag(kUseGVN);
|
| + SetGVNFlag(kDependsOnMaps);
|
| SetGVNFlag(kChangesElementsKind);
|
| + if (original_map->has_fast_double_elements()) {
|
| + SetGVNFlag(kChangesElementsPointer);
|
| + SetGVNFlag(kDependsOnElementsPointer);
|
| + SetGVNFlag(kDependsOnDoubleArrayElements);
|
| + } else if (transitioned_map->has_fast_double_elements()) {
|
| + SetGVNFlag(kChangesElementsPointer);
|
| + SetGVNFlag(kDependsOnElementsPointer);
|
| + SetGVNFlag(kDependsOnArrayElements);
|
| + }
|
| set_representation(Representation::Tagged());
|
| }
|
|
|
| @@ -4142,6 +4176,10 @@ class HTransitionElementsKind: public HTemplateInstruction<1> {
|
| return Representation::Tagged();
|
| }
|
|
|
| + virtual bool HasOneTimeSideEffects() const {
|
| + return true;
|
| + }
|
| +
|
| HValue* object() { return OperandAt(0); }
|
| Handle<Map> original_map() { return original_map_; }
|
| Handle<Map> transitioned_map() { return transitioned_map_; }
|
|
|