| Index: src/ic.cc | 
| diff --git a/src/ic.cc b/src/ic.cc | 
| index 643fa884139fa1d041d94d7d7092feb748a508d9..9772b94a98fe50ff31db1ec54271630cb35ce701 100644 | 
| --- a/src/ic.cc | 
| +++ b/src/ic.cc | 
| @@ -352,9 +352,9 @@ void IC::Clear(Address address) { | 
| return KeyedStoreIC::Clear(address, target); | 
| case Code::CALL_IC: return CallIC::Clear(address, target); | 
| case Code::KEYED_CALL_IC:  return KeyedCallIC::Clear(address, target); | 
| +    case Code::COMPARE_IC: return CompareIC::Clear(address, target); | 
| case Code::UNARY_OP_IC: | 
| case Code::BINARY_OP_IC: | 
| -    case Code::COMPARE_IC: | 
| case Code::TO_BOOLEAN_IC: | 
| // Clearing these is tricky and does not | 
| // make any performance difference. | 
| @@ -365,9 +365,8 @@ void IC::Clear(Address address) { | 
|  | 
|  | 
| void CallICBase::Clear(Address address, Code* target) { | 
| +  if (target->ic_state() == UNINITIALIZED) return; | 
| bool contextual = CallICBase::Contextual::decode(target->extra_ic_state()); | 
| -  State state = target->ic_state(); | 
| -  if (state == UNINITIALIZED) return; | 
| Code* code = | 
| Isolate::Current()->stub_cache()->FindCallInitialize( | 
| target->arguments_count(), | 
| @@ -410,6 +409,17 @@ void KeyedStoreIC::Clear(Address address, Code* target) { | 
| } | 
|  | 
|  | 
| +void CompareIC::Clear(Address address, Code* target) { | 
| +  // Only clear ICCompareStubs, we currently cannot clear generic CompareStubs. | 
| +  if (target->major_key() != CodeStub::CompareIC) return; | 
| +  // Only clear CompareICs that can retain objects. | 
| +  if (target->compare_state() != KNOWN_OBJECTS) return; | 
| +  Token::Value op = CompareIC::ComputeOperation(target); | 
| +  SetTargetAtAddress(address, GetRawUninitialized(op)); | 
| +  PatchInlinedSmiCode(address, DISABLE_INLINED_SMI_CHECK); | 
| +} | 
| + | 
| + | 
| static bool HasInterceptorGetter(JSObject* object) { | 
| return !object->GetNamedInterceptor()->getter()->IsUndefined(); | 
| } | 
| @@ -2396,7 +2406,7 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { | 
|  | 
| // Activate inlined smi code. | 
| if (previous_type == BinaryOpIC::UNINITIALIZED) { | 
| -      PatchInlinedSmiCode(ic.address()); | 
| +      PatchInlinedSmiCode(ic.address(), ENABLE_INLINED_SMI_CHECK); | 
| } | 
| } | 
|  | 
| @@ -2457,6 +2467,14 @@ RUNTIME_FUNCTION(MaybeObject*, BinaryOp_Patch) { | 
| } | 
|  | 
|  | 
| +Code* CompareIC::GetRawUninitialized(Token::Value op) { | 
| +  ICCompareStub stub(op, UNINITIALIZED); | 
| +  Code* code = NULL; | 
| +  CHECK(stub.FindCodeInCache(&code)); | 
| +  return code; | 
| +} | 
| + | 
| + | 
| Handle<Code> CompareIC::GetUninitialized(Token::Value op) { | 
| ICCompareStub stub(op, UNINITIALIZED); | 
| return stub.GetCode(); | 
| @@ -2471,6 +2489,12 @@ CompareIC::State CompareIC::ComputeState(Code* target) { | 
| } | 
|  | 
|  | 
| +Token::Value CompareIC::ComputeOperation(Code* target) { | 
| +  ASSERT(target->major_key() == CodeStub::CompareIC); | 
| +  return static_cast<Token::Value>(target->compare_operation()); | 
| +} | 
| + | 
| + | 
| const char* CompareIC::GetStateName(State state) { | 
| switch (state) { | 
| case UNINITIALIZED: return "UNINITIALIZED"; | 
|  |