From 081a9d1791e719b1a672a68f11308c873fffc174 Mon Sep 17 00:00:00 2001 From: "palfia@homejinni.com" Date: Fri, 28 Jun 2013 17:16:17 +0000 Subject: [PATCH] MIPS: Hydrogen array constructor cleanup and improvements. Port r15383 (3e90aaf) Original commit message: * Cleanup of LCallNewArray::PrintDataTo() method * Created HCallNewArray::PrintDataTo() * Created many more tests in array-constructor-feedback.js * Removed redundant instructions in GenerateRecordCallTarget * Bugfix in CreateArrayDispatchOneArgument: on a call to new Array(0), we'd like to set the type feedback cell to a packed elements kind, but we shouldn't do it if the cell contains the megamorphic sentinel. * When used from crankshaft, ArrayConstructorStubs can avoid verifying that the function being called is the array function from the current native context, relying instead on the fact that crankshaft issues an HCheckFunction to protect the constructor call. (this new minor key is used in LCodeGen::DoCallNewArray(), and influences code generation in CodeStubGraphBuilderBase::BuildArrayConstructor()). * Optimization: the array constructor specialized for FAST_SMI_ELEMENTS can save some instructions by looking up the correct map on the passed in constructor, rather than indexing into the array of cached maps per element kind. BUG= Review URL: https://codereview.chromium.org/18191007 Patch from Balazs Kilvady . git-svn-id: http://v8.googlecode.com/svn/branches/bleeding_edge@15395 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/mips/code-stubs-mips.cc | 18 +++++++++++++----- src/mips/lithium-codegen-mips.cc | 17 ++++++++++------- src/mips/lithium-mips.cc | 3 +-- 3 files changed, 24 insertions(+), 14 deletions(-) diff --git a/src/mips/code-stubs-mips.cc b/src/mips/code-stubs-mips.cc index 01c824d..43af981 100644 --- a/src/mips/code-stubs-mips.cc +++ b/src/mips/code-stubs-mips.cc @@ -5045,11 +5045,15 @@ static void GenerateRecordCallTarget(MacroAssembler* masm) { // Special handling of the Array() function, which caches not only the // monomorphic Array function but the initial ElementsKind with special // sentinels - Handle terminal_kind_sentinel = - TypeFeedbackCells::MonomorphicArraySentinel(masm->isolate(), - LAST_FAST_ELEMENTS_KIND); __ JumpIfNotSmi(a3, &miss); - __ Branch(&miss, gt, a3, Operand(terminal_kind_sentinel)); + if (FLAG_debug_code) { + Handle terminal_kind_sentinel = + TypeFeedbackCells::MonomorphicArraySentinel(masm->isolate(), + LAST_FAST_ELEMENTS_KIND); + __ Assert(le, "Array function sentinel is not an ElementsKind", + a3, Operand(terminal_kind_sentinel)); + } + // Make sure the function is the Array() function __ LoadArrayFunction(a3); __ Branch(&megamorphic, ne, a1, Operand(a3)); @@ -7614,6 +7618,10 @@ static void CreateArrayDispatchOneArgument(MacroAssembler* masm) { __ Addu(a3, a3, Operand(1)); __ Branch(&normal_sequence, eq, a2, Operand(undefined_sentinel)); + // The type cell may have gone megamorphic, don't overwrite if so. + __ lw(t1, FieldMemOperand(a2, kPointerSize)); + __ JumpIfNotSmi(t1, &normal_sequence); + // Save the resulting elements kind in type info __ SmiTag(a3); __ sw(a3, FieldMemOperand(a2, kPointerSize)); @@ -7645,7 +7653,7 @@ static void ArrayConstructorStubAheadOfTimeHelper(Isolate* isolate) { T stub(kind); stub.GetCode(isolate)->set_is_pregenerated(true); if (AllocationSiteInfo::GetMode(kind) != DONT_TRACK_ALLOCATION_SITE) { - T stub1(kind, true); + T stub1(kind, CONTEXT_CHECK_REQUIRED, DISABLE_ALLOCATION_SITES); stub1.GetCode(isolate)->set_is_pregenerated(true); } } diff --git a/src/mips/lithium-codegen-mips.cc b/src/mips/lithium-codegen-mips.cc index 6751be7..3e55923 100644 --- a/src/mips/lithium-codegen-mips.cc +++ b/src/mips/lithium-codegen-mips.cc @@ -4049,11 +4049,14 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) { __ li(a0, Operand(instr->arity())); __ li(a2, Operand(instr->hydrogen()->property_cell())); ElementsKind kind = instr->hydrogen()->elements_kind(); - bool disable_allocation_sites = - (AllocationSiteInfo::GetMode(kind) == TRACK_ALLOCATION_SITE); + AllocationSiteOverrideMode override_mode = + (AllocationSiteInfo::GetMode(kind) == TRACK_ALLOCATION_SITE) + ? DISABLE_ALLOCATION_SITES + : DONT_OVERRIDE; + ContextCheckMode context_mode = CONTEXT_CHECK_NOT_REQUIRED; if (instr->arity() == 0) { - ArrayNoArgumentConstructorStub stub(kind, disable_allocation_sites); + ArrayNoArgumentConstructorStub stub(kind, context_mode, override_mode); CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); } else if (instr->arity() == 1) { Label done; @@ -4065,18 +4068,18 @@ void LCodeGen::DoCallNewArray(LCallNewArray* instr) { __ Branch(&packed_case, eq, t1, Operand(zero_reg)); ElementsKind holey_kind = GetHoleyElementsKind(kind); - ArraySingleArgumentConstructorStub stub(holey_kind, - disable_allocation_sites); + ArraySingleArgumentConstructorStub stub(holey_kind, context_mode, + override_mode); CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); __ jmp(&done); __ bind(&packed_case); } - ArraySingleArgumentConstructorStub stub(kind, disable_allocation_sites); + ArraySingleArgumentConstructorStub stub(kind, context_mode, override_mode); CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); __ bind(&done); } else { - ArrayNArgumentsConstructorStub stub(kind, disable_allocation_sites); + ArrayNArgumentsConstructorStub stub(kind, context_mode, override_mode); CallCode(stub.GetCode(isolate()), RelocInfo::CONSTRUCT_CALL, instr); } } diff --git a/src/mips/lithium-mips.cc b/src/mips/lithium-mips.cc index ba7fbd3..e68c722 100644 --- a/src/mips/lithium-mips.cc +++ b/src/mips/lithium-mips.cc @@ -330,8 +330,7 @@ void LCallNewArray::PrintDataTo(StringStream* stream) { constructor()->PrintTo(stream); stream->Add(" #%d / ", arity()); ASSERT(hydrogen()->property_cell()->value()->IsSmi()); - ElementsKind kind = static_cast( - Smi::cast(hydrogen()->property_cell()->value())->value()); + ElementsKind kind = hydrogen()->elements_kind(); stream->Add(" (%s) ", ElementsKindToString(kind)); } -- 2.7.4