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:
parent
6e3ffe1ca1
commit
2312c8abdf
@ -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());
|
||||
}
|
||||
}
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
|
||||
|
||||
|
@ -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);
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user