[maglev] Properly use MachineRepresentation in RegAlloc

We need to use MachineRepresentation to properly distinguish
the types in compiler::UnallocatedOperand.

Bug: v8:7700
Change-Id: I4273512a00290bb85b09aeb3788643e346be03f7
Reviewed-on: https://chromium-review.googlesource.com/c/v8/v8/+/3602515
Reviewed-by: Leszek Swirski <leszeks@chromium.org>
Auto-Submit: Victor Gomes <victorgomes@chromium.org>
Commit-Queue: Victor Gomes <victorgomes@chromium.org>
Cr-Commit-Position: refs/heads/main@{#80140}
This commit is contained in:
Victor Gomes 2022-04-25 11:04:53 +02:00 committed by V8 LUCI CQ
parent fe12d2d1ec
commit 2c4d1b4c0a
2 changed files with 33 additions and 12 deletions

View File

@ -774,6 +774,17 @@ class ValueNode : public Node {
ValueRepresentation::kFloat64);
}
constexpr MachineRepresentation GetMachineRepresentation() const {
switch (properties().value_representation()) {
case ValueRepresentation::kTagged:
return MachineRepresentation::kTagged;
case ValueRepresentation::kInt32:
return MachineRepresentation::kWord32;
case ValueRepresentation::kFloat64:
return MachineRepresentation::kFloat64;
}
}
void AddRegister(Register reg) {
DCHECK(!use_double_register());
registers_with_result_.set(reg);
@ -811,8 +822,8 @@ class ValueNode : public Node {
compiler::AllocatedOperand allocation() const {
if (has_register()) {
return compiler::AllocatedOperand(compiler::LocationOperand::REGISTER,
MachineRepresentation::kTagged,
registers_with_result_.first().code());
GetMachineRepresentation(),
FirstRegisterCode());
}
DCHECK(is_spilled());
return compiler::AllocatedOperand::cast(spill_or_hint_);
@ -834,6 +845,13 @@ class ValueNode : public Node {
}
}
int FirstRegisterCode() const {
if (use_double_register()) {
return double_registers_with_result_.first().code();
}
return registers_with_result_.first().code();
}
// Rename for better pairing with `end_id`.
NodeIdT start_id() const { return id(); }

View File

@ -417,7 +417,7 @@ void StraightForwardRegisterAllocator::AllocateNodeResult(ValueNode* node) {
DCHECK_LT(operand.fixed_slot_index(), 0);
// Set the stack slot to exactly where the value is.
compiler::AllocatedOperand location(compiler::AllocatedOperand::STACK_SLOT,
MachineRepresentation::kTagged,
node->GetMachineRepresentation(),
operand.fixed_slot_index());
node->result().SetAllocated(location);
node->Spill(location);
@ -469,6 +469,7 @@ void StraightForwardRegisterAllocator::DropRegisterValue(
DCHECK(!registers.free().has(reg));
ValueNode* node = registers.GetValue(reg);
MachineRepresentation mach_repr = node->GetMachineRepresentation();
// Remove the register from the node's list.
node->RemoveRegister(reg);
@ -482,11 +483,9 @@ void StraightForwardRegisterAllocator::DropRegisterValue(
registers.SetValue(target_reg, node);
// Emit a gapmove.
compiler::AllocatedOperand source(compiler::LocationOperand::REGISTER,
MachineRepresentation::kTagged,
reg.code());
mach_repr, reg.code());
compiler::AllocatedOperand target(compiler::LocationOperand::REGISTER,
MachineRepresentation::kTagged,
target_reg.code());
mach_repr, target_reg.code());
if (FLAG_trace_maglev_regalloc) {
printing_visitor_->os()
@ -773,7 +772,7 @@ compiler::AllocatedOperand StraightForwardRegisterAllocator::ForceAllocate(
registers.RemoveFromFree(reg);
} else if (registers.GetValue(reg) == node) {
return compiler::AllocatedOperand(compiler::LocationOperand::REGISTER,
MachineRepresentation::kTagged,
node->GetMachineRepresentation(),
reg.code());
} else {
DropRegisterValue(registers, reg);
@ -783,7 +782,8 @@ compiler::AllocatedOperand StraightForwardRegisterAllocator::ForceAllocate(
#endif
registers.SetValue(reg, node);
return compiler::AllocatedOperand(compiler::LocationOperand::REGISTER,
MachineRepresentation::kTagged, reg.code());
node->GetMachineRepresentation(),
reg.code());
}
compiler::AllocatedOperand StraightForwardRegisterAllocator::ForceAllocate(
@ -808,7 +808,8 @@ compiler::InstructionOperand RegisterFrameState<RegisterT>::TryAllocateRegister(
// Simply update the state anyway.
SetValue(reg, node);
return compiler::AllocatedOperand(compiler::LocationOperand::REGISTER,
MachineRepresentation::kTagged, reg.code());
node->GetMachineRepresentation(),
reg.code());
}
void StraightForwardRegisterAllocator::AssignTemporaries(NodeBase* node) {
@ -895,9 +896,11 @@ void StraightForwardRegisterAllocator::MergeRegisterValues(ControlNode* control,
RegisterMerge* merge;
LoadMergeState(state, &node, &merge);
MachineRepresentation mach_repr = node == nullptr
? MachineRepresentation::kTagged
: node->GetMachineRepresentation();
compiler::AllocatedOperand register_info = {
compiler::LocationOperand::REGISTER, MachineRepresentation::kTagged,
reg.code()};
compiler::LocationOperand::REGISTER, mach_repr, reg.code()};
ValueNode* incoming = nullptr;
if (!general_registers_.free().has(reg)) {