| Index: src/mips/lithium-codegen-mips.cc | 
| diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc | 
| index ca74800ff5d4a92673fd829fad82f9b26b96aaed..d8742a6a4f9d342a941874ea44becc967ca688d9 100644 | 
| --- a/src/mips/lithium-codegen-mips.cc | 
| +++ b/src/mips/lithium-codegen-mips.cc | 
| @@ -576,7 +576,7 @@ void LCodeGen::WriteTranslation(LEnvironment* environment, | 
| pushed_arguments_index, | 
| pushed_arguments_count); | 
| bool has_closure_id = !info()->closure().is_null() && | 
| -      *info()->closure() != *environment->closure(); | 
| +      !info()->closure().is_identical_to(environment->closure()); | 
| int closure_id = has_closure_id | 
| ? DefineDeoptimizationLiteral(environment->closure()) | 
| : Translation::kSelfLiteralId; | 
| @@ -888,10 +888,13 @@ void LCodeGen::PopulateDeoptimizationData(Handle<Code> code) { | 
|  | 
| Handle<FixedArray> literals = | 
| factory()->NewFixedArray(deoptimization_literals_.length(), TENURED); | 
| -  for (int i = 0; i < deoptimization_literals_.length(); i++) { | 
| -    literals->set(i, *deoptimization_literals_[i]); | 
| +  { ALLOW_HANDLE_DEREF(isolate(), | 
| +                       "copying a ZoneList of handles into a FixedArray"); | 
| +    for (int i = 0; i < deoptimization_literals_.length(); i++) { | 
| +      literals->set(i, *deoptimization_literals_[i]); | 
| +    } | 
| +    data->SetLiteralArray(*literals); | 
| } | 
| -  data->SetLiteralArray(*literals); | 
|  | 
| data->SetOsrAstId(Smi::FromInt(info_->osr_ast_id().ToInt())); | 
| data->SetOsrPcOffset(Smi::FromInt(osr_pc_offset_)); | 
| @@ -1473,6 +1476,7 @@ void LCodeGen::DoConstantD(LConstantD* instr) { | 
|  | 
| void LCodeGen::DoConstantT(LConstantT* instr) { | 
| Handle<Object> value = instr->value(); | 
| +  ALLOW_HANDLE_DEREF(isolate(), "smi check"); | 
| if (value->IsSmi()) { | 
| __ li(ToRegister(instr->result()), Operand(value)); | 
| } else { | 
| @@ -3321,12 +3325,15 @@ void LCodeGen::DoGlobalReceiver(LGlobalReceiver* instr) { | 
|  | 
|  | 
| void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 
| +                                 int formal_parameter_count, | 
| int arity, | 
| LInstruction* instr, | 
| CallKind call_kind, | 
| A1State a1_state) { | 
| -  bool can_invoke_directly = !function->NeedsArgumentsAdaption() || | 
| -      function->shared()->formal_parameter_count() == arity; | 
| +  bool dont_adapt_arguments = | 
| +      formal_parameter_count == SharedFunctionInfo::kDontAdaptArgumentsSentinel; | 
| +  bool can_invoke_directly = | 
| +      dont_adapt_arguments || formal_parameter_count == arity; | 
|  | 
| LPointerMap* pointers = instr->pointer_map(); | 
| RecordPosition(pointers->position()); | 
| @@ -3341,7 +3348,7 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 
|  | 
| // Set r0 to arguments count if adaption is not needed. Assumes that r0 | 
| // is available to write to at this point. | 
| -    if (!function->NeedsArgumentsAdaption()) { | 
| +    if (dont_adapt_arguments) { | 
| __ li(a0, Operand(arity)); | 
| } | 
|  | 
| @@ -3355,7 +3362,9 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 
| } else { | 
| SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); | 
| ParameterCount count(arity); | 
| -    __ InvokeFunction(function, count, CALL_FUNCTION, generator, call_kind); | 
| +    ParameterCount expected(formal_parameter_count); | 
| +    __ InvokeFunction( | 
| +        function, expected, count, CALL_FUNCTION, generator, call_kind); | 
| } | 
|  | 
| // Restore context. | 
| @@ -3366,7 +3375,8 @@ void LCodeGen::CallKnownFunction(Handle<JSFunction> function, | 
| void LCodeGen::DoCallConstantFunction(LCallConstantFunction* instr) { | 
| ASSERT(ToRegister(instr->result()).is(v0)); | 
| __ mov(a0, v0); | 
| -  CallKnownFunction(instr->function(), | 
| +  CallKnownFunction(instr->hydrogen()->function(), | 
| +                    instr->hydrogen()->formal_parameter_count(), | 
| instr->arity(), | 
| instr, | 
| CALL_AS_METHOD, | 
| @@ -3778,7 +3788,8 @@ void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { | 
| ASSERT(ToRegister(instr->function()).is(a1)); | 
| ASSERT(instr->HasPointerMap()); | 
|  | 
| -  if (instr->known_function().is_null()) { | 
| +  Handle<JSFunction> known_function = instr->hydrogen()->known_function(); | 
| +  if (known_function.is_null()) { | 
| LPointerMap* pointers = instr->pointer_map(); | 
| RecordPosition(pointers->position()); | 
| SafepointGenerator generator(this, pointers, Safepoint::kLazyDeopt); | 
| @@ -3786,7 +3797,8 @@ void LCodeGen::DoInvokeFunction(LInvokeFunction* instr) { | 
| __ InvokeFunction(a1, count, CALL_FUNCTION, generator, CALL_AS_METHOD); | 
| __ lw(cp, MemOperand(fp, StandardFrameConstants::kContextOffset)); | 
| } else { | 
| -    CallKnownFunction(instr->known_function(), | 
| +    CallKnownFunction(known_function, | 
| +                      instr->hydrogen()->formal_parameter_count(), | 
| instr->arity(), | 
| instr, | 
| CALL_AS_METHOD, | 
| @@ -3846,7 +3858,8 @@ void LCodeGen::DoCallGlobal(LCallGlobal* instr) { | 
|  | 
| void LCodeGen::DoCallKnownGlobal(LCallKnownGlobal* instr) { | 
| ASSERT(ToRegister(instr->result()).is(v0)); | 
| -  CallKnownFunction(instr->target(), | 
| +  CallKnownFunction(instr->hydrogen()->target(), | 
| +                    instr->hydrogen()->formal_parameter_count(), | 
| instr->arity(), | 
| instr, | 
| CALL_AS_FUNCTION, | 
| @@ -4888,6 +4901,7 @@ void LCodeGen::DoCheckInstanceType(LCheckInstanceType* instr) { | 
| void LCodeGen::DoCheckFunction(LCheckFunction* instr) { | 
| Register reg = ToRegister(instr->value()); | 
| Handle<JSFunction> target = instr->hydrogen()->target(); | 
| +  ALLOW_HANDLE_DEREF(isolate(), "smi check"); | 
| if (isolate()->heap()->InNewSpace(*target)) { | 
| Register reg = ToRegister(instr->value()); | 
| Handle<JSGlobalPropertyCell> cell = | 
| @@ -5027,16 +5041,12 @@ void LCodeGen::DoAllocateObject(LAllocateObject* instr) { | 
| Register scratch = ToRegister(instr->temp()); | 
| Register scratch2 = ToRegister(instr->temp2()); | 
| Handle<JSFunction> constructor = instr->hydrogen()->constructor(); | 
| -  Handle<Map> initial_map(constructor->initial_map()); | 
| +  Handle<Map> initial_map = instr->hydrogen()->constructor_initial_map(); | 
| int instance_size = initial_map->instance_size(); | 
| ASSERT(initial_map->pre_allocated_property_fields() + | 
| initial_map->unused_property_fields() - | 
| initial_map->inobject_properties() == 0); | 
|  | 
| -  // Allocate memory for the object.  The initial map might change when | 
| -  // the constructor's prototype changes, but instance size and property | 
| -  // counts remain unchanged (if slack tracking finished). | 
| -  ASSERT(!constructor->shared()->IsInobjectSlackTrackingInProgress()); | 
| __ Allocate(instance_size, result, scratch, scratch2, deferred->entry(), | 
| TAG_OBJECT); | 
|  | 
| @@ -5071,8 +5081,7 @@ void LCodeGen::DoAllocateObject(LAllocateObject* instr) { | 
|  | 
| void LCodeGen::DoDeferredAllocateObject(LAllocateObject* instr) { | 
| Register result = ToRegister(instr->result()); | 
| -  Handle<JSFunction> constructor = instr->hydrogen()->constructor(); | 
| -  Handle<Map> initial_map(constructor->initial_map()); | 
| +  Handle<Map> initial_map = instr->hydrogen()->constructor_initial_map(); | 
| int instance_size = initial_map->instance_size(); | 
|  | 
| // TODO(3095996): Get rid of this. For now, we need to make the | 
| @@ -5155,7 +5164,7 @@ void LCodeGen::DoDeferredAllocate(LAllocate* instr) { | 
|  | 
|  | 
| void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { | 
| -  Handle<FixedArray> literals(instr->environment()->closure()->literals()); | 
| +  Handle<FixedArray> literals = instr->hydrogen()->literals(); | 
| ElementsKind boilerplate_elements_kind = | 
| instr->hydrogen()->boilerplate_elements_kind(); | 
| AllocationSiteMode allocation_site_mode = | 
| @@ -5213,7 +5222,7 @@ void LCodeGen::DoArrayLiteral(LArrayLiteral* instr) { | 
|  | 
| void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) { | 
| ASSERT(ToRegister(instr->result()).is(v0)); | 
| -  Handle<FixedArray> literals(instr->environment()->closure()->literals()); | 
| +  Handle<FixedArray> literals = instr->hydrogen()->literals(); | 
| Handle<FixedArray> constant_properties = | 
| instr->hydrogen()->constant_properties(); | 
|  | 
| @@ -5227,7 +5236,7 @@ void LCodeGen::DoObjectLiteral(LObjectLiteral* instr) { | 
| __ li(a0, Operand(Smi::FromInt(flags))); | 
|  | 
| // Pick the right runtime function or stub to call. | 
| -  int properties_count = constant_properties->length() / 2; | 
| +  int properties_count = instr->hydrogen()->constant_properties_length() / 2; | 
| if (instr->hydrogen()->depth() > 1) { | 
| __ Push(a3, a2, a1, a0); | 
| CallRuntime(Runtime::kCreateObjectLiteral, 4, instr); | 
| @@ -5305,19 +5314,17 @@ void LCodeGen::DoRegExpLiteral(LRegExpLiteral* instr) { | 
| void LCodeGen::DoFunctionLiteral(LFunctionLiteral* instr) { | 
| // Use the fast case closure allocation code that allocates in new | 
| // space for nested functions that don't need literals cloning. | 
| -  Handle<SharedFunctionInfo> shared_info = instr->shared_info(); | 
| bool pretenure = instr->hydrogen()->pretenure(); | 
| -  if (!pretenure && shared_info->num_literals() == 0) { | 
| -    FastNewClosureStub stub(shared_info->language_mode(), | 
| -                            shared_info->is_generator()); | 
| -    __ li(a1, Operand(shared_info)); | 
| +  if (!pretenure && instr->hydrogen()->has_no_literals()) { | 
| +    FastNewClosureStub stub(instr->hydrogen()->language_mode(), | 
| +                            instr->hydrogen()->is_generator()); | 
| +    __ li(a1, Operand(instr->hydrogen()->shared_info())); | 
| __ push(a1); | 
| CallCode(stub.GetCode(isolate()), RelocInfo::CODE_TARGET, instr); | 
| } else { | 
| -    __ li(a2, Operand(shared_info)); | 
| -    __ li(a1, Operand(pretenure | 
| -                       ? factory()->true_value() | 
| -                       : factory()->false_value())); | 
| +    __ li(a2, Operand(instr->hydrogen()->shared_info())); | 
| +    __ li(a1, Operand(pretenure ? factory()->true_value() | 
| +                                : factory()->false_value())); | 
| __ Push(cp, a2, a1); | 
| CallRuntime(Runtime::kNewClosure, 3, instr); | 
| } | 
|  |