| Index: src/compiler/register-allocator.h
|
| diff --git a/src/compiler/register-allocator.h b/src/compiler/register-allocator.h
|
| index 9ee778d0bd358d37a58fcafb1077b6398a376acf..d5bd0e7dc8caa3e59294124044ea4bc47c01785d 100644
|
| --- a/src/compiler/register-allocator.h
|
| +++ b/src/compiler/register-allocator.h
|
| @@ -20,57 +20,84 @@ enum RegisterKind {
|
|
|
|
|
| // This class represents a single point of a InstructionOperand's lifetime. For
|
| -// each instruction there are exactly two lifetime positions: the beginning and
|
| -// the end of the instruction. Lifetime positions for different instructions are
|
| -// disjoint.
|
| +// each instruction there are four lifetime positions:
|
| +//
|
| +// [[START, END], [START, END]]
|
| +//
|
| +// Where the first half position corresponds to
|
| +//
|
| +// [GapPosition::START, GapPosition::END]
|
| +//
|
| +// and the second half position corresponds to
|
| +//
|
| +// [Lifetime::USED_AT_START, Lifetime::USED_AT_END]
|
| +//
|
| class LifetimePosition FINAL {
|
| public:
|
| // Return the lifetime position that corresponds to the beginning of
|
| - // the instruction with the given index.
|
| - static LifetimePosition FromInstructionIndex(int index) {
|
| + // the gap with the given index.
|
| + static LifetimePosition GapFromInstructionIndex(int index) {
|
| return LifetimePosition(index * kStep);
|
| }
|
| + // Return the lifetime position that corresponds to the beginning of
|
| + // the instruction with the given index.
|
| + static LifetimePosition InstructionFromInstructionIndex(int index) {
|
| + return LifetimePosition(index * kStep + kHalfStep);
|
| + }
|
|
|
| // Returns a numeric representation of this lifetime position.
|
| int Value() const { return value_; }
|
|
|
| // Returns the index of the instruction to which this lifetime position
|
| // corresponds.
|
| - int InstructionIndex() const {
|
| + int ToInstructionIndex() const {
|
| DCHECK(IsValid());
|
| return value_ / kStep;
|
| }
|
|
|
| - // Returns true if this lifetime position corresponds to the instruction
|
| - // start.
|
| - bool IsInstructionStart() const { return (value_ & (kStep - 1)) == 0; }
|
| + // Returns true if this lifetime position corresponds to a START value
|
| + bool IsStart() const { return (value_ & (kHalfStep - 1)) == 0; }
|
| + // Returns true if this lifetime position corresponds to a gap START value
|
| + bool IsFullStart() const { return (value_ & (kStep - 1)) == 0; }
|
| +
|
| + bool IsGapPosition() { return (value_ & 0x2) == 0; }
|
| + bool IsInstructionPosition() { return !IsGapPosition(); }
|
| +
|
| + // Returns the lifetime position for the current START.
|
| + LifetimePosition Start() const {
|
| + DCHECK(IsValid());
|
| + return LifetimePosition(value_ & ~(kHalfStep - 1));
|
| + }
|
|
|
| - // Returns the lifetime position for the start of the instruction which
|
| - // corresponds to this lifetime position.
|
| - LifetimePosition InstructionStart() const {
|
| + // Returns the lifetime position for the current gap START.
|
| + LifetimePosition FullStart() const {
|
| DCHECK(IsValid());
|
| return LifetimePosition(value_ & ~(kStep - 1));
|
| }
|
|
|
| - // Returns the lifetime position for the end of the instruction which
|
| - // corresponds to this lifetime position.
|
| - LifetimePosition InstructionEnd() const {
|
| + // Returns the lifetime position for the current END.
|
| + LifetimePosition End() const {
|
| DCHECK(IsValid());
|
| - return LifetimePosition(InstructionStart().Value() + kStep / 2);
|
| + return LifetimePosition(Start().Value() + kHalfStep / 2);
|
| }
|
|
|
| - // Returns the lifetime position for the beginning of the next instruction.
|
| - LifetimePosition NextInstruction() const {
|
| + // Returns the lifetime position for the beginning of the next START.
|
| + LifetimePosition NextStart() const {
|
| DCHECK(IsValid());
|
| - return LifetimePosition(InstructionStart().Value() + kStep);
|
| + return LifetimePosition(Start().Value() + kHalfStep);
|
| }
|
|
|
| - // Returns the lifetime position for the beginning of the previous
|
| - // instruction.
|
| - LifetimePosition PrevInstruction() const {
|
| + // Returns the lifetime position for the beginning of the next gap START.
|
| + LifetimePosition NextFullStart() const {
|
| + DCHECK(IsValid());
|
| + return LifetimePosition(FullStart().Value() + kStep);
|
| + }
|
| +
|
| + // Returns the lifetime position for the beginning of the previous START.
|
| + LifetimePosition PrevStart() const {
|
| DCHECK(IsValid());
|
| - DCHECK(value_ > 1);
|
| - return LifetimePosition(InstructionStart().Value() - kStep);
|
| + DCHECK(value_ >= kHalfStep);
|
| + return LifetimePosition(Start().Value() - kHalfStep);
|
| }
|
|
|
| // Constructs the lifetime position which does not correspond to any
|
| @@ -90,10 +117,11 @@ class LifetimePosition FINAL {
|
| }
|
|
|
| private:
|
| - static const int kStep = 2;
|
| + static const int kHalfStep = 2;
|
| + static const int kStep = 2 * kHalfStep;
|
|
|
| - // Code relies on kStep being a power of two.
|
| - STATIC_ASSERT(IS_POWER_OF_TWO(kStep));
|
| + // Code relies on kStep and kHalfStep being a power of two.
|
| + STATIC_ASSERT(IS_POWER_OF_TWO(kHalfStep));
|
|
|
| explicit LifetimePosition(int value) : value_(value) {}
|
|
|
| @@ -495,8 +523,8 @@ class RegisterAllocator FINAL : public ZoneObject {
|
| bool IsOutputDoubleRegisterOf(Instruction* instr, int index);
|
| void ProcessInstructions(const InstructionBlock* block, BitVector* live);
|
| void MeetRegisterConstraints(const InstructionBlock* block);
|
| - void MeetConstraintsBetween(Instruction* first, Instruction* second,
|
| - int gap_index);
|
| + void MeetConstraintsBefore(int index);
|
| + void MeetConstraintsAfter(int index);
|
| void MeetRegisterConstraintsForLastInstructionInBlock(
|
| const InstructionBlock* block);
|
| void ResolvePhis(const InstructionBlock* block);
|
| @@ -509,7 +537,7 @@ class RegisterAllocator FINAL : public ZoneObject {
|
| InstructionOperand* hint);
|
| void Use(LifetimePosition block_start, LifetimePosition position,
|
| InstructionOperand* operand, InstructionOperand* hint);
|
| - void AddGapMove(int index, GapInstruction::InnerPosition position,
|
| + void AddGapMove(int index, Instruction::GapPosition position,
|
| InstructionOperand* from, InstructionOperand* to);
|
|
|
| // Helper methods for updating the life range lists.
|
| @@ -590,7 +618,7 @@ class RegisterAllocator FINAL : public ZoneObject {
|
| LiveRange* FixedLiveRangeFor(int index);
|
| LiveRange* FixedDoubleLiveRangeFor(int index);
|
| LiveRange* LiveRangeFor(int index);
|
| - GapInstruction* GetLastGap(const InstructionBlock* block);
|
| + Instruction* GetLastInstruction(const InstructionBlock* block);
|
|
|
| const char* RegisterName(int allocation_index);
|
|
|
|
|