| Index: src/compiler/instruction.h
|
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
|
| index 05128c6cdf42d22ab993f2f870a17890557b735b..a8e3da36ae1710bc4114328119b58db3701995b7 100644
|
| --- a/src/compiler/instruction.h
|
| +++ b/src/compiler/instruction.h
|
| @@ -167,7 +167,7 @@ std::ostream& operator<<(std::ostream& os,
|
| return *static_cast<const OperandType*>(&op); \
|
| }
|
|
|
| -class UnallocatedOperand : public InstructionOperand {
|
| +class UnallocatedOperand final : public InstructionOperand {
|
| public:
|
| enum BasicPolicy { FIXED_SLOT, EXTENDED_POLICY };
|
|
|
| @@ -183,15 +183,14 @@ class UnallocatedOperand : public InstructionOperand {
|
|
|
| // Lifetime of operand inside the instruction.
|
| enum Lifetime {
|
| - // USED_AT_START operand is guaranteed to be live only at
|
| - // instruction start. Register allocator is free to assign the same register
|
| - // to some other operand used inside instruction (i.e. temporary or
|
| - // output).
|
| + // USED_AT_START operand is guaranteed to be live only at instruction start.
|
| + // The register allocator is free to assign the same register to some other
|
| + // operand used inside instruction (i.e. temporary or output).
|
| USED_AT_START,
|
|
|
| - // USED_AT_END operand is treated as live until the end of
|
| - // instruction. This means that register allocator will not reuse it's
|
| - // register for any other operand inside instruction.
|
| + // USED_AT_END operand is treated as live until the end of instruction.
|
| + // This means that register allocator will not reuse its register for any
|
| + // other operand inside instruction.
|
| USED_AT_END
|
| };
|
|
|
| @@ -233,6 +232,12 @@ class UnallocatedOperand : public InstructionOperand {
|
| value_ |= SecondaryStorageField::encode(slot_id);
|
| }
|
|
|
| + UnallocatedOperand(const UnallocatedOperand& other, int virtual_register) {
|
| + DCHECK_NE(kInvalidVirtualRegister, virtual_register);
|
| + value_ = VirtualRegisterField::update(
|
| + other.value_, static_cast<uint32_t>(virtual_register));
|
| + }
|
| +
|
| // Predicates for the operand policy.
|
| bool HasAnyPolicy() const {
|
| return basic_policy() == EXTENDED_POLICY && extended_policy() == ANY;
|
| @@ -275,7 +280,6 @@ class UnallocatedOperand : public InstructionOperand {
|
|
|
| // [basic_policy]: Distinguish between FIXED_SLOT and all other policies.
|
| BasicPolicy basic_policy() const {
|
| - DCHECK_EQ(UNALLOCATED, kind());
|
| return BasicPolicyField::decode(value_);
|
| }
|
|
|
| @@ -300,16 +304,9 @@ class UnallocatedOperand : public InstructionOperand {
|
|
|
| // [virtual_register]: The virtual register ID for this operand.
|
| int32_t virtual_register() const {
|
| - DCHECK_EQ(UNALLOCATED, kind());
|
| return static_cast<int32_t>(VirtualRegisterField::decode(value_));
|
| }
|
|
|
| - // TODO(dcarney): remove this.
|
| - void set_virtual_register(int32_t id) {
|
| - DCHECK_EQ(UNALLOCATED, kind());
|
| - value_ = VirtualRegisterField::update(value_, static_cast<uint32_t>(id));
|
| - }
|
| -
|
| // [lifetime]: Only for non-FIXED_SLOT.
|
| bool IsUsedAtStart() const {
|
| DCHECK(basic_policy() == EXTENDED_POLICY);
|
|
|