Index: runtime/vm/intermediate_language.cc |
=================================================================== |
--- runtime/vm/intermediate_language.cc (revision 11354) |
+++ runtime/vm/intermediate_language.cc (working copy) |
@@ -292,6 +292,15 @@ |
} |
+bool Value::NeedsStoreBuffer() const { |
+ const intptr_t cid = ResultCid(); |
+ if ((cid == kSmiCid) || (cid == kBoolCid) || (cid == kNullCid)) { |
+ return false; |
+ } |
+ return !BindsToConstant(); |
+} |
+ |
+ |
RawAbstractType* PhiInstr::CompileType() const { |
ASSERT(!HasPropagatedType()); |
// Since type propagation has not yet occured, we are reaching this phi via a |
@@ -1432,8 +1441,13 @@ |
Register dest_reg = locs()->in(1).reg(); |
ASSERT(value_reg == locs()->out().reg()); |
- __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()), |
- value_reg); |
+ if (value()->NeedsStoreBuffer()) { |
+ __ StoreIntoObject(dest_reg, FieldAddress(dest_reg, offset_in_bytes()), |
+ value_reg); |
+ } else { |
+ __ StoreIntoObjectNoBarrier( |
+ dest_reg, FieldAddress(dest_reg, offset_in_bytes()), value_reg); |
+ } |
} |