Index: runtime/vm/flow_graph_optimizer.cc |
=================================================================== |
--- runtime/vm/flow_graph_optimizer.cc (revision 42599) |
+++ runtime/vm/flow_graph_optimizer.cc (working copy) |
@@ -4504,7 +4504,7 @@ |
void FlowGraphOptimizer::VisitStoreInstanceField( |
StoreInstanceFieldInstr* instr) { |
if (instr->IsUnboxedStore()) { |
- ASSERT(instr->is_initialization_); |
+ ASSERT(instr->is_potential_unboxed_initialization_); |
// Determine if this field should be unboxed based on the usage of getter |
// and setter functions: The heuristic requires that the setter has a |
// usage count of at least 1/kGetterSetterRatio of the getter usage count. |
@@ -4549,7 +4549,9 @@ |
new Value(flow_graph_->constant_null()), |
kNoStoreBarrier, |
instr->token_pos()); |
- store->set_is_initialization(true); // Won't be eliminated by DSE. |
+ // Storing into uninitialized memory; remember to prevent dead store |
+ // elimination and ensure proper GC barrier. |
+ store->set_is_object_reference_initialization(true); |
flow_graph_->InsertAfter(replacement, store, NULL, FlowGraph::kEffect); |
Definition* cursor = store; |
for (intptr_t i = 0; i < instr->num_context_variables(); ++i) { |
@@ -4559,7 +4561,9 @@ |
new Value(flow_graph_->constant_null()), |
kNoStoreBarrier, |
instr->token_pos()); |
- store->set_is_initialization(true); // Won't be eliminated by DSE. |
+ // Storing into uninitialized memory; remember to prevent dead store |
+ // elimination and ensure proper GC barrier. |
+ store->set_is_object_reference_initialization(true); |
flow_graph_->InsertAfter(cursor, store, NULL, FlowGraph::kEffect); |
cursor = store; |
} |
@@ -7132,11 +7136,12 @@ |
bool CanEliminateStore(Instruction* instr) { |
switch (instr->tag()) { |
- case Instruction::kStoreInstanceField: |
- if (instr->AsStoreInstanceField()->is_initialization()) { |
- // Can't eliminate stores that initialized unboxed fields. |
- return false; |
- } |
+ case Instruction::kStoreInstanceField: { |
+ StoreInstanceFieldInstr* store_instance = instr->AsStoreInstanceField(); |
+ // Can't eliminate stores that initialize fields. |
+ return !store_instance->is_potential_unboxed_initialization() && |
Ivan Posva
2015/01/08 19:34:52
Personally I find this variant easier to read:
!(i
koda
2015/01/08 20:25:34
Done.
|
+ !store_instance->is_object_reference_initialization(); |
+ } |
case Instruction::kStoreIndexed: |
case Instruction::kStoreStaticField: |
return true; |