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
This commit is contained in:
weiliang.lin@intel.com 2014-05-28 08:16:11 +00:00
parent 6e3ffe1ca1
commit 2312c8abdf
3 changed files with 12 additions and 35 deletions

View File

@ -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());
}
}

View File

@ -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);
}

View File

@ -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);
}
}