Index: runtime/vm/flow_graph_optimizer.h |
diff --git a/runtime/vm/flow_graph_optimizer.h b/runtime/vm/flow_graph_optimizer.h |
index 3aecb910f784ab23227db1ab22ab68d93eddbc17..e9a74828a1696f5c1c5f72d8c68419705602bfe5 100644 |
--- a/runtime/vm/flow_graph_optimizer.h |
+++ b/runtime/vm/flow_graph_optimizer.h |
@@ -429,13 +429,54 @@ class AllocationSinking : public ZoneAllocated { |
public: |
explicit AllocationSinking(FlowGraph* flow_graph) |
: flow_graph_(flow_graph), |
+ candidates_(5), |
materializations_(5) { } |
+ const GrowableArray<AllocateObjectInstr*>& candidates() const { |
+ return candidates_; |
+ } |
+ |
+ // Find the materialization insterted for the given allocation |
+ // at the given exit. |
+ MaterializeObjectInstr* MaterializationFor(Definition* alloc, |
+ Instruction* exit); |
+ |
void Optimize(); |
void DetachMaterializations(); |
private: |
+ // Helper class to collect deoptimization exits that might need to |
+ // rematerialize an object: that is either instructions that reference |
+ // this object explicitly in their deoptimization environment or |
+ // reference some other allocation sinking candidate that points to |
+ // this object. |
+ class ExitsCollector : public ValueObject { |
+ public: |
+ ExitsCollector() : exits_(10), worklist_(3) { } |
+ |
+ const GrowableArray<Instruction*>& exits() const { return exits_; } |
+ |
+ void CollectTransitively(Definition* alloc); |
+ |
+ private: |
+ // Collect immediate uses of this object in the environments. |
+ // If this object is stored into other allocation sinking candidates |
+ // put them onto worklist so that CollectTransitively will process them. |
+ void Collect(Definition* alloc); |
+ |
+ GrowableArray<Instruction*> exits_; |
+ GrowableArray<Definition*> worklist_; |
+ }; |
+ |
+ void CollectCandidates(); |
+ |
+ void NormalizeMaterializations(); |
+ |
+ void RemoveUnusedMaterializations(); |
+ |
+ void DiscoverFailedCandidates(); |
+ |
void InsertMaterializations(AllocateObjectInstr* alloc); |
void CreateMaterializationAt( |
@@ -444,11 +485,16 @@ class AllocationSinking : public ZoneAllocated { |
const Class& cls, |
const ZoneGrowableArray<const Object*>& fields); |
+ void EliminateAllocation(AllocateObjectInstr* alloc); |
+ |
Isolate* isolate() const { return flow_graph_->isolate(); } |
FlowGraph* flow_graph_; |
+ GrowableArray<AllocateObjectInstr*> candidates_; |
GrowableArray<MaterializeObjectInstr*> materializations_; |
+ |
+ ExitsCollector exits_collector_; |
}; |