Index: src/compiler/register-allocator.h |
diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h |
index b96a43ccec4431606bee4719bb76383088db85e4..38fad05ed327a171edc2a911badf5202b93433b8 100644 |
--- a/src/compiler/register-allocator.h |
+++ b/src/compiler/register-allocator.h |
@@ -579,14 +579,17 @@ class TopLevelLiveRange final : public LiveRange { |
// and instead let the LiveRangeConnector perform the spills within the |
// deferred blocks. If so, we insert here spills for non-spilled ranges |
// with slot use positions. |
- void MarkSpilledInDeferredBlock() { |
+ void TreatAsSpilledInDeferredBlock(Zone* zone, int total_block_count) { |
spill_start_index_ = -1; |
spilled_in_deferred_blocks_ = true; |
spill_move_insertion_locations_ = nullptr; |
+ list_of_blocks_requiring_spill_operands_ = |
+ new (zone) BitVector(total_block_count, zone); |
} |
- bool TryCommitSpillInDeferredBlock(InstructionSequence* code, |
- const InstructionOperand& spill_operand); |
+ void CommitSpillInDeferredBlocks(RegisterAllocationData* data, |
+ const InstructionOperand& spill_operand, |
+ BitVector* necessary_spill_points); |
TopLevelLiveRange* splintered_from() const { return splintered_from_; } |
bool IsSplinter() const { return splintered_from_ != nullptr; } |
@@ -617,7 +620,8 @@ class TopLevelLiveRange final : public LiveRange { |
struct SpillMoveInsertionList; |
- SpillMoveInsertionList* spill_move_insertion_locations() const { |
+ SpillMoveInsertionList* GetSpillMoveInsertionLocations() const { |
+ DCHECK(!IsSpilledOnlyInDeferredBlocks()); |
return spill_move_insertion_locations_; |
} |
TopLevelLiveRange* splinter() const { return splinter_; } |
@@ -634,6 +638,16 @@ class TopLevelLiveRange final : public LiveRange { |
void MarkHasPreassignedSlot() { has_preassigned_slot_ = true; } |
bool has_preassigned_slot() const { return has_preassigned_slot_; } |
+ void AddBlockRequiringSpillOperand(RpoNumber block_id) { |
+ DCHECK(IsSpilledOnlyInDeferredBlocks()); |
+ GetListOfBlocksRequiringSpillOperands()->Add(block_id.ToInt()); |
+ } |
+ |
+ BitVector* GetListOfBlocksRequiringSpillOperands() const { |
+ DCHECK(IsSpilledOnlyInDeferredBlocks()); |
+ return list_of_blocks_requiring_spill_operands_; |
+ } |
+ |
private: |
void SetSplinteredFrom(TopLevelLiveRange* splinter_parent); |
@@ -650,7 +664,12 @@ class TopLevelLiveRange final : public LiveRange { |
InstructionOperand* spill_operand_; |
SpillRange* spill_range_; |
}; |
- SpillMoveInsertionList* spill_move_insertion_locations_; |
+ |
+ union { |
+ SpillMoveInsertionList* spill_move_insertion_locations_; |
+ BitVector* list_of_blocks_requiring_spill_operands_; |
+ }; |
+ |
// TODO(mtrofin): generalize spilling after definition, currently specialized |
// just for spill in a single deferred block. |
bool spilled_in_deferred_blocks_; |
@@ -1125,6 +1144,7 @@ class ReferenceMapPopulator final : public ZoneObject { |
}; |
+class LiveRangeBoundArray; |
// Insert moves of the form |
// |
// Operand(child_(k+1)) = Operand(child_k) |
@@ -1157,6 +1177,10 @@ class LiveRangeConnector final : public ZoneObject { |
const InstructionBlock* pred, |
const InstructionOperand& pred_op); |
+ void CommitSpillsInDeferredBlocks(TopLevelLiveRange* range, |
+ LiveRangeBoundArray* array, |
+ Zone* temp_zone); |
+ |
RegisterAllocationData* const data_; |
DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); |