| Index: src/hydrogen-instructions.h
 | 
| diff --git a/src/hydrogen-instructions.h b/src/hydrogen-instructions.h
 | 
| index f977a750d946a6b24d657b08229fc4a238c368b2..b54eb7bdcfdbc83fe8a572e4cf5cf12eb3066f13 100644
 | 
| --- a/src/hydrogen-instructions.h
 | 
| +++ b/src/hydrogen-instructions.h
 | 
| @@ -97,6 +97,7 @@ class LChunkBuilder;
 | 
|    V(ClampToUint8)                              \
 | 
|    V(ClassOfTestAndBranch)                      \
 | 
|    V(CompareNumericAndBranch)                   \
 | 
| +  V(CompareHoleAndBranch)                      \
 | 
|    V(CompareGeneric)                            \
 | 
|    V(CompareObjectEqAndBranch)                  \
 | 
|    V(CompareMap)                                \
 | 
| @@ -802,10 +803,10 @@ class HValue: public ZoneObject {
 | 
|    bool CheckFlag(Flag f) const { return (flags_ & (1 << f)) != 0; }
 | 
|  
 | 
|    // Returns true if the flag specified is set for all uses, false otherwise.
 | 
| -  bool CheckUsesForFlag(Flag f);
 | 
| +  bool CheckUsesForFlag(Flag f) const;
 | 
|    // Returns true if the flag specified is set for all uses, and this set
 | 
|    // of uses is non-empty.
 | 
| -  bool HasAtLeastOneUseWithFlagAndNoneWithout(Flag f);
 | 
| +  bool HasAtLeastOneUseWithFlagAndNoneWithout(Flag f) const;
 | 
|  
 | 
|    GVNFlagSet gvn_flags() const { return gvn_flags_; }
 | 
|    void SetGVNFlag(GVNFlag f) { gvn_flags_.Add(f); }
 | 
| @@ -1518,15 +1519,13 @@ class HChange: public HUnaryOperation {
 | 
|    HChange(HValue* value,
 | 
|            Representation to,
 | 
|            bool is_truncating_to_smi,
 | 
| -          bool is_truncating_to_int32,
 | 
| -          bool allow_undefined_as_nan)
 | 
| +          bool is_truncating_to_int32)
 | 
|        : HUnaryOperation(value) {
 | 
|      ASSERT(!value->representation().IsNone());
 | 
|      ASSERT(!to.IsNone());
 | 
|      ASSERT(!value->representation().Equals(to));
 | 
|      set_representation(to);
 | 
|      SetFlag(kUseGVN);
 | 
| -    if (allow_undefined_as_nan) SetFlag(kAllowUndefinedAsNaN);
 | 
|      if (is_truncating_to_smi) SetFlag(kTruncatingToSmi);
 | 
|      if (is_truncating_to_int32) SetFlag(kTruncatingToInt32);
 | 
|      if (value->representation().IsSmi() || value->type().IsSmi()) {
 | 
| @@ -1537,15 +1536,16 @@ class HChange: public HUnaryOperation {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  bool can_convert_undefined_to_nan() {
 | 
| +    return CheckUsesForFlag(kAllowUndefinedAsNaN);
 | 
| +  }
 | 
| +
 | 
|    virtual HValue* EnsureAndPropagateNotMinusZero(BitVector* visited);
 | 
|    virtual HType CalculateInferredType();
 | 
|    virtual HValue* Canonicalize();
 | 
|  
 | 
|    Representation from() const { return value()->representation(); }
 | 
|    Representation to() const { return representation(); }
 | 
| -  bool allow_undefined_as_nan() const {
 | 
| -    return CheckFlag(kAllowUndefinedAsNaN);
 | 
| -  }
 | 
|    bool deoptimize_on_minus_zero() const {
 | 
|      return CheckFlag(kBailoutOnMinusZero);
 | 
|    }
 | 
| @@ -3945,6 +3945,32 @@ class HCompareNumericAndBranch: public HTemplateControlInstruction<2, 2> {
 | 
|  };
 | 
|  
 | 
|  
 | 
| +class HCompareHoleAndBranch: public HTemplateControlInstruction<2, 1> {
 | 
| + public:
 | 
| +  // TODO(danno): make this private when the IfBuilder properly constructs
 | 
| +  // control flow instructions.
 | 
| +  explicit HCompareHoleAndBranch(HValue* object) {
 | 
| +    SetFlag(kFlexibleRepresentation);
 | 
| +    SetFlag(kAllowUndefinedAsNaN);
 | 
| +    SetOperandAt(0, object);
 | 
| +  }
 | 
| +
 | 
| +  DECLARE_INSTRUCTION_FACTORY_P1(HCompareHoleAndBranch, HValue*);
 | 
| +
 | 
| +  HValue* object() { return OperandAt(0); }
 | 
| +
 | 
| +  virtual void InferRepresentation(HInferRepresentationPhase* h_infer);
 | 
| +
 | 
| +  virtual Representation RequiredInputRepresentation(int index) {
 | 
| +    return representation();
 | 
| +  }
 | 
| +
 | 
| +  virtual void PrintDataTo(StringStream* stream);
 | 
| +
 | 
| +  DECLARE_CONCRETE_INSTRUCTION(CompareHoleAndBranch)
 | 
| +};
 | 
| +
 | 
| +
 | 
|  class HCompareObjectEqAndBranch: public HTemplateControlInstruction<2, 2> {
 | 
|   public:
 | 
|    // TODO(danno): make this private when the IfBuilder properly constructs
 | 
| @@ -4328,6 +4354,11 @@ class HAdd: public HArithmeticBinaryOperation {
 | 
|      }
 | 
|    }
 | 
|  
 | 
| +  virtual void RepresentationChanged(Representation to) {
 | 
| +    if (to.IsTagged()) ClearFlag(kAllowUndefinedAsNaN);
 | 
| +    HArithmeticBinaryOperation::RepresentationChanged(to);
 | 
| +  }
 | 
| +
 | 
|    DECLARE_CONCRETE_INSTRUCTION(Add)
 | 
|  
 | 
|   protected:
 | 
| 
 |