| Index: src/hydrogen-instructions.h | 
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h | 
| index daeba2d2a36faa712650521b052595522047c8e0..f6b6ae0a886d762609aff4190ff064db691c5401 100644 | 
| --- a/src/hydrogen-instructions.h | 
| +++ b/src/hydrogen-instructions.h | 
| @@ -3227,7 +3227,7 @@ class HConstant: public HTemplateInstruction<0> { | 
| return int32_value_; | 
| } | 
| bool HasSmiValue() const { | 
| -    return HasInteger32Value() && Smi::IsValid(Integer32Value()); | 
| +    return has_smi_value_; | 
| } | 
| bool HasDoubleValue() const { return has_double_value_; } | 
| double DoubleValue() const { | 
| @@ -3327,6 +3327,7 @@ class HConstant: public HTemplateInstruction<0> { | 
| // int32_value_ and double_value_ hold valid, safe representations | 
| // of the constant.  has_int32_value_ implies has_double_value_ but | 
| // not the converse. | 
| +  bool has_smi_value_ : 1; | 
| bool has_int32_value_ : 1; | 
| bool has_double_value_ : 1; | 
| bool is_internalized_string_ : 1;  // TODO(yangguo): make this part of HType. | 
| @@ -3395,6 +3396,16 @@ class HBinaryOperation: public HTemplateInstruction<3> { | 
| virtual Representation RepresentationFromInputs(); | 
| virtual void AssumeRepresentation(Representation r); | 
|  | 
| +  virtual void UpdateRepresentation(Representation new_rep, | 
| +                                    HInferRepresentation* h_infer, | 
| +                                    const char* reason) { | 
| +    // By default, binary operations don't handle Smis. | 
| +    if (new_rep.IsSmi()) { | 
| +      new_rep = Representation::Integer32(); | 
| +    } | 
| +    HValue::UpdateRepresentation(new_rep, h_infer, reason); | 
| +  } | 
| + | 
| virtual bool IsCommutative() const { return false; } | 
|  | 
| virtual void PrintDataTo(StringStream* stream); | 
| @@ -3556,22 +3567,13 @@ class HBoundsCheck: public HTemplateInstruction<2> { | 
| // it makes sense to invoke this constructor directly. | 
| HBoundsCheck(HValue* index, | 
| HValue* length, | 
| -               BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY, | 
| -               Representation r = Representation::None()) | 
| +               BoundsCheckKeyMode key_mode = DONT_ALLOW_SMI_KEY) | 
| : key_mode_(key_mode), skip_check_(false), | 
| base_(NULL), offset_(0), scale_(0), | 
| responsibility_direction_(DIRECTION_NONE) { | 
| SetOperandAt(0, index); | 
| SetOperandAt(1, length); | 
| -    if (r.IsNone()) { | 
| -      // In the normal compilation pipeline the representation is flexible | 
| -      // (see InferRepresentation). | 
| -      SetFlag(kFlexibleRepresentation); | 
| -    } else { | 
| -      // When compiling stubs we want to set the representation explicitly | 
| -      // so the compilation pipeline can skip the HInferRepresentation phase. | 
| -      set_representation(r); | 
| -    } | 
| +    SetFlag(kFlexibleRepresentation); | 
| SetFlag(kUseGVN); | 
| } | 
|  | 
| @@ -3718,7 +3720,9 @@ class HBitwiseBinaryOperation: public HBinaryOperation { | 
| HInferRepresentation* h_infer, | 
| const char* reason) { | 
| // We only generate either int32 or generic tagged bitwise operations. | 
| -    if (new_rep.IsDouble()) new_rep = Representation::Integer32(); | 
| +    if (new_rep.IsSmi() || new_rep.IsDouble()) { | 
| +      new_rep = Representation::Integer32(); | 
| +    } | 
| HValue::UpdateRepresentation(new_rep, h_infer, reason); | 
| } | 
|  | 
|  |