| Index: runtime/vm/flow_graph_optimizer.cc | 
| =================================================================== | 
| --- runtime/vm/flow_graph_optimizer.cc	(revision 9640) | 
| +++ runtime/vm/flow_graph_optimizer.cc	(working copy) | 
| @@ -238,39 +238,6 @@ | 
| } | 
|  | 
|  | 
| -// Returns ICData with num_args_checked == 1. If necessary creates a new ICData | 
| -// object that contains unique receiver class-ids | 
| -static RawICData* ToUnaryClassChecks(const ICData& ic_data) { | 
| -  ASSERT(!ic_data.IsNull()); | 
| -  ASSERT(ic_data.num_args_tested() != 0); | 
| -  if (ic_data.num_args_tested() == 1) return ic_data.raw(); | 
| -  const intptr_t kNumArgsTested = 1; | 
| -  ICData& result = ICData::Handle(ICData::New( | 
| -      Function::Handle(ic_data.function()), | 
| -      String::Handle(ic_data.target_name()), | 
| -      ic_data.id(), | 
| -      kNumArgsTested)); | 
| -  for (intptr_t i = 0; i < ic_data.NumberOfChecks(); i++) { | 
| -    const intptr_t class_id = ic_data.GetReceiverClassIdAt(i); | 
| -    intptr_t duplicate_class_id = -1; | 
| -    for (intptr_t k = 0; k < result.NumberOfChecks(); k++) { | 
| -      if (class_id == result.GetReceiverClassIdAt(k)) { | 
| -        duplicate_class_id = k; | 
| -        break; | 
| -      } | 
| -    } | 
| -    if (duplicate_class_id >= 0) { | 
| -      ASSERT(result.GetTargetAt(duplicate_class_id) == ic_data.GetTargetAt(i)); | 
| -    } else { | 
| -      // This will make sure that Smi is first if it exists. | 
| -      result.AddReceiverCheck(class_id, | 
| -                              Function::Handle(ic_data.GetTargetAt(i))); | 
| -    } | 
| -  } | 
| -  return result.raw(); | 
| -} | 
| - | 
| - | 
| // Only unique implicit instance getters can be currently handled. | 
| bool FlowGraphOptimizer::TryInlineInstanceGetter(BindInstr* instr, | 
| InstanceCallComp* comp) { | 
| @@ -409,7 +376,7 @@ | 
| if (comp->ic_data()->NumberOfChecks() <= kMaxChecks) { | 
| PolymorphicInstanceCallComp* call = new PolymorphicInstanceCallComp(comp); | 
| ICData& unary_checks = | 
| -          ICData::ZoneHandle(ToUnaryClassChecks(*comp->ic_data())); | 
| +          ICData::ZoneHandle(comp->ic_data()->AsUnaryClassChecks()); | 
| call->set_ic_data(&unary_checks); | 
| instr->set_computation(call); | 
| } | 
| @@ -600,13 +567,18 @@ | 
|  | 
| void FlowGraphOptimizer::VisitEqualityCompare(EqualityCompareComp* comp, | 
| BindInstr* instr) { | 
| -  if (comp->HasICData()) { | 
| -    // Replace binary checks with unary ones since EmitNative expects it. | 
| -    ICData& unary_checks = | 
| -        ICData::Handle(ToUnaryClassChecks(*comp->ic_data())); | 
| -    comp->set_ic_data(&unary_checks); | 
| +  if (comp->HasICData() && (comp->ic_data()->NumberOfChecks() == 1)) { | 
| +    ASSERT(comp->ic_data()->num_args_tested() == 2); | 
| +    GrowableArray<intptr_t> class_ids; | 
| +    Function& target = Function::Handle(); | 
| +    comp->ic_data()->GetCheckAt(0, &class_ids, &target); | 
| +    // TODO(srdjan): allow for mixed mode comparison. | 
| +    if ((class_ids[0] == kSmi) && (class_ids[1] == kSmi)) { | 
| +      comp->set_receiver_class_id(kSmi); | 
| +    } else if ((class_ids[0] == kDouble) && (class_ids[1] == kDouble)) { | 
| +      comp->set_receiver_class_id(kDouble); | 
| +    } | 
| } | 
| - | 
| TryFuseComparisonWithBranch(instr, comp); | 
| } | 
|  | 
|  |