From 2312c8abdf4ee6f2dc9350bcfffdfa8802bca0b2 Mon Sep 17 00:00:00 2001 From: "weiliang.lin@intel.com" Date: Wed, 28 May 2014 08:16:11 +0000 Subject: [PATCH] X87: Avoid HeapObject check in HStoreNamedField. port r21509 (78a54b0) Original commit message: This way an HStoreNamedField instruction can never deoptimize itself, which is another important step towards a working store elimination. BUG= R=danno@chromium.org Review URL: https://codereview.chromium.org/306483013 git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@21547 ce2b1a6d-e550-0410-aec6-3dcde31c8c00 --- src/x87/lithium-codegen-x87.cc | 31 ++++++------------------------- src/x87/lithium-x87.cc | 11 +---------- src/x87/macro-assembler-x87.cc | 5 +++++ 3 files changed, 12 insertions(+), 35 deletions(-) diff --git a/src/x87/lithium-codegen-x87.cc b/src/x87/lithium-codegen-x87.cc index 60fe7254e9..975226bdaa 100644 --- a/src/x87/lithium-codegen-x87.cc +++ b/src/x87/lithium-codegen-x87.cc @@ -3888,30 +3888,11 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { } Register object = ToRegister(instr->object()); - SmiCheck check_needed = - instr->hydrogen()->value()->IsHeapObject() - ? OMIT_SMI_CHECK : INLINE_SMI_CHECK; - - ASSERT(!(representation.IsSmi() && - instr->value()->IsConstantOperand() && - !IsSmi(LConstantOperand::cast(instr->value())))); - if (representation.IsHeapObject()) { - if (instr->value()->IsConstantOperand()) { - LConstantOperand* operand_value = LConstantOperand::cast(instr->value()); - if (chunk_->LookupConstant(operand_value)->HasSmiValue()) { - DeoptimizeIf(no_condition, instr->environment()); - } - } else { - if (!instr->hydrogen()->value()->type().IsHeapObject()) { - Register value = ToRegister(instr->value()); - __ test(value, Immediate(kSmiTagMask)); - DeoptimizeIf(zero, instr->environment()); - - // We know now that value is not a smi, so we can omit the check below. - check_needed = OMIT_SMI_CHECK; - } - } - } else if (representation.IsDouble()) { + __ AssertNotSmi(object); + ASSERT(!representation.IsSmi() || + !instr->value()->IsConstantOperand() || + IsSmi(LConstantOperand::cast(instr->value()))); + if (representation.IsDouble()) { ASSERT(access.IsInobject()); ASSERT(!instr->hydrogen()->has_transition()); ASSERT(!instr->hydrogen()->NeedsWriteBarrier()); @@ -3976,7 +3957,7 @@ void LCodeGen::DoStoreNamedField(LStoreNamedField* instr) { value, temp, EMIT_REMEMBERED_SET, - check_needed); + instr->hydrogen()->SmiCheckForWriteBarrier()); } } diff --git a/src/x87/lithium-x87.cc b/src/x87/lithium-x87.cc index 715c936227..9bb649c1ff 100644 --- a/src/x87/lithium-x87.cc +++ b/src/x87/lithium-x87.cc @@ -2379,16 +2379,7 @@ LInstruction* LChunkBuilder::DoStoreNamedField(HStoreNamedField* instr) { // We need a temporary register for write barrier of the map field. LOperand* temp_map = needs_write_barrier_for_map ? TempRegister() : NULL; - LInstruction* result = - new(zone()) LStoreNamedField(obj, val, temp, temp_map); - if (!instr->access().IsExternalMemory() && - instr->field_representation().IsHeapObject() && - (val->IsConstantOperand() - ? HConstant::cast(instr->value())->HasSmiValue() - : !instr->value()->type().IsHeapObject())) { - result = AssignEnvironment(result); - } - return result; + return new(zone()) LStoreNamedField(obj, val, temp, temp_map); } diff --git a/src/x87/macro-assembler-x87.cc b/src/x87/macro-assembler-x87.cc index 7baa659d01..8d8876f1dd 100644 --- a/src/x87/macro-assembler-x87.cc +++ b/src/x87/macro-assembler-x87.cc @@ -55,6 +55,11 @@ void MacroAssembler::Store(Register src, const Operand& dst, Representation r) { } else if (r.IsInteger16() || r.IsUInteger16()) { mov_w(dst, src); } else { + if (r.IsHeapObject()) { + AssertNotSmi(src); + } else if (r.IsSmi()) { + AssertSmi(src); + } mov(dst, src); } }