Index: runtime/vm/flow_graph_allocator.h |
diff --git a/runtime/vm/flow_graph_allocator.h b/runtime/vm/flow_graph_allocator.h |
index cab8c129942df47c22a6cd405f2e32efe005bb23..25e5fd3ece609c1a0c84cdb7ae0a403eae77cce3 100644 |
--- a/runtime/vm/flow_graph_allocator.h |
+++ b/runtime/vm/flow_graph_allocator.h |
@@ -96,6 +96,9 @@ class FlowGraphAllocator : public ValueObject { |
void ConnectIncomingPhiMoves(BlockEntryInstr* block); |
void BlockLocation(Location loc, intptr_t from, intptr_t to); |
+ // Find all safepoints that are covered by this live range. |
+ void AssignSafepoints(LiveRange* range); |
+ |
// Process live ranges sorted by their start and assign registers |
// to them |
void AllocateCPURegisters(); |
@@ -213,8 +216,12 @@ class FlowGraphAllocator : public ValueObject { |
GrowableArray<LiveRange*> temporaries_; |
#endif |
+ // List of spilled live ranges. |
GrowableArray<LiveRange*> spilled_; |
+ // List of instructions containing calls. |
+ GrowableArray<Instruction*> safepoints_; |
+ |
// Per register lists of allocated live ranges. Contain only those |
// ranges that can be affected by future allocation decisions. |
// Those live ranges that end before the start of the current live range are |
@@ -225,13 +232,6 @@ class FlowGraphAllocator : public ValueObject { |
// become free and can be reused for allocation. |
GrowableArray<intptr_t> spill_slots_; |
- // List of safepoints. |
- struct Safepoint { |
- intptr_t position; |
- BitmapBuilder* stack_bitmap; |
- }; |
- GrowableArray<Safepoint> safepoints_; |
- |
bool blocked_cpu_regs_[kNumberOfCpuRegisters]; |
DISALLOW_COPY_AND_ASSIGN(FlowGraphAllocator); |
@@ -387,6 +387,27 @@ class AllocationFinger : public ValueObject { |
}; |
+class SafepointPosition : public ZoneAllocated { |
srdjan
2012/08/15 00:12:03
Make a common superclass PositionsList (subclasses
|
+ public: |
+ SafepointPosition(intptr_t pos, |
+ LocationSummary* locs) |
+ : pos_(pos), locs_(locs), next_(NULL) { } |
+ |
+ void set_next(SafepointPosition* next) { next_ = next; } |
+ SafepointPosition* next() const { return next_; } |
+ |
+ intptr_t pos() const { return pos_; } |
+ |
+ LocationSummary* locs() const { return locs_; } |
+ |
+ private: |
+ const intptr_t pos_; |
+ LocationSummary* const locs_; |
+ |
+ SafepointPosition* next_; |
+}; |
+ |
+ |
// LiveRange represents a sequence of UseIntervals for a given SSA value. |
class LiveRange : public ZoneAllocated { |
public: |
@@ -397,6 +418,8 @@ class LiveRange : public ZoneAllocated { |
uses_(NULL), |
first_use_interval_(NULL), |
last_use_interval_(NULL), |
+ first_safepoint_(NULL), |
+ last_safepoint_(NULL), |
next_sibling_(NULL), |
finger_() { |
} |
@@ -413,6 +436,8 @@ class LiveRange : public ZoneAllocated { |
intptr_t Start() const { return first_use_interval()->start(); } |
intptr_t End() const { return last_use_interval()->end(); } |
+ SafepointPosition* first_safepoint() const { return first_safepoint_; } |
+ |
AllocationFinger* finger() { return &finger_; } |
void set_assigned_location(Location location) { |
@@ -425,6 +450,8 @@ class LiveRange : public ZoneAllocated { |
void DefineAt(intptr_t pos); |
+ void AddSafepoint(intptr_t pos, LocationSummary* locs); |
+ |
void AddUse(intptr_t pos, Location* location_slot); |
void AddHintedUse(intptr_t pos, Location* location_slot, Location* hint); |
@@ -455,12 +482,15 @@ class LiveRange : public ZoneAllocated { |
UsePosition* uses, |
UseInterval* first_use_interval, |
UseInterval* last_use_interval, |
+ SafepointPosition* first_safepoint, |
LiveRange* next_sibling) |
: vreg_(vreg), |
assigned_location_(), |
uses_(uses), |
first_use_interval_(first_use_interval), |
last_use_interval_(last_use_interval), |
+ first_safepoint_(first_safepoint), |
+ last_safepoint_(NULL), |
next_sibling_(next_sibling), |
finger_() { |
} |
@@ -473,6 +503,9 @@ class LiveRange : public ZoneAllocated { |
UseInterval* first_use_interval_; |
UseInterval* last_use_interval_; |
+ SafepointPosition* first_safepoint_; |
+ SafepointPosition* last_safepoint_; |
+ |
LiveRange* next_sibling_; |
AllocationFinger finger_; |