| Index: src/lithium-allocator.cc
|
| diff --git a/src/lithium-allocator.cc b/src/lithium-allocator.cc
|
| index 3c5abd19846d0ec018ab9c4947b1f84b17292bce..29c31942e44387903929e80e83241003a84ba8c2 100644
|
| --- a/src/lithium-allocator.cc
|
| +++ b/src/lithium-allocator.cc
|
| @@ -131,7 +131,7 @@ bool LiveRange::HasOverlap(UseInterval* target) const {
|
| LiveRange::LiveRange(int id, Zone* zone)
|
| : id_(id),
|
| spilled_(false),
|
| - is_double_(false),
|
| + kind_(UNALLOCATED_REGISTERS),
|
| assigned_register_(kInvalidAssignment),
|
| last_interval_(NULL),
|
| first_interval_(NULL),
|
| @@ -145,12 +145,9 @@ LiveRange::LiveRange(int id, Zone* zone)
|
| spill_start_index_(kMaxInt) { }
|
|
|
|
|
| -void LiveRange::set_assigned_register(int reg,
|
| - RegisterKind register_kind,
|
| - Zone* zone) {
|
| +void LiveRange::set_assigned_register(int reg, Zone* zone) {
|
| ASSERT(!HasRegisterAssigned() && !IsSpilled());
|
| assigned_register_ = reg;
|
| - is_double_ = (register_kind == DOUBLE_REGISTERS);
|
| ConvertOperands(zone);
|
| }
|
|
|
| @@ -234,10 +231,15 @@ LOperand* LiveRange::CreateAssignedOperand(Zone* zone) {
|
| LOperand* op = NULL;
|
| if (HasRegisterAssigned()) {
|
| ASSERT(!IsSpilled());
|
| - if (IsDouble()) {
|
| - op = LDoubleRegister::Create(assigned_register(), zone);
|
| - } else {
|
| - op = LRegister::Create(assigned_register(), zone);
|
| + switch (Kind()) {
|
| + case GENERAL_REGISTERS:
|
| + op = LRegister::Create(assigned_register(), zone);
|
| + break;
|
| + case DOUBLE_REGISTERS:
|
| + op = LDoubleRegister::Create(assigned_register(), zone);
|
| + break;
|
| + default:
|
| + UNREACHABLE();
|
| }
|
| } else if (IsSpilled()) {
|
| ASSERT(!HasRegisterAssigned());
|
| @@ -352,6 +354,7 @@ void LiveRange::SplitAt(LifetimePosition position,
|
| // Link the new live range in the chain before any of the other
|
| // ranges linked from the range before the split.
|
| result->parent_ = (parent_ == NULL) ? this : parent_;
|
| + result->kind_ = result->parent_->kind_;
|
| result->next_ = next_;
|
| next_ = result;
|
|
|
| @@ -553,7 +556,7 @@ LAllocator::LAllocator(int num_values, HGraph* graph)
|
| reusable_slots_(8, zone()),
|
| next_virtual_register_(num_values),
|
| first_artificial_register_(num_values),
|
| - mode_(GENERAL_REGISTERS),
|
| + mode_(UNALLOCATED_REGISTERS),
|
| num_registers_(-1),
|
| graph_(graph),
|
| has_osr_entry_(false),
|
| @@ -653,7 +656,8 @@ LiveRange* LAllocator::FixedLiveRangeFor(int index) {
|
| if (result == NULL) {
|
| result = new(zone()) LiveRange(FixedLiveRangeID(index), chunk()->zone());
|
| ASSERT(result->IsFixed());
|
| - SetLiveRangeAssignedRegister(result, index, GENERAL_REGISTERS);
|
| + result->kind_ = GENERAL_REGISTERS;
|
| + SetLiveRangeAssignedRegister(result, index);
|
| fixed_live_ranges_[index] = result;
|
| }
|
| return result;
|
| @@ -667,7 +671,8 @@ LiveRange* LAllocator::FixedDoubleLiveRangeFor(int index) {
|
| result = new(zone()) LiveRange(FixedDoubleLiveRangeID(index),
|
| chunk()->zone());
|
| ASSERT(result->IsFixed());
|
| - SetLiveRangeAssignedRegister(result, index, DOUBLE_REGISTERS);
|
| + result->kind_ = DOUBLE_REGISTERS;
|
| + SetLiveRangeAssignedRegister(result, index);
|
| fixed_double_live_ranges_[index] = result;
|
| }
|
| return result;
|
| @@ -1375,6 +1380,12 @@ void LAllocator::BuildLiveRanges() {
|
| }
|
| #endif
|
| }
|
| +
|
| + for (int i = 0; i < live_ranges_.length(); ++i) {
|
| + if (live_ranges_[i] != NULL) {
|
| + live_ranges_[i]->kind_ = RequiredRegisterKind(live_ranges_[i]->id());
|
| + }
|
| + }
|
| }
|
|
|
|
|
| @@ -1481,6 +1492,7 @@ void LAllocator::PopulatePointerMaps() {
|
| void LAllocator::AllocateGeneralRegisters() {
|
| LAllocatorPhase phase("L_Allocate general registers", this);
|
| num_registers_ = Register::NumAllocatableRegisters();
|
| + mode_ = GENERAL_REGISTERS;
|
| AllocateRegisters();
|
| }
|
|
|
| @@ -1498,7 +1510,7 @@ void LAllocator::AllocateRegisters() {
|
|
|
| for (int i = 0; i < live_ranges_.length(); ++i) {
|
| if (live_ranges_[i] != NULL) {
|
| - if (RequiredRegisterKind(live_ranges_[i]->id()) == mode_) {
|
| + if (live_ranges_[i]->Kind() == mode_) {
|
| AddToUnhandledUnsorted(live_ranges_[i]);
|
| }
|
| }
|
| @@ -1518,6 +1530,7 @@ void LAllocator::AllocateRegisters() {
|
| }
|
| }
|
| } else {
|
| + ASSERT(mode_ == GENERAL_REGISTERS);
|
| for (int i = 0; i < fixed_live_ranges_.length(); ++i) {
|
| LiveRange* current = fixed_live_ranges_.at(i);
|
| if (current != NULL) {
|
| @@ -1812,7 +1825,7 @@ bool LAllocator::TryAllocateFreeReg(LiveRange* current) {
|
| TraceAlloc("Assigning preferred reg %s to live range %d\n",
|
| RegisterName(register_index),
|
| current->id());
|
| - SetLiveRangeAssignedRegister(current, register_index, mode_);
|
| + SetLiveRangeAssignedRegister(current, register_index);
|
| return true;
|
| }
|
| }
|
| @@ -1847,7 +1860,7 @@ bool LAllocator::TryAllocateFreeReg(LiveRange* current) {
|
| TraceAlloc("Assigning free reg %s to live range %d\n",
|
| RegisterName(reg),
|
| current->id());
|
| - SetLiveRangeAssignedRegister(current, reg, mode_);
|
| + SetLiveRangeAssignedRegister(current, reg);
|
|
|
| return true;
|
| }
|
| @@ -1932,7 +1945,7 @@ void LAllocator::AllocateBlockedReg(LiveRange* current) {
|
| TraceAlloc("Assigning blocked reg %s to live range %d\n",
|
| RegisterName(reg),
|
| current->id());
|
| - SetLiveRangeAssignedRegister(current, reg, mode_);
|
| + SetLiveRangeAssignedRegister(current, reg);
|
|
|
| // This register was not free. Thus we need to find and spill
|
| // parts of active and inactive live regions that use the same register
|
| @@ -2149,7 +2162,7 @@ void LAllocator::Spill(LiveRange* range) {
|
|
|
| if (!first->HasAllocatedSpillOperand()) {
|
| LOperand* op = TryReuseSpillSlot(range);
|
| - if (op == NULL) op = chunk_->GetNextSpillSlot(mode_ == DOUBLE_REGISTERS);
|
| + if (op == NULL) op = chunk_->GetNextSpillSlot(range->Kind());
|
| first->SetSpillOperand(op);
|
| }
|
| range->MakeSpilled(chunk()->zone());
|
|
|