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

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

Issue 1389373002: [turbofan] Create ExplicitOperands to specify operands without virtual registers (Closed) Base URL: https://chromium.googlesource.com/v8/v8.git@master
Patch Set: Review feedback Created 5 years, 2 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/move-optimizer.cc ('k') | src/compiler/register-allocator-verifier.h » ('j') | 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 0d7d1733bd3134866f86520ad72dff834afb8037..0410b417f84136a52c80b1a5940cd1651d99c2f2 100644
--- a/src/compiler/register-allocator.cc
+++ b/src/compiler/register-allocator.cc
@@ -71,7 +71,7 @@ bool IsOutputRegisterOf(Instruction* instr, Register reg) {
for (size_t i = 0; i < instr->OutputCount(); i++) {
auto output = instr->OutputAt(i);
if (output->IsRegister() &&
- RegisterOperand::cast(output)->GetRegister().is(reg)) {
+ LocationOperand::cast(output)->GetRegister().is(reg)) {
return true;
}
}
@@ -83,7 +83,7 @@ bool IsOutputDoubleRegisterOf(Instruction* instr, DoubleRegister reg) {
for (size_t i = 0; i < instr->OutputCount(); i++) {
auto output = instr->OutputAt(i);
if (output->IsDoubleRegister() &&
- DoubleRegisterOperand::cast(output)->GetDoubleRegister().is(reg)) {
+ LocationOperand::cast(output)->GetDoubleRegister().is(reg)) {
return true;
}
}
@@ -161,10 +161,8 @@ bool UsePosition::HintRegister(int* register_code) const {
auto operand = reinterpret_cast<InstructionOperand*>(hint_);
int assigned_register =
operand->IsRegister()
- ? RegisterOperand::cast(operand)->GetRegister().code()
- : DoubleRegisterOperand::cast(operand)
- ->GetDoubleRegister()
- .code();
+ ? LocationOperand::cast(operand)->GetRegister().code()
+ : LocationOperand::cast(operand)->GetDoubleRegister().code();
*register_code = assigned_register;
return true;
}
@@ -186,17 +184,16 @@ UsePositionHintType UsePosition::HintTypeForOperand(
switch (op.kind()) {
case InstructionOperand::CONSTANT:
case InstructionOperand::IMMEDIATE:
+ case InstructionOperand::EXPLICIT:
return UsePositionHintType::kNone;
case InstructionOperand::UNALLOCATED:
return UsePositionHintType::kUnresolved;
case InstructionOperand::ALLOCATED:
- switch (AllocatedOperand::cast(op).allocated_kind()) {
- case AllocatedOperand::REGISTER:
- case AllocatedOperand::DOUBLE_REGISTER:
- return UsePositionHintType::kOperand;
- case AllocatedOperand::STACK_SLOT:
- case AllocatedOperand::DOUBLE_STACK_SLOT:
- return UsePositionHintType::kNone;
+ if (op.IsRegister() || op.IsDoubleRegister()) {
+ return UsePositionHintType::kOperand;
+ } else {
+ DCHECK(op.IsStackSlot() || op.IsDoubleStackSlot());
+ return UsePositionHintType::kNone;
}
case InstructionOperand::INVALID:
break;
@@ -400,12 +397,8 @@ bool LiveRange::IsTopLevel() const { return top_level_ == this; }
InstructionOperand LiveRange::GetAssignedOperand() const {
if (HasRegisterAssigned()) {
DCHECK(!spilled());
- switch (kind()) {
- case GENERAL_REGISTERS:
- return RegisterOperand(machine_type(), assigned_register());
- case DOUBLE_REGISTERS:
- return DoubleRegisterOperand(machine_type(), assigned_register());
- }
+ return AllocatedOperand(LocationOperand::REGISTER, machine_type(),
+ assigned_register());
}
DCHECK(spilled());
DCHECK(!HasRegisterAssigned());
@@ -841,14 +834,7 @@ void TopLevelLiveRange::SetSpillRange(SpillRange* spill_range) {
AllocatedOperand TopLevelLiveRange::GetSpillRangeOperand() const {
auto spill_range = GetSpillRange();
int index = spill_range->assigned_slot();
- switch (kind()) {
- case GENERAL_REGISTERS:
- return StackSlotOperand(machine_type(), index);
- case DOUBLE_REGISTERS:
- return DoubleStackSlotOperand(machine_type(), index);
- }
- UNREACHABLE();
- return StackSlotOperand(kMachNone, 0);
+ return AllocatedOperand(LocationOperand::STACK_SLOT, machine_type(), index);
}
@@ -1532,18 +1518,17 @@ InstructionOperand* ConstraintBuilder::AllocateFixed(
machine_type = data()->MachineTypeFor(virtual_register);
}
if (operand->HasFixedSlotPolicy()) {
- AllocatedOperand::AllocatedKind kind =
- IsFloatingPoint(machine_type) ? AllocatedOperand::DOUBLE_STACK_SLOT
- : AllocatedOperand::STACK_SLOT;
- allocated =
- AllocatedOperand(kind, machine_type, operand->fixed_slot_index());
+ allocated = AllocatedOperand(AllocatedOperand::STACK_SLOT, machine_type,
+ operand->fixed_slot_index());
} else if (operand->HasFixedRegisterPolicy()) {
+ DCHECK(!IsFloatingPoint(machine_type));
allocated = AllocatedOperand(AllocatedOperand::REGISTER, machine_type,
operand->fixed_register_index());
} else if (operand->HasFixedDoubleRegisterPolicy()) {
+ DCHECK(IsFloatingPoint(machine_type));
DCHECK_NE(InstructionOperand::kInvalidVirtualRegister, virtual_register);
- allocated = AllocatedOperand(AllocatedOperand::DOUBLE_REGISTER,
- machine_type, operand->fixed_register_index());
+ allocated = AllocatedOperand(AllocatedOperand::REGISTER, machine_type,
+ operand->fixed_register_index());
} else {
UNREACHABLE();
}
@@ -1594,9 +1579,9 @@ void ConstraintBuilder::MeetRegisterConstraintsForLastInstructionInBlock(
AllocateFixed(output, -1, false);
// This value is produced on the stack, we never need to spill it.
if (output->IsStackSlot()) {
- DCHECK(StackSlotOperand::cast(output)->index() <
+ DCHECK(LocationOperand::cast(output)->index() <
data()->frame()->GetSpillSlotCount());
- range->SetSpillOperand(StackSlotOperand::cast(output));
+ range->SetSpillOperand(LocationOperand::cast(output));
range->SetSpillStartIndex(end);
assigned = true;
}
@@ -1654,9 +1639,9 @@ void ConstraintBuilder::MeetConstraintsAfter(int instr_index) {
// This value is produced on the stack, we never need to spill it.
if (first_output->IsStackSlot()) {
- DCHECK(StackSlotOperand::cast(first_output)->index() <
+ DCHECK(LocationOperand::cast(first_output)->index() <
data()->frame()->GetTotalFrameSlotCount());
- range->SetSpillOperand(StackSlotOperand::cast(first_output));
+ range->SetSpillOperand(LocationOperand::cast(first_output));
range->SetSpillStartIndex(instr_index + 1);
assigned = true;
}
@@ -1679,7 +1664,9 @@ void ConstraintBuilder::MeetConstraintsBefore(int instr_index) {
// Handle fixed input operands of second instruction.
for (size_t i = 0; i < second->InputCount(); i++) {
auto input = second->InputAt(i);
- if (input->IsImmediate()) continue; // Ignore immediates.
+ if (input->IsImmediate() || input->IsExplicit()) {
+ continue; // Ignore immediates and explicitly reserved registers.
+ }
auto cur_input = UnallocatedOperand::cast(input);
if (cur_input->HasFixedPolicy()) {
int input_vreg = cur_input->virtual_register();
@@ -1859,10 +1846,10 @@ TopLevelLiveRange* LiveRangeBuilder::LiveRangeFor(InstructionOperand* operand) {
ConstantOperand::cast(operand)->virtual_register());
} else if (operand->IsRegister()) {
return FixedLiveRangeFor(
- RegisterOperand::cast(operand)->GetRegister().code());
+ LocationOperand::cast(operand)->GetRegister().code());
} else if (operand->IsDoubleRegister()) {
return FixedDoubleLiveRangeFor(
- DoubleRegisterOperand::cast(operand)->GetDoubleRegister().code());
+ LocationOperand::cast(operand)->GetDoubleRegister().code());
} else {
return nullptr;
}
@@ -1976,7 +1963,9 @@ void LiveRangeBuilder::ProcessInstructions(const InstructionBlock* block,
for (size_t i = 0; i < instr->InputCount(); i++) {
auto input = instr->InputAt(i);
- if (input->IsImmediate()) continue; // Ignore immediates.
+ if (input->IsImmediate() || input->IsExplicit()) {
+ continue; // Ignore immediates and explicitly reserved registers.
+ }
LifetimePosition use_pos;
if (input->IsUnallocated() &&
UnallocatedOperand::cast(input)->IsUsedAtStart()) {
« no previous file with comments | « src/compiler/move-optimizer.cc ('k') | src/compiler/register-allocator-verifier.h » ('j') | no next file with comments »

Powered by Google App Engine
This is Rietveld 408576698