| Index: src/compiler/register-allocator.cc
|
| diff --git a/src/compiler/register-allocator.cc b/src/compiler/register-allocator.cc
|
| index 6499554db29d103d3f049dc82445b0bf589c02d0..8f024527503a761409b58046c64999c4d76cf3b4 100644
|
| --- a/src/compiler/register-allocator.cc
|
| +++ b/src/compiler/register-allocator.cc
|
| @@ -499,10 +499,13 @@ LifetimePosition LiveRange::FirstIntersection(LiveRange* other) {
|
| }
|
|
|
|
|
| -RegisterAllocator::RegisterAllocator(InstructionSequence* code)
|
| +RegisterAllocator::RegisterAllocator(Frame* frame, CompilationInfo* info,
|
| + InstructionSequence* code)
|
| : zone_(code->isolate()),
|
| + frame_(frame),
|
| + info_(info),
|
| code_(code),
|
| - live_in_sets_(code->BasicBlockCount(), zone()),
|
| + live_in_sets_(code->InstructionBlockCount(), zone()),
|
| live_ranges_(code->VirtualRegisterCount() * 2, zone()),
|
| fixed_live_ranges_(NULL),
|
| fixed_double_live_ranges_(NULL),
|
| @@ -517,7 +520,7 @@ RegisterAllocator::RegisterAllocator(InstructionSequence* code)
|
|
|
| void RegisterAllocator::InitializeLivenessAnalysis() {
|
| // Initialize the live_in sets for each block to NULL.
|
| - int block_count = code()->BasicBlockCount();
|
| + int block_count = code()->InstructionBlockCount();
|
| live_in_sets_.Initialize(block_count, zone());
|
| live_in_sets_.AddBlock(NULL, block_count, zone());
|
| }
|
| @@ -1107,15 +1110,15 @@ bool RegisterAllocator::Allocate() {
|
| PopulatePointerMaps();
|
| ConnectRanges();
|
| ResolveControlFlow();
|
| - code()->frame()->SetAllocatedRegisters(assigned_registers_);
|
| - code()->frame()->SetAllocatedDoubleRegisters(assigned_double_registers_);
|
| + frame()->SetAllocatedRegisters(assigned_registers_);
|
| + frame()->SetAllocatedDoubleRegisters(assigned_double_registers_);
|
| return true;
|
| }
|
|
|
|
|
| void RegisterAllocator::MeetRegisterConstraints() {
|
| RegisterAllocatorPhase phase("L_Register constraints", this);
|
| - for (int i = 0; i < code()->BasicBlockCount(); ++i) {
|
| + for (int i = 0; i < code()->InstructionBlockCount(); ++i) {
|
| MeetRegisterConstraints(
|
| code()->InstructionBlockAt(BasicBlock::RpoNumber::FromInt(i)));
|
| if (!AllocationOk()) return;
|
| @@ -1127,7 +1130,7 @@ void RegisterAllocator::ResolvePhis() {
|
| RegisterAllocatorPhase phase("L_Resolve phis", this);
|
|
|
| // Process the blocks in reverse order.
|
| - for (int i = code()->BasicBlockCount() - 1; i >= 0; --i) {
|
| + for (int i = code()->InstructionBlockCount() - 1; i >= 0; --i) {
|
| ResolvePhis(code()->InstructionBlockAt(BasicBlock::RpoNumber::FromInt(i)));
|
| }
|
| }
|
| @@ -1248,7 +1251,8 @@ bool RegisterAllocator::CanEagerlyResolveControlFlow(
|
|
|
| void RegisterAllocator::ResolveControlFlow() {
|
| RegisterAllocatorPhase phase("L_Resolve control flow", this);
|
| - for (int block_id = 1; block_id < code()->BasicBlockCount(); ++block_id) {
|
| + for (int block_id = 1; block_id < code()->InstructionBlockCount();
|
| + ++block_id) {
|
| const InstructionBlock* block =
|
| code()->InstructionBlockAt(BasicBlock::RpoNumber::FromInt(block_id));
|
| if (CanEagerlyResolveControlFlow(block)) continue;
|
| @@ -1271,7 +1275,7 @@ void RegisterAllocator::BuildLiveRanges() {
|
| RegisterAllocatorPhase phase("L_Build live ranges", this);
|
| InitializeLivenessAnalysis();
|
| // Process the blocks in reverse order.
|
| - for (int block_id = code()->BasicBlockCount() - 1; block_id >= 0;
|
| + for (int block_id = code()->InstructionBlockCount() - 1; block_id >= 0;
|
| --block_id) {
|
| const InstructionBlock* block =
|
| code()->InstructionBlockAt(BasicBlock::RpoNumber::FromInt(block_id));
|
| @@ -1354,7 +1358,7 @@ void RegisterAllocator::BuildLiveRanges() {
|
| operand_index);
|
| LiveRange* range = LiveRangeFor(operand_index);
|
| PrintF(" (first use is at %d)\n", range->first_pos()->pos().Value());
|
| - CompilationInfo* info = code()->linkage()->info();
|
| + CompilationInfo* info = this->info();
|
| if (info->IsStub()) {
|
| if (info->code_stub() == NULL) {
|
| PrintF("\n");
|
| @@ -1944,11 +1948,19 @@ void RegisterAllocator::AllocateBlockedReg(LiveRange* current) {
|
| }
|
|
|
|
|
| +static const InstructionBlock* GetContainingLoop(
|
| + const InstructionSequence* sequence, const InstructionBlock* block) {
|
| + BasicBlock::RpoNumber index = block->loop_header();
|
| + if (!index.IsValid()) return NULL;
|
| + return sequence->InstructionBlockAt(index);
|
| +}
|
| +
|
| +
|
| LifetimePosition RegisterAllocator::FindOptimalSpillingPos(
|
| LiveRange* range, LifetimePosition pos) {
|
| const InstructionBlock* block = GetInstructionBlock(pos.InstructionStart());
|
| const InstructionBlock* loop_header =
|
| - block->IsLoopHeader() ? block : code()->GetContainingLoop(block);
|
| + block->IsLoopHeader() ? block : GetContainingLoop(code(), block);
|
|
|
| if (loop_header == NULL) return pos;
|
|
|
| @@ -1969,7 +1981,7 @@ LifetimePosition RegisterAllocator::FindOptimalSpillingPos(
|
| }
|
|
|
| // Try hoisting out to an outer loop.
|
| - loop_header = code()->GetContainingLoop(loop_header);
|
| + loop_header = GetContainingLoop(code(), loop_header);
|
| }
|
|
|
| return pos;
|
| @@ -2086,10 +2098,10 @@ LifetimePosition RegisterAllocator::FindOptimalSplitPos(LifetimePosition start,
|
| const InstructionBlock* block = end_block;
|
| // Find header of outermost loop.
|
| // TODO(titzer): fix redundancy below.
|
| - while (code()->GetContainingLoop(block) != NULL &&
|
| - code()->GetContainingLoop(block)->rpo_number().ToInt() >
|
| + while (GetContainingLoop(code(), block) != NULL &&
|
| + GetContainingLoop(code(), block)->rpo_number().ToInt() >
|
| start_block->rpo_number().ToInt()) {
|
| - block = code()->GetContainingLoop(block);
|
| + block = GetContainingLoop(code(), block);
|
| }
|
|
|
| // We did not find any suitable outer loop. Split at the latest possible
|
| @@ -2153,7 +2165,7 @@ void RegisterAllocator::Spill(LiveRange* range) {
|
| if (op == NULL) {
|
| // Allocate a new operand referring to the spill slot.
|
| RegisterKind kind = range->Kind();
|
| - int index = code()->frame()->AllocateSpillSlot(kind == DOUBLE_REGISTERS);
|
| + int index = frame()->AllocateSpillSlot(kind == DOUBLE_REGISTERS);
|
| if (kind == DOUBLE_REGISTERS) {
|
| op = DoubleStackSlotOperand::Create(index, zone());
|
| } else {
|
| @@ -2198,8 +2210,7 @@ void RegisterAllocator::SetLiveRangeAssignedRegister(LiveRange* range,
|
|
|
| RegisterAllocatorPhase::RegisterAllocatorPhase(const char* name,
|
| RegisterAllocator* allocator)
|
| - : CompilationPhase(name, allocator->code()->linkage()->info()),
|
| - allocator_(allocator) {
|
| + : CompilationPhase(name, allocator->info()), allocator_(allocator) {
|
| if (FLAG_turbo_stats) {
|
| allocator_zone_start_allocation_size_ =
|
| allocator->zone()->allocation_size();
|
|
|