Commit 17ea41ba authored by mtrofin's avatar mtrofin Committed by Commit bot

Revert "Revert of [turbofan] optimize spills in defered blocks (patchset #3...

Revert "Revert of [turbofan] optimize spills in defered blocks (patchset #3 id:240001 of https://codereview.chromium.org/1551013002/ )"

This reverts commit 7f62e122.

The regressions reported in the bug below appear to be bogus, and
caused by chromium:579503

BUG=chromium:579900
LOG=N

Review URL: https://codereview.chromium.org/1612923003

Cr-Commit-Position: refs/heads/master@{#33454}
parent 721a64ac
...@@ -119,6 +119,7 @@ void LiveRangeSeparator::Splinter() { ...@@ -119,6 +119,7 @@ void LiveRangeSeparator::Splinter() {
void LiveRangeMerger::MarkRangesSpilledInDeferredBlocks() { void LiveRangeMerger::MarkRangesSpilledInDeferredBlocks() {
const InstructionSequence *code = data()->code();
for (TopLevelLiveRange *top : data()->live_ranges()) { for (TopLevelLiveRange *top : data()->live_ranges()) {
if (top == nullptr || top->IsEmpty() || top->splinter() == nullptr || if (top == nullptr || top->IsEmpty() || top->splinter() == nullptr ||
top->HasSpillOperand() || !top->splinter()->HasSpillRange()) { top->HasSpillOperand() || !top->splinter()->HasSpillRange()) {
...@@ -132,7 +133,10 @@ void LiveRangeMerger::MarkRangesSpilledInDeferredBlocks() { ...@@ -132,7 +133,10 @@ void LiveRangeMerger::MarkRangesSpilledInDeferredBlocks() {
break; break;
} }
} }
if (child == nullptr) top->MarkSpilledInDeferredBlock(); if (child == nullptr) {
top->TreatAsSpilledInDeferredBlock(data()->allocation_zone(),
code->InstructionBlockCount());
}
} }
} }
......
This diff is collapsed.
...@@ -579,14 +579,17 @@ class TopLevelLiveRange final : public LiveRange { ...@@ -579,14 +579,17 @@ class TopLevelLiveRange final : public LiveRange {
// and instead let the LiveRangeConnector perform the spills within the // and instead let the LiveRangeConnector perform the spills within the
// deferred blocks. If so, we insert here spills for non-spilled ranges // deferred blocks. If so, we insert here spills for non-spilled ranges
// with slot use positions. // with slot use positions.
void MarkSpilledInDeferredBlock() { void TreatAsSpilledInDeferredBlock(Zone* zone, int total_block_count) {
spill_start_index_ = -1; spill_start_index_ = -1;
spilled_in_deferred_blocks_ = true; spilled_in_deferred_blocks_ = true;
spill_move_insertion_locations_ = nullptr; spill_move_insertion_locations_ = nullptr;
list_of_blocks_requiring_spill_operands_ =
new (zone) BitVector(total_block_count, zone);
} }
bool TryCommitSpillInDeferredBlock(InstructionSequence* code, void CommitSpillInDeferredBlocks(RegisterAllocationData* data,
const InstructionOperand& spill_operand); const InstructionOperand& spill_operand,
BitVector* necessary_spill_points);
TopLevelLiveRange* splintered_from() const { return splintered_from_; } TopLevelLiveRange* splintered_from() const { return splintered_from_; }
bool IsSplinter() const { return splintered_from_ != nullptr; } bool IsSplinter() const { return splintered_from_ != nullptr; }
...@@ -617,7 +620,8 @@ class TopLevelLiveRange final : public LiveRange { ...@@ -617,7 +620,8 @@ class TopLevelLiveRange final : public LiveRange {
struct SpillMoveInsertionList; struct SpillMoveInsertionList;
SpillMoveInsertionList* spill_move_insertion_locations() const { SpillMoveInsertionList* GetSpillMoveInsertionLocations() const {
DCHECK(!IsSpilledOnlyInDeferredBlocks());
return spill_move_insertion_locations_; return spill_move_insertion_locations_;
} }
TopLevelLiveRange* splinter() const { return splinter_; } TopLevelLiveRange* splinter() const { return splinter_; }
...@@ -634,6 +638,16 @@ class TopLevelLiveRange final : public LiveRange { ...@@ -634,6 +638,16 @@ class TopLevelLiveRange final : public LiveRange {
void MarkHasPreassignedSlot() { has_preassigned_slot_ = true; } void MarkHasPreassignedSlot() { has_preassigned_slot_ = true; }
bool has_preassigned_slot() const { return has_preassigned_slot_; } 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: private:
void SetSplinteredFrom(TopLevelLiveRange* splinter_parent); void SetSplinteredFrom(TopLevelLiveRange* splinter_parent);
...@@ -650,7 +664,12 @@ class TopLevelLiveRange final : public LiveRange { ...@@ -650,7 +664,12 @@ class TopLevelLiveRange final : public LiveRange {
InstructionOperand* spill_operand_; InstructionOperand* spill_operand_;
SpillRange* spill_range_; SpillRange* spill_range_;
}; };
union {
SpillMoveInsertionList* spill_move_insertion_locations_; SpillMoveInsertionList* spill_move_insertion_locations_;
BitVector* list_of_blocks_requiring_spill_operands_;
};
// TODO(mtrofin): generalize spilling after definition, currently specialized // TODO(mtrofin): generalize spilling after definition, currently specialized
// just for spill in a single deferred block. // just for spill in a single deferred block.
bool spilled_in_deferred_blocks_; bool spilled_in_deferred_blocks_;
...@@ -1125,6 +1144,7 @@ class ReferenceMapPopulator final : public ZoneObject { ...@@ -1125,6 +1144,7 @@ class ReferenceMapPopulator final : public ZoneObject {
}; };
class LiveRangeBoundArray;
// Insert moves of the form // Insert moves of the form
// //
// Operand(child_(k+1)) = Operand(child_k) // Operand(child_(k+1)) = Operand(child_k)
...@@ -1157,6 +1177,10 @@ class LiveRangeConnector final : public ZoneObject { ...@@ -1157,6 +1177,10 @@ class LiveRangeConnector final : public ZoneObject {
const InstructionBlock* pred, const InstructionBlock* pred,
const InstructionOperand& pred_op); const InstructionOperand& pred_op);
void CommitSpillsInDeferredBlocks(TopLevelLiveRange* range,
LiveRangeBoundArray* array,
Zone* temp_zone);
RegisterAllocationData* const data_; RegisterAllocationData* const data_;
DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector); DISALLOW_COPY_AND_ASSIGN(LiveRangeConnector);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment