| Index: src/hydrogen-instructions.h
|
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
|
| index 1856c80929676e0d363d0f6ebe44a37faa3f44a4..25f63ea7f56f76ec1b6d3164f679fe8b0056009f 100644
|
| --- a/src/hydrogen-instructions.h
|
| +++ b/src/hydrogen-instructions.h
|
| @@ -1,4 +1,4 @@
|
| -// Copyright 2011 the V8 project authors. All rights reserved.
|
| +// Copyright 2012 the V8 project authors. All rights reserved.
|
| // Redistribution and use in source and binary forms, with or without
|
| // modification, are permitted provided that the following conditions are
|
| // met:
|
| @@ -1921,8 +1921,11 @@ class HLoadExternalArrayPointer: public HUnaryOperation {
|
|
|
| class HCheckMap: public HTemplateInstruction<2> {
|
| public:
|
| - HCheckMap(HValue* value, Handle<Map> map, HValue* typecheck = NULL)
|
| - : map_(map) {
|
| + HCheckMap(HValue* value, Handle<Map> map,
|
| + HValue* typecheck = NULL,
|
| + CompareMapMode mode = REQUIRE_EXACT_MAP)
|
| + : map_(map),
|
| + mode_(mode) {
|
| SetOperandAt(0, value);
|
| // If callers don't depend on a typecheck, they can pass in NULL. In that
|
| // case we use a copy of the |value| argument as a dummy value.
|
| @@ -1930,6 +1933,9 @@ class HCheckMap: public HTemplateInstruction<2> {
|
| set_representation(Representation::Tagged());
|
| SetFlag(kUseGVN);
|
| SetFlag(kDependsOnMaps);
|
| + has_element_transitions_ =
|
| + map->LookupElementsTransitionMap(FAST_DOUBLE_ELEMENTS, NULL) != NULL ||
|
| + map->LookupElementsTransitionMap(FAST_ELEMENTS, NULL) != NULL;
|
| }
|
|
|
| virtual Representation RequiredInputRepresentation(int index) {
|
| @@ -1940,17 +1946,24 @@ class HCheckMap: public HTemplateInstruction<2> {
|
|
|
| HValue* value() { return OperandAt(0); }
|
| Handle<Map> map() const { return map_; }
|
| + CompareMapMode mode() const { return mode_; }
|
|
|
| DECLARE_CONCRETE_INSTRUCTION(CheckMap)
|
|
|
| protected:
|
| virtual bool DataEquals(HValue* other) {
|
| HCheckMap* b = HCheckMap::cast(other);
|
| - return map_.is_identical_to(b->map());
|
| + // Two CheckMaps instructions are DataEqual if their maps are identical and
|
| + // they have the same mode. The mode comparison can be ignored if the map
|
| + // has no elements transitions.
|
| + return map_.is_identical_to(b->map()) &&
|
| + (b->mode() == mode() || !has_element_transitions_);
|
| }
|
|
|
| private:
|
| + bool has_element_transitions_;
|
| Handle<Map> map_;
|
| + CompareMapMode mode_;
|
| };
|
|
|
|
|
|
|