 Chromium Code Reviews
 Chromium Code Reviews Issue 810403003:
  [turbofan] remove checks for virtual register overflow  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master
    
  
    Issue 810403003:
  [turbofan] remove checks for virtual register overflow  (Closed) 
  Base URL: https://chromium.googlesource.com/v8/v8.git@master| Index: src/compiler/instruction.h | 
| diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h | 
| index daa83f29bc55dcad7b9d512911aa8b8a32e7e2fc..2cb4108a9d1be538e31d36d12c16157832ce2ed8 100644 | 
| --- a/src/compiler/instruction.h | 
| +++ b/src/compiler/instruction.h | 
| @@ -73,9 +73,9 @@ class InstructionOperand : public ZoneObject { | 
| static void TearDownCaches(); | 
| protected: | 
| - typedef BitField64<Kind, 0, 3> KindField; | 
| + typedef BitField<Kind, 0, 3> KindField; | 
| - uint64_t value_; | 
| + uint32_t value_; | 
| }; | 
| typedef ZoneVector<InstructionOperand*> InstructionOperandVector; | 
| @@ -115,27 +115,29 @@ class UnallocatedOperand : public InstructionOperand { | 
| USED_AT_END | 
| }; | 
| + static const int kInvalidVirtualRegister = -1; | 
| + | 
| explicit UnallocatedOperand(ExtendedPolicy policy) | 
| - : InstructionOperand(UNALLOCATED, 0) { | 
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); | 
| + : InstructionOperand(UNALLOCATED, 0), | 
| + virtual_register_(kInvalidVirtualRegister) { | 
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY); | 
| value_ |= ExtendedPolicyField::encode(policy); | 
| value_ |= LifetimeField::encode(USED_AT_END); | 
| } | 
| UnallocatedOperand(BasicPolicy policy, int index) | 
| - : InstructionOperand(UNALLOCATED, 0) { | 
| + : InstructionOperand(UNALLOCATED, 0), | 
| + virtual_register_(kInvalidVirtualRegister) { | 
| DCHECK(policy == FIXED_SLOT); | 
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); | 
| value_ |= BasicPolicyField::encode(policy); | 
| - value_ |= static_cast<int64_t>(index) << FixedSlotIndexField::kShift; | 
| + value_ |= static_cast<int32_t>(index) << FixedSlotIndexField::kShift; | 
| DCHECK(this->fixed_slot_index() == index); | 
| } | 
| UnallocatedOperand(ExtendedPolicy policy, int index) | 
| - : InstructionOperand(UNALLOCATED, 0) { | 
| + : InstructionOperand(UNALLOCATED, 0), | 
| + virtual_register_(kInvalidVirtualRegister) { | 
| DCHECK(policy == FIXED_REGISTER || policy == FIXED_DOUBLE_REGISTER); | 
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); | 
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY); | 
| value_ |= ExtendedPolicyField::encode(policy); | 
| value_ |= LifetimeField::encode(USED_AT_END); | 
| @@ -143,8 +145,8 @@ class UnallocatedOperand : public InstructionOperand { | 
| } | 
| UnallocatedOperand(ExtendedPolicy policy, Lifetime lifetime) | 
| - : InstructionOperand(UNALLOCATED, 0) { | 
| - value_ |= VirtualRegisterField::encode(kInvalidVirtualRegister); | 
| + : InstructionOperand(UNALLOCATED, 0), | 
| + virtual_register_(kInvalidVirtualRegister) { | 
| value_ |= BasicPolicyField::encode(EXTENDED_POLICY); | 
| value_ |= ExtendedPolicyField::encode(policy); | 
| value_ |= LifetimeField::encode(lifetime); | 
| @@ -172,35 +174,32 @@ class UnallocatedOperand : public InstructionOperand { | 
| // because it accommodates a larger pay-load. | 
| // | 
| // For FIXED_SLOT policy: | 
| - // +------------------------------------------+ | 
| - // | slot_index | vreg | 0 | 001 | | 
| - // +------------------------------------------+ | 
| + // +-----------------------------+ | 
| + // | slot_index | 0 | 001 | | 
| + // +-----------------------------+ | 
| // | 
| // For all other (extended) policies: | 
| - // +------------------------------------------+ | 
| - // | reg_index | L | PPP | vreg | 1 | 001 | L ... Lifetime | 
| - // +------------------------------------------+ P ... Policy | 
| + // +----------------------------------+ | 
| + // | reg_index | L | PPP | 1 | 001 | L ... Lifetime | 
| + // +----------------------------------+ P ... Policy | 
| // | 
| // The slot index is a signed value which requires us to decode it manually | 
| - // instead of using the BitField64 utility class. | 
| + // instead of using the BitField utility class. | 
| // The superclass has a KindField. | 
| STATIC_ASSERT(KindField::kSize == 3); | 
| // BitFields for all unallocated operands. | 
| - class BasicPolicyField : public BitField64<BasicPolicy, 3, 1> {}; | 
| - class VirtualRegisterField : public BitField64<unsigned, 4, 30> {}; | 
| + class BasicPolicyField : public BitField<BasicPolicy, 3, 1> {}; | 
| // BitFields specific to BasicPolicy::FIXED_SLOT. | 
| - class FixedSlotIndexField : public BitField64<int, 34, 30> {}; | 
| + class FixedSlotIndexField : public BitField<int, 4, 28> {}; | 
| // BitFields specific to BasicPolicy::EXTENDED_POLICY. | 
| - class ExtendedPolicyField : public BitField64<ExtendedPolicy, 34, 3> {}; | 
| - class LifetimeField : public BitField64<Lifetime, 37, 1> {}; | 
| - class FixedRegisterField : public BitField64<int, 38, 6> {}; | 
| + class ExtendedPolicyField : public BitField<ExtendedPolicy, 4, 3> {}; | 
| + class LifetimeField : public BitField<Lifetime, 7, 1> {}; | 
| + class FixedRegisterField : public BitField<int, 8, 6> {}; | 
| - static const int kInvalidVirtualRegister = VirtualRegisterField::kMax; | 
| - static const int kMaxVirtualRegisters = VirtualRegisterField::kMax; | 
| static const int kFixedSlotIndexWidth = FixedSlotIndexField::kSize; | 
| static const int kMaxFixedSlotIndex = (1 << (kFixedSlotIndexWidth - 1)) - 1; | 
| static const int kMinFixedSlotIndex = -(1 << (kFixedSlotIndexWidth - 1)); | 
| @@ -244,7 +243,7 @@ class UnallocatedOperand : public InstructionOperand { | 
| // [fixed_slot_index]: Only for FIXED_SLOT. | 
| int fixed_slot_index() const { | 
| DCHECK(HasFixedSlotPolicy()); | 
| - return static_cast<int>(bit_cast<int64_t>(value_) >> | 
| + return static_cast<int>(bit_cast<int32_t>(value_) >> | 
| FixedSlotIndexField::kShift); | 
| } | 
| @@ -254,10 +253,11 @@ class UnallocatedOperand : public InstructionOperand { | 
| return FixedRegisterField::decode(value_); | 
| } | 
| + // TODO(dcarney): return unsigned or make virtual register opaque. | 
| // [virtual_register]: The virtual register ID for this operand. | 
| - int virtual_register() const { return VirtualRegisterField::decode(value_); } | 
| + int virtual_register() const { return virtual_register_; } | 
| 
Benedikt Meurer
2015/01/07 11:24:08
Can't we just change the return type to unsigned h
 | 
| void set_virtual_register(unsigned id) { | 
| - value_ = VirtualRegisterField::update(value_, id); | 
| + virtual_register_ = static_cast<int>(id); | 
| } | 
| // [lifetime]: Only for non-FIXED_SLOT. | 
| @@ -265,6 +265,9 @@ class UnallocatedOperand : public InstructionOperand { | 
| DCHECK(basic_policy() == EXTENDED_POLICY); | 
| return LifetimeField::decode(value_) == USED_AT_START; | 
| } | 
| + | 
| + private: | 
| + int32_t virtual_register_; | 
| }; | 
| @@ -947,7 +950,7 @@ class InstructionSequence FINAL : public ZoneObject { | 
| InstructionSequence(Zone* zone, InstructionBlocks* instruction_blocks); | 
| - int NextVirtualRegister() { return next_virtual_register_++; } | 
| + int NextVirtualRegister(); | 
| int VirtualRegisterCount() const { return next_virtual_register_; } | 
| const InstructionBlocks& instruction_blocks() const { |