| Index: src/hydrogen-instructions.h | 
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h | 
| index 0fdbb1f63f9d94b3ad5e59456562570d9ca7d982..ee25193441e33f39056fcecebb99931949ef8cbf 100644 | 
| --- a/src/hydrogen-instructions.h | 
| +++ b/src/hydrogen-instructions.h | 
| @@ -1888,6 +1888,7 @@ class HJSArrayLength: public HTemplateInstruction<2> { | 
| class HFixedArrayBaseLength: public HUnaryOperation { | 
| public: | 
| explicit HFixedArrayBaseLength(HValue* value) : HUnaryOperation(value) { | 
| +    set_type(HType::Smi()); | 
| set_representation(Representation::Tagged()); | 
| SetFlag(kUseGVN); | 
| SetGVNFlag(kDependsOnArrayLengths); | 
| @@ -2757,17 +2758,31 @@ class HAccessArgumentsAt: public HTemplateInstruction<3> { | 
| }; | 
|  | 
|  | 
| +enum BoundsCheckKeyMode { | 
| +  DONT_ALLOW_SMI_KEY, | 
| +  ALLOW_SMI_KEY | 
| +}; | 
| + | 
| + | 
| class HBoundsCheck: public HTemplateInstruction<2> { | 
| public: | 
| -  HBoundsCheck(HValue* index, HValue* length) { | 
| +  HBoundsCheck(HValue* index, HValue* length, | 
| +               BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY) | 
| +      : key_mode_(key_mode) { | 
| SetOperandAt(0, index); | 
| SetOperandAt(1, length); | 
| set_representation(Representation::Integer32()); | 
| SetFlag(kUseGVN); | 
| } | 
|  | 
| -  virtual Representation RequiredInputRepresentation(int index) { | 
| -    return Representation::Integer32(); | 
| +  virtual Representation RequiredInputRepresentation(int arg_index) { | 
| +    if (index()->representation().IsTagged() && | 
| +        !index()->IsConstant() && | 
| +        key_mode_ == ALLOW_SMI_KEY) { | 
| +      return Representation::Tagged(); | 
| +    } else { | 
| +      return Representation::Integer32(); | 
| +    } | 
| } | 
|  | 
| virtual void PrintDataTo(StringStream* stream); | 
| @@ -2779,6 +2794,7 @@ class HBoundsCheck: public HTemplateInstruction<2> { | 
|  | 
| protected: | 
| virtual bool DataEquals(HValue* other) { return true; } | 
| +  BoundsCheckKeyMode key_mode_; | 
| }; | 
|  | 
|  | 
|  |