24 DCHECK(range->HasGeneralSpillRange());
26 range->FilterSpillMoves(
data(), spill_operand);
30 code->GetInstructionBlock(range->Start().ToInstructionIndex());
45 if (range->GetSpillMoveInsertionLocations(data()) ==
nullptr ||
46 range->spilled() || top_start_block->
IsDeferred() ||
47 (!
v8_flags.stress_turbo_late_spilling && !range->is_loop_phi())) {
48 range->CommitSpillMoves(
data(), spill_operand);
54 for (
const LiveRange* child = range; child !=
nullptr;
55 child = child->
next()) {
56 if (child->spilled()) {
58 for (
const UseInterval& interval : child->intervals()) {
60 code->GetInstructionBlock(interval.start().ToInstructionIndex())
62 if (start_block == top_start_block_number) {
65 range->CommitSpillMoves(
data(), spill_operand);
74 if (
data()->IsBlockBoundary(
end)) {
78 code->GetInstructionBlock(end_instruction)->rpo_number();
79 while (start_block <= end_block) {
81 top_start_block_number);
82 start_block = start_block.
Next();
90 code->GetInstructionBlock(
pos->pos().ToInstructionIndex());
91 RpoNumber block_number = block->rpo_number();
92 if (block_number == top_start_block_number) {
95 range->CommitSpillMoves(
data(), spill_operand);
108 range->SetLateSpillingSelected(
true);
121 uint64_t bit = uint64_t{1} << value_index;
126 uint64_t bit = uint64_t{1} << value_index;
172 template <State state>
174 static_assert(state < 8);
180 template <State state>
182 static_assert(state < 8);
191 template <
bool set_ones>
193 return set_ones ? data |
mask : data & ~mask;
266 if (!block->IsDeferred()) {
267 while (block->loop_header().IsValid() &&
268 block->loop_header() > top_start_block) {
295 uint64_t spill_required_in_non_deferred_successor = 0;
296 uint64_t spill_required_in_deferred_successor = 0;
298 for (
RpoNumber successor_id : block->successors()) {
300 if (successor_id <= block_id)
continue;
303 const Entry& successor_entry =
entries_[successor_id.ToSize()];
305 spill_required_in_deferred_successor |= successor_entry.
SpillRequired();
307 spill_required_in_non_deferred_successor |=
310 spill_required_in_deferred_successor |=
312 spill_required_in_non_deferred_successor |=
322 spill_required_in_deferred_successor &= ~(defs | needs_spill);
323 spill_required_in_non_deferred_successor &= ~(defs | needs_spill);
326 spill_required_in_deferred_successor);
328 spill_required_in_non_deferred_successor);
343 if (block->IsDeferred())
continue;
348 uint64_t spill_required_in_non_deferred_predecessor = 0;
349 uint64_t spill_required_in_all_non_deferred_predecessors =
350 static_cast<uint64_t
>(int64_t{-1});
352 for (
RpoNumber predecessor_id : block->predecessors()) {
354 if (predecessor_id >= block_id)
continue;
358 const Entry& predecessor_entry =
entries_[predecessor_id.ToSize()];
359 spill_required_in_non_deferred_predecessor |=
361 spill_required_in_all_non_deferred_predecessors &=
366 uint64_t spill_required_in_non_deferred_successor =
368 uint64_t spill_required_in_any_successor =
369 spill_required_in_non_deferred_successor |
377 spill_required_in_non_deferred_predecessor &
378 spill_required_in_all_non_deferred_predecessors);
385 spill_required_in_non_deferred_predecessor);
398 uint64_t spill_required_in_non_deferred_successor = 0;
399 uint64_t spill_required_in_deferred_successor = 0;
400 uint64_t spill_required_in_all_non_deferred_successors =
401 static_cast<uint64_t
>(int64_t{-1});
403 for (
RpoNumber successor_id : block->successors()) {
405 if (successor_id <= block_id)
continue;
408 const Entry& successor_entry =
entries_[successor_id.ToSize()];
410 spill_required_in_deferred_successor |= successor_entry.
SpillRequired();
412 spill_required_in_non_deferred_successor |=
414 spill_required_in_all_non_deferred_successors &=
424 uint64_t spill_at_def = defs & spill_required_in_non_deferred_successor &
425 spill_required_in_all_non_deferred_successors;
429 top->CommitSpillMoves(
data(), top->GetSpillRangeOperand());
432 if (block->IsDeferred()) {
443 spill_required_in_all_non_deferred_successors);
447 for (
RpoNumber successor_id : block->successors()) {
449 if (successor_id <= block_id)
continue;
452 const Entry& successor_entry =
entries_[successor_id.ToSize()];
453 for (
int index_to_spill :
uint8_t data_[MAX_STACK_LENGTH]
T * AllocateArray(size_t length)
RpoNumber rpo_number() const
size_t PredecessorCount() const
int last_instruction_index() const
int first_instruction_index() const
bool IsAnyRegister() const
int InstructionBlockCount() const
const InstructionBlocks & instruction_blocks() const
InstructionBlock * InstructionBlockAt(RpoNumber rpo_number)
static LifetimePosition InstructionFromInstructionIndex(int index)
int ToInstructionIndex() const
InstructionOperand GetAssignedOperand() const
MoveOperands * AddGapMove(int index, Instruction::GapPosition position, const InstructionOperand &from, const InstructionOperand &to)
const ZoneVector< TopLevelLiveRange * > & live_ranges() const
InstructionSequence * code() const
static RpoNumber Invalid()
static RpoNumber FromInt(int index)
@ kSpillRequiredInNonDeferredSuccessor
@ kSpillRequiredInDeferredSuccessor
void SetSpillRequiredInNonDeferredSuccessor(uint64_t mask)
void SetDefinitionSingleValue(int value_index)
uint64_t SpillRequiredInNonDeferredSuccessor() const
void SetSpillRequired(uint64_t mask)
uint64_t SpillRequiredInDeferredSuccessor() const
static uint64_t UpdateBitDataWithMask(uint64_t data, uint64_t mask)
void SetDefinition(uint64_t mask)
uint64_t GetValuesInState() const
uint64_t Definition() const
void SetSpillRequiredInDeferredSuccessor(uint64_t mask)
uint64_t SpillRequired() const
void SetSpillRequiredSingleValue(int value_index)
void UpdateValuesToState(uint64_t mask)
void SecondBackwardPass()
void ExpandBoundsToInclude(RpoNumber block)
void SetDefinition(RpoNumber block, int vreg)
void SetSpillRequired(InstructionBlock *block, int vreg, RpoNumber top_start_block)
RegisterAllocationData * data() const
int GetOrCreateIndexForLatestVreg(int vreg)
bool IsLatestVreg(int vreg) const
void CommitSpill(int vreg, InstructionBlock *predecessor, InstructionBlock *successor)
void Add(TopLevelLiveRange *range)
RegisterAllocationData * data_
SpillPlacer(RegisterAllocationData *data, Zone *zone)
static constexpr int kValueIndicesPerEntry
LiveRange * GetChildCovers(LifetimePosition pos)
AllocatedOperand GetSpillRangeOperand() const
void SetLateSpillingSelected(bool late_spilling_selected)
V8_EXPORT_PRIVATE FlagValues v8_flags
#define DCHECK_LE(v1, v2)
#define DCHECK_NOT_NULL(val)
#define DCHECK(condition)
#define DCHECK_LT(v1, v2)
#define DCHECK_EQ(v1, v2)