Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(198)

Unified Diff: src/compiler/register-allocator.cc

Issue 1111563004: [turbofan] Cleanup LiveRange a bit. (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Created 5 years, 8 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
« no previous file with comments | « src/compiler/register-allocator.h ('k') | no next file » | no next file with comments »
Expand Comments ('e') | Collapse Comments ('c') | Show Comments Hide Comments ('s')
Index: src/compiler/register-allocator.cc
diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc
index 0dfd543a0646712e9072c540f09c498e2f0472c2..49229d5872cd22b2aac4aaaed8392163f26e5776 100644
--- a/src/compiler/register-allocator.cc
+++ b/src/compiler/register-allocator.cc
@@ -216,24 +216,21 @@ struct LiveRange::SpillAtDefinitionList : ZoneObject {
LiveRange::LiveRange(int id)
: id_(id),
- spilled_(false),
- has_slot_use_(false),
- is_phi_(false),
- is_non_loop_phi_(false),
- kind_(UNALLOCATED_REGISTERS),
- assigned_register_(kUnassignedRegister),
+ spill_start_index_(kMaxInt),
+ bits_(0),
last_interval_(nullptr),
first_interval_(nullptr),
first_pos_(nullptr),
parent_(nullptr),
next_(nullptr),
+ spill_operand_(nullptr),
+ spills_at_definition_(nullptr),
current_interval_(nullptr),
last_processed_use_(nullptr),
- current_hint_position_(nullptr),
- spill_start_index_(kMaxInt),
- spill_type_(SpillType::kNoSpillType),
- spill_operand_(nullptr),
- spills_at_definition_(nullptr) {}
+ current_hint_position_(nullptr) {
+ bits_ = SpillTypeField::encode(SpillType::kNoSpillType) |
+ AssignedRegisterField::encode(kUnassignedRegister);
+}
void LiveRange::Verify() const {
@@ -252,22 +249,22 @@ void LiveRange::Verify() const {
void LiveRange::set_assigned_register(int reg) {
- DCHECK(!HasRegisterAssigned() && !IsSpilled());
- assigned_register_ = reg;
+ DCHECK(!HasRegisterAssigned() && !spilled());
+ bits_ = AssignedRegisterField::update(bits_, reg);
}
void LiveRange::UnsetAssignedRegister() {
- DCHECK(HasRegisterAssigned() && !IsSpilled());
- assigned_register_ = kUnassignedRegister;
+ DCHECK(HasRegisterAssigned() && !spilled());
+ bits_ = AssignedRegisterField::update(bits_, kUnassignedRegister);
}
-void LiveRange::MakeSpilled() {
- DCHECK(!IsSpilled());
+void LiveRange::Spill() {
+ DCHECK(!spilled());
DCHECK(!TopLevel()->HasNoSpillType());
- spilled_ = true;
- assigned_register_ = kUnassignedRegister;
+ set_spilled(true);
+ bits_ = AssignedRegisterField::update(bits_, kUnassignedRegister);
}
@@ -319,7 +316,7 @@ UsePosition* LiveRange::FirstHintPosition(int* register_index) const {
void LiveRange::SetSpillOperand(InstructionOperand* operand) {
DCHECK(HasNoSpillType());
DCHECK(!operand->IsUnallocated() && !operand->IsImmediate());
- spill_type_ = SpillType::kSpillOperand;
+ set_spill_type(SpillType::kSpillOperand);
spill_operand_ = operand;
}
@@ -327,7 +324,7 @@ void LiveRange::SetSpillOperand(InstructionOperand* operand) {
void LiveRange::SetSpillRange(SpillRange* spill_range) {
DCHECK(HasNoSpillType() || HasSpillRange());
DCHECK(spill_range);
- spill_type_ = SpillType::kSpillRange;
+ set_spill_type(SpillType::kSpillRange);
spill_range_ = spill_range;
}
@@ -335,7 +332,7 @@ void LiveRange::SetSpillRange(SpillRange* spill_range) {
void LiveRange::CommitSpillOperand(AllocatedOperand* operand) {
DCHECK(HasSpillRange());
DCHECK(!IsChild());
- spill_type_ = SpillType::kSpillOperand;
+ set_spill_type(SpillType::kSpillOperand);
spill_operand_ = operand;
}
@@ -395,8 +392,8 @@ bool LiveRange::CanBeSpilled(LifetimePosition pos) const {
InstructionOperand LiveRange::GetAssignedOperand() const {
if (HasRegisterAssigned()) {
- DCHECK(!IsSpilled());
- switch (Kind()) {
+ DCHECK(!spilled());
+ switch (kind()) {
case GENERAL_REGISTERS:
return RegisterOperand(assigned_register());
case DOUBLE_REGISTERS:
@@ -405,7 +402,7 @@ InstructionOperand LiveRange::GetAssignedOperand() const {
UNREACHABLE();
}
}
- DCHECK(IsSpilled());
+ DCHECK(spilled());
DCHECK(!HasRegisterAssigned());
auto op = TopLevel()->GetSpillOperand();
DCHECK(!op->IsUnallocated());
@@ -469,6 +466,7 @@ void LiveRange::SplitAt(LifetimePosition position, LiveRange* result,
}
current = next;
}
+ DCHECK(nullptr != after);
// Partition original use intervals to the two live ranges.
auto before = current;
@@ -514,7 +512,7 @@ void LiveRange::SplitAt(LifetimePosition position, LiveRange* result,
// Link the new live range in the chain before any of the other
// ranges linked from the range before the split.
result->parent_ = (parent_ == nullptr) ? this : parent_;
- result->kind_ = result->parent_->kind_;
+ result->set_kind(result->parent_->kind());
result->next_ = next_;
next_ = result;
@@ -765,7 +763,7 @@ bool SpillRange::IsIntersectingWith(SpillRange* other) const {
bool SpillRange::TryMerge(SpillRange* other) {
- if (Kind() != other->Kind() || IsIntersectingWith(other)) return false;
+ if (kind() != other->kind() || IsIntersectingWith(other)) return false;
auto max = LifetimePosition::MaxPosition();
if (End() < other->End() && other->End() != max) {
@@ -1738,13 +1736,13 @@ LifetimePosition RegisterAllocator::FindOptimalSpillingPos(
void RegisterAllocator::Spill(LiveRange* range) {
- DCHECK(!range->IsSpilled());
+ DCHECK(!range->spilled());
TRACE("Spilling live range %d\n", range->id());
auto first = range->TopLevel();
if (first->HasNoSpillType()) {
data()->AssignSpillRangeToLiveRange(first);
}
- range->MakeSpilled();
+ range->Spill();
}
@@ -1772,7 +1770,7 @@ void LinearScanAllocator::AllocateRegisters() {
for (auto range : data()->live_ranges()) {
if (range == nullptr) continue;
- if (range->Kind() == mode()) {
+ if (range->kind() == mode()) {
AddToUnhandledUnsorted(range);
}
}
@@ -1782,7 +1780,7 @@ void LinearScanAllocator::AllocateRegisters() {
auto& fixed_ranges = GetFixedRegisters(data(), mode());
for (auto current : fixed_ranges) {
if (current != nullptr) {
- DCHECK_EQ(mode(), current->Kind());
+ DCHECK_EQ(mode(), current->kind());
AddToInactive(current);
}
}
@@ -1843,7 +1841,7 @@ void LinearScanAllocator::AllocateRegisters() {
}
}
- DCHECK(!current->HasRegisterAssigned() && !current->IsSpilled());
+ DCHECK(!current->HasRegisterAssigned() && !current->spilled());
bool result = TryAllocateFreeReg(current);
if (!result) AllocateBlockedReg(current);
@@ -1865,7 +1863,7 @@ const char* LinearScanAllocator::RegisterName(int allocation_index) const {
void LinearScanAllocator::SetLiveRangeAssignedRegister(LiveRange* range,
int reg) {
- data()->MarkAllocated(range->Kind(), reg);
+ data()->MarkAllocated(range->kind(), reg);
range->set_assigned_register(reg);
range->SetUseHints(reg);
if (range->is_phi()) {
@@ -1888,7 +1886,7 @@ void LinearScanAllocator::AddToInactive(LiveRange* range) {
void LinearScanAllocator::AddToUnhandledSorted(LiveRange* range) {
if (range == nullptr || range->IsEmpty()) return;
- DCHECK(!range->HasRegisterAssigned() && !range->IsSpilled());
+ DCHECK(!range->HasRegisterAssigned() && !range->spilled());
DCHECK(allocation_finger_ <= range->Start());
for (int i = static_cast<int>(unhandled_live_ranges().size() - 1); i >= 0;
--i) {
@@ -1908,7 +1906,7 @@ void LinearScanAllocator::AddToUnhandledSorted(LiveRange* range) {
void LinearScanAllocator::AddToUnhandledUnsorted(LiveRange* range) {
if (range == nullptr || range->IsEmpty()) return;
- DCHECK(!range->HasRegisterAssigned() && !range->IsSpilled());
+ DCHECK(!range->HasRegisterAssigned() && !range->spilled());
TRACE("Add live range %d to unhandled unsorted at end\n", range->id());
unhandled_live_ranges().push_back(range);
}
@@ -2186,7 +2184,7 @@ bool LinearScanAllocator::TryReuseSpillForPhi(LiveRange* range) {
while (op_range != nullptr && !op_range->CanCover(pred_end)) {
op_range = op_range->next();
}
- if (op_range != nullptr && op_range->IsSpilled()) {
+ if (op_range != nullptr && op_range->spilled()) {
spilled_count++;
if (first_op == nullptr) {
first_op = op_range->TopLevel();
@@ -2560,8 +2558,8 @@ bool GreedyAllocator::HandleSpillOperands(LiveRange* range) {
void GreedyAllocator::AllocateRegisters() {
for (auto range : data()->live_ranges()) {
if (range == nullptr) continue;
- if (range->Kind() == mode()) {
- DCHECK(!range->HasRegisterAssigned() && !range->IsSpilled());
+ if (range->kind() == mode()) {
+ DCHECK(!range->HasRegisterAssigned() && !range->spilled());
TRACE("Enqueueing live range %d to priority queue \n", range->id());
Enqueue(range);
}
@@ -2575,7 +2573,7 @@ void GreedyAllocator::AllocateRegisters() {
for (auto* current : GetFixedRegisters(data(), mode())) {
if (current != nullptr) {
- DCHECK_EQ(mode(), current->Kind());
+ DCHECK_EQ(mode(), current->kind());
int reg_nr = current->assigned_register();
bool inserted = allocations_[reg_nr]->Insert(current);
CHECK(inserted);
@@ -2654,7 +2652,7 @@ void OperandAssigner::AssignSpillSlots() {
for (auto range : spill_ranges) {
if (range->IsEmpty()) continue;
// Allocate a new operand referring to the spill slot.
- auto kind = range->Kind();
+ auto kind = range->kind();
int index = data()->frame()->AllocateSpillSlot(kind == DOUBLE_REGISTERS);
auto op_kind = kind == DOUBLE_REGISTERS
? AllocatedOperand::DOUBLE_STACK_SLOT
@@ -2766,7 +2764,7 @@ void ReferenceMapPopulator::PopulateReferenceMaps() {
map->RecordReference(*range->GetSpillOperand());
}
- if (!cur->IsSpilled()) {
+ if (!cur->spilled()) {
TRACE(
"Pointer in register for range %d (start at %d) "
"at safe point %d\n",
@@ -2940,7 +2938,7 @@ void LiveRangeConnector::ResolveControlFlow(Zone* local_zone) {
const auto* pred_block = code()->InstructionBlockAt(pred);
array->Find(block, pred_block, &result);
if (result.cur_cover_ == result.pred_cover_ ||
- result.cur_cover_->IsSpilled())
+ result.cur_cover_->spilled())
continue;
auto pred_op = result.pred_cover_->GetAssignedOperand();
auto cur_op = result.cur_cover_->GetAssignedOperand();
@@ -2985,7 +2983,7 @@ void LiveRangeConnector::ConnectRanges(Zone* local_zone) {
auto pos = second_range->Start();
// Add gap move if the two live ranges touch and there is no block
// boundary.
- if (second_range->IsSpilled()) continue;
+ if (second_range->spilled()) continue;
if (first_range->End() != pos) continue;
if (IsBlockBoundary(code(), pos) &&
!CanEagerlyResolveControlFlow(GetInstructionBlock(code(), pos))) {
« no previous file with comments | « src/compiler/register-allocator.h ('k') | no next file » | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698