| Index: src/ia32/lithium-codegen-ia32.cc
 | 
| diff --git a/src/ia32/lithium-codegen-ia32.cc b/src/ia32/lithium-codegen-ia32.cc
 | 
| index eaab558ce6688d3a7b5b146be10414ee31555899..18c95cc65b93480aaf6a0c2ea442d842b48f12f2 100644
 | 
| --- a/src/ia32/lithium-codegen-ia32.cc
 | 
| +++ b/src/ia32/lithium-codegen-ia32.cc
 | 
| @@ -1810,8 +1810,11 @@ void LCodeGen::DoValueOf(LValueOf* instr) {
 | 
|    ASSERT(input.is(result));
 | 
|  
 | 
|    Label done;
 | 
| -  // If the object is a smi return the object.
 | 
| -  __ JumpIfSmi(input, &done, Label::kNear);
 | 
| +
 | 
| +  if (!instr->hydrogen()->value()->IsHeapObject()) {
 | 
| +    // If the object is a smi return the object.
 | 
| +    __ JumpIfSmi(input, &done, Label::kNear);
 | 
| +  }
 | 
|  
 | 
|    // If the object is not a value type, return the object.
 | 
|    __ CmpObjectType(input, JS_VALUE_TYPE, map);
 | 
| @@ -2364,8 +2367,11 @@ void LCodeGen::DoIsObjectAndBranch(LIsObjectAndBranch* instr) {
 | 
|  
 | 
|  Condition LCodeGen::EmitIsString(Register input,
 | 
|                                   Register temp1,
 | 
| -                                 Label* is_not_string) {
 | 
| -  __ JumpIfSmi(input, is_not_string);
 | 
| +                                 Label* is_not_string,
 | 
| +                                 SmiCheck check_needed = INLINE_SMI_CHECK) {
 | 
| +  if (check_needed == INLINE_SMI_CHECK) {
 | 
| +    __ JumpIfSmi(input, is_not_string);
 | 
| +  }
 | 
|  
 | 
|    Condition cond = masm_->IsObjectStringType(input, temp1, temp1);
 | 
|  
 | 
| @@ -2377,7 +2383,12 @@ void LCodeGen::DoIsStringAndBranch(LIsStringAndBranch* instr) {
 | 
|    Register reg = ToRegister(instr->value());
 | 
|    Register temp = ToRegister(instr->temp());
 | 
|  
 | 
| -  Condition true_cond = EmitIsString(reg, temp, instr->FalseLabel(chunk_));
 | 
| +  SmiCheck check_needed =
 | 
| +      instr->hydrogen()->value()->IsHeapObject()
 | 
| +          ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
| +
 | 
| +  Condition true_cond = EmitIsString(
 | 
| +      reg, temp, instr->FalseLabel(chunk_), check_needed);
 | 
|  
 | 
|    EmitBranch(instr, true_cond);
 | 
|  }
 | 
| @@ -2395,8 +2406,10 @@ void LCodeGen::DoIsUndetectableAndBranch(LIsUndetectableAndBranch* instr) {
 | 
|    Register input = ToRegister(instr->value());
 | 
|    Register temp = ToRegister(instr->temp());
 | 
|  
 | 
| -  STATIC_ASSERT(kSmiTag == 0);
 | 
| -  __ JumpIfSmi(input, instr->FalseLabel(chunk_));
 | 
| +  if (!instr->hydrogen()->value()->IsHeapObject()) {
 | 
| +    STATIC_ASSERT(kSmiTag == 0);
 | 
| +    __ JumpIfSmi(input, instr->FalseLabel(chunk_));
 | 
| +  }
 | 
|    __ mov(temp, FieldOperand(input, HeapObject::kMapOffset));
 | 
|    __ test_b(FieldOperand(temp, Map::kBitFieldOffset),
 | 
|              1 << Map::kIsUndetectable);
 | 
| @@ -2461,7 +2474,9 @@ void LCodeGen::DoHasInstanceTypeAndBranch(LHasInstanceTypeAndBranch* instr) {
 | 
|    Register input = ToRegister(instr->value());
 | 
|    Register temp = ToRegister(instr->temp());
 | 
|  
 | 
| -  __ JumpIfSmi(input, instr->FalseLabel(chunk_));
 | 
| +  if (!instr->hydrogen()->value()->IsHeapObject()) {
 | 
| +    __ JumpIfSmi(input, instr->FalseLabel(chunk_));
 | 
| +  }
 | 
|  
 | 
|    __ CmpObjectType(input, TestType(instr->hydrogen()), temp);
 | 
|    EmitBranch(instr, BranchCondition(instr->hydrogen()));
 | 
| @@ -2898,9 +2913,9 @@ void LCodeGen::DoStoreContextSlot(LStoreContextSlot* instr) {
 | 
|  
 | 
|    __ mov(target, value);
 | 
|    if (instr->hydrogen()->NeedsWriteBarrier()) {
 | 
| -    HType type = instr->hydrogen()->value()->type();
 | 
|      SmiCheck check_needed =
 | 
| -        type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
| +        instr->hydrogen()->value()->IsHeapObject()
 | 
| +            ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
|      Register temp = ToRegister(instr->temp());
 | 
|      int offset = Context::SlotOffset(instr->slot_index());
 | 
|      __ RecordWriteContextSlot(context,
 | 
| @@ -4269,9 +4284,9 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) {
 | 
|    }
 | 
|  
 | 
|    // Do the store.
 | 
| -  HType type = instr->hydrogen()->value()->type();
 | 
|    SmiCheck check_needed =
 | 
| -      type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
| +      instr->hydrogen()->value()->IsHeapObject()
 | 
| +          ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
|  
 | 
|    Register write_register = object;
 | 
|    if (!access.IsInobject()) {
 | 
| @@ -4508,9 +4523,9 @@ void LCodeGen::DoStoreKeyedFixedArray(LStoreKeyed* instr) {
 | 
|      ASSERT(instr->value()->IsRegister());
 | 
|      Register value = ToRegister(instr->value());
 | 
|      ASSERT(!instr->key()->IsConstantOperand());
 | 
| -    HType type = instr->hydrogen()->value()->type();
 | 
|      SmiCheck check_needed =
 | 
| -        type.IsHeapObject() ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
| +        instr->hydrogen()->value()->IsHeapObject()
 | 
| +          ? OMIT_SMI_CHECK : INLINE_SMI_CHECK;
 | 
|      // Compute address of modified element and store it into key register.
 | 
|      __ lea(key, operand);
 | 
|      __ RecordWrite(elements,
 | 
| @@ -5652,9 +5667,11 @@ void LCodeGen::DoCheckSmi(LCheckSmi* instr) {
 | 
|  
 | 
|  
 | 
|  void LCodeGen::DoCheckNonSmi(LCheckNonSmi* instr) {
 | 
| -  LOperand* input = instr->value();
 | 
| -  __ test(ToOperand(input), Immediate(kSmiTagMask));
 | 
| -  DeoptimizeIf(zero, instr->environment());
 | 
| +  if (!instr->hydrogen()->value()->IsHeapObject()) {
 | 
| +    LOperand* input = instr->value();
 | 
| +    __ test(ToOperand(input), Immediate(kSmiTagMask));
 | 
| +    DeoptimizeIf(zero, instr->environment());
 | 
| +  }
 | 
|  }
 | 
|  
 | 
|  
 | 
| 
 |