| Index: src/hydrogen-instructions.h | 
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h | 
| index 3c4867266a0edb70f6746bcb3f10f18d95483f38..296bd3015ff4e5fa57cda58bcfd4419bb2892ddc 100644 | 
| --- a/src/hydrogen-instructions.h | 
| +++ b/src/hydrogen-instructions.h | 
| @@ -180,7 +180,11 @@ class LChunkBuilder; | 
| V(UnaryMathOperation)                        \ | 
| V(UnknownOSRValue)                           \ | 
| V(UseConst)                                  \ | 
| -  V(ValueOf) | 
| +  V(ValueOf)                                   \ | 
| +  V(ForInPrepareMap)                           \ | 
| +  V(ForInCacheArray)                           \ | 
| +  V(CheckMapValue)                             \ | 
| +  V(LoadFieldByIndex) | 
|  | 
| #define GVN_FLAG_LIST(V)                       \ | 
| V(Calls)                                     \ | 
| @@ -2011,7 +2015,8 @@ class HLoadExternalArrayPointer: public HUnaryOperation { | 
|  | 
| class HCheckMap: public HTemplateInstruction<2> { | 
| public: | 
| -  HCheckMap(HValue* value, Handle<Map> map, | 
| +  HCheckMap(HValue* value, | 
| +            Handle<Map> map, | 
| HValue* typecheck = NULL, | 
| CompareMapMode mode = REQUIRE_EXACT_MAP) | 
| : map_(map), | 
| @@ -3814,7 +3819,12 @@ class HLoadFunctionPrototype: public HUnaryOperation { | 
|  | 
| class HLoadKeyedFastElement: public HTemplateInstruction<2> { | 
| public: | 
| -  HLoadKeyedFastElement(HValue* obj, HValue* key) { | 
| +  enum HoleCheckMode { PERFORM_HOLE_CHECK, OMIT_HOLE_CHECK }; | 
| + | 
| +  HLoadKeyedFastElement(HValue* obj, | 
| +                        HValue* key, | 
| +                        HoleCheckMode hole_check_mode = PERFORM_HOLE_CHECK) | 
| +      : hole_check_mode_(hole_check_mode) { | 
| SetOperandAt(0, obj); | 
| SetOperandAt(1, key); | 
| set_representation(Representation::Tagged()); | 
| @@ -3839,7 +3849,14 @@ class HLoadKeyedFastElement: public HTemplateInstruction<2> { | 
| DECLARE_CONCRETE_INSTRUCTION(LoadKeyedFastElement) | 
|  | 
| protected: | 
| -  virtual bool DataEquals(HValue* other) { return true; } | 
| +  virtual bool DataEquals(HValue* other) { | 
| +    if (!other->IsLoadKeyedFastElement()) return false; | 
| +    HLoadKeyedFastElement* other_load = HLoadKeyedFastElement::cast(other); | 
| +    return hole_check_mode_ == other_load->hole_check_mode_; | 
| +  } | 
| + | 
| + private: | 
| +  HoleCheckMode hole_check_mode_; | 
| }; | 
|  | 
|  | 
| @@ -3943,6 +3960,8 @@ class HLoadKeyedGeneric: public HTemplateInstruction<3> { | 
| return Representation::Tagged(); | 
| } | 
|  | 
| +  virtual HValue* Canonicalize(); | 
| + | 
| DECLARE_CONCRETE_INSTRUCTION(LoadKeyedGeneric) | 
| }; | 
|  | 
| @@ -4617,6 +4636,133 @@ class HIn: public HTemplateInstruction<3> { | 
| DECLARE_CONCRETE_INSTRUCTION(In) | 
| }; | 
|  | 
| + | 
| +class HCheckMapValue: public HTemplateInstruction<2> { | 
| + public: | 
| +  HCheckMapValue(HValue* value, | 
| +                 HValue* map) { | 
| +    SetOperandAt(0, value); | 
| +    SetOperandAt(1, map); | 
| +    set_representation(Representation::Tagged()); | 
| +    SetFlag(kUseGVN); | 
| +    SetGVNFlag(kDependsOnMaps); | 
| +    SetGVNFlag(kDependsOnElementsKind); | 
| +  } | 
| + | 
| +  virtual Representation RequiredInputRepresentation(int index) { | 
| +    return Representation::Tagged(); | 
| +  } | 
| + | 
| +  virtual void PrintDataTo(StringStream* stream); | 
| + | 
| +  virtual HType CalculateInferredType() { | 
| +    return HType::Tagged(); | 
| +  } | 
| + | 
| +  HValue* value() { return OperandAt(0); } | 
| +  HValue* map() { return OperandAt(1); } | 
| + | 
| +  DECLARE_CONCRETE_INSTRUCTION(CheckMapValue) | 
| + | 
| + protected: | 
| +  virtual bool DataEquals(HValue* other) { | 
| +    return true; | 
| +  } | 
| +}; | 
| + | 
| + | 
| +class HForInPrepareMap : public HTemplateInstruction<2> { | 
| + public: | 
| +  HForInPrepareMap(HValue* context, | 
| +                   HValue* object) { | 
| +    SetOperandAt(0, context); | 
| +    SetOperandAt(1, object); | 
| +    set_representation(Representation::Tagged()); | 
| +    SetAllSideEffects(); | 
| +  } | 
| + | 
| +  virtual Representation RequiredInputRepresentation(int index) { | 
| +    return Representation::Tagged(); | 
| +  } | 
| + | 
| +  HValue* context() { return OperandAt(0); } | 
| +  HValue* enumerable() { return OperandAt(1); } | 
| + | 
| +  virtual void PrintDataTo(StringStream* stream); | 
| + | 
| +  virtual HType CalculateInferredType() { | 
| +    return HType::Tagged(); | 
| +  } | 
| + | 
| +  DECLARE_CONCRETE_INSTRUCTION(ForInPrepareMap); | 
| +}; | 
| + | 
| + | 
| +class HForInCacheArray : public HTemplateInstruction<2> { | 
| + public: | 
| +  HForInCacheArray(HValue* enumerable, | 
| +                   HValue* keys, | 
| +                   int idx) : idx_(idx) { | 
| +    SetOperandAt(0, enumerable); | 
| +    SetOperandAt(1, keys); | 
| +    set_representation(Representation::Tagged()); | 
| +  } | 
| + | 
| +  virtual Representation RequiredInputRepresentation(int index) { | 
| +    return Representation::Tagged(); | 
| +  } | 
| + | 
| +  HValue* enumerable() { return OperandAt(0); } | 
| +  HValue* keys() { return OperandAt(1); } | 
| +  int idx() { return idx_; } | 
| + | 
| +  HForInCacheArray* index_cache() { | 
| +    return index_cache_; | 
| +  } | 
| + | 
| +  void set_index_cache(HForInCacheArray* index_cache) { | 
| +    index_cache_ = index_cache; | 
| +  } | 
| + | 
| +  virtual void PrintDataTo(StringStream* stream); | 
| + | 
| +  virtual HType CalculateInferredType() { | 
| +    return HType::Tagged(); | 
| +  } | 
| + | 
| +  DECLARE_CONCRETE_INSTRUCTION(ForInCacheArray); | 
| + private: | 
| +  int idx_; | 
| +  HForInCacheArray* index_cache_; | 
| +}; | 
| + | 
| + | 
| +class HLoadFieldByIndex : public HTemplateInstruction<2> { | 
| + public: | 
| +  HLoadFieldByIndex(HValue* object, | 
| +                    HValue* index) { | 
| +    SetOperandAt(0, object); | 
| +    SetOperandAt(1, index); | 
| +    set_representation(Representation::Tagged()); | 
| +  } | 
| + | 
| +  virtual Representation RequiredInputRepresentation(int index) { | 
| +    return Representation::Tagged(); | 
| +  } | 
| + | 
| +  HValue* object() { return OperandAt(0); } | 
| +  HValue* index() { return OperandAt(1); } | 
| + | 
| +  virtual void PrintDataTo(StringStream* stream); | 
| + | 
| +  virtual HType CalculateInferredType() { | 
| +    return HType::Tagged(); | 
| +  } | 
| + | 
| +  DECLARE_CONCRETE_INSTRUCTION(LoadFieldByIndex); | 
| +}; | 
| + | 
| + | 
| #undef DECLARE_INSTRUCTION | 
| #undef DECLARE_CONCRETE_INSTRUCTION | 
|  | 
|  |