Commit 57b42dc5 authored by dcarney@chromium.org's avatar dcarney@chromium.org

[turbofan] extend register allocator testing with control flow

R=bmeurer@chromium.org, jarin@chromium.org

BUG=

Review URL: https://codereview.chromium.org/699083003

Cr-Commit-Position: refs/heads/master@{#25178}
git-svn-id: https://v8.googlecode.com/svn/branches/bleeding_edge@25178 ce2b1a6d-e550-0410-aec6-3dcde31c8c00
parent a7277a9b
......@@ -66,11 +66,11 @@ void InstructionSelector::SelectInstructions() {
sequence()->InstructionBlockAt(block->GetRpoNumber());
size_t end = instruction_block->code_end();
size_t start = instruction_block->code_start();
sequence()->StartBlock(block);
sequence()->StartBlock(block->GetRpoNumber());
while (start-- > end) {
sequence()->AddInstruction(instructions_[start]);
}
sequence()->EndBlock(block);
sequence()->EndBlock(block->GetRpoNumber());
}
}
......
......@@ -338,6 +338,36 @@ std::ostream& operator<<(std::ostream& os, const Constant& constant) {
}
InstructionBlock::InstructionBlock(Zone* zone, BasicBlock::Id id,
BasicBlock::RpoNumber ao_number,
BasicBlock::RpoNumber rpo_number,
BasicBlock::RpoNumber loop_header,
BasicBlock::RpoNumber loop_end,
bool deferred)
: successors_(zone),
predecessors_(zone),
phis_(zone),
id_(id),
ao_number_(ao_number),
rpo_number_(rpo_number),
loop_header_(loop_header),
loop_end_(loop_end),
code_start_(-1),
code_end_(-1),
deferred_(deferred) {}
size_t InstructionBlock::PredecessorIndexOf(
BasicBlock::RpoNumber rpo_number) const {
size_t j = 0;
for (InstructionBlock::Predecessors::const_iterator i = predecessors_.begin();
i != predecessors_.end(); ++i, ++j) {
if (*i == rpo_number) break;
}
return j;
}
static BasicBlock::RpoNumber GetRpo(BasicBlock* block) {
if (block == NULL) return BasicBlock::RpoNumber::Invalid();
return block->GetRpoNumber();
......@@ -350,43 +380,23 @@ static BasicBlock::RpoNumber GetLoopEndRpo(const BasicBlock* block) {
}
InstructionBlock::InstructionBlock(Zone* zone, const BasicBlock* block)
: successors_(static_cast<int>(block->SuccessorCount()),
BasicBlock::RpoNumber::Invalid(), zone),
predecessors_(static_cast<int>(block->PredecessorCount()),
BasicBlock::RpoNumber::Invalid(), zone),
phis_(zone),
id_(block->id()),
ao_number_(block->GetAoNumber()),
rpo_number_(block->GetRpoNumber()),
loop_header_(GetRpo(block->loop_header())),
loop_end_(GetLoopEndRpo(block)),
code_start_(-1),
code_end_(-1),
deferred_(block->deferred()) {
static InstructionBlock* InstructionBlockFor(Zone* zone,
const BasicBlock* block) {
InstructionBlock* instr_block = new (zone) InstructionBlock(
zone, block->id(), block->GetAoNumber(), block->GetRpoNumber(),
GetRpo(block->loop_header()), GetLoopEndRpo(block), block->deferred());
// Map successors and precessors
size_t index = 0;
for (BasicBlock::Successors::const_iterator it = block->successors_begin();
it != block->successors_end(); ++it, ++index) {
successors_[index] = (*it)->GetRpoNumber();
}
index = 0;
for (BasicBlock::Predecessors::const_iterator
it = block->predecessors_begin();
it != block->predecessors_end(); ++it, ++index) {
predecessors_[index] = (*it)->GetRpoNumber();
instr_block->successors().reserve(block->SuccessorCount());
for (auto it = block->successors_begin(); it != block->successors_end();
++it) {
instr_block->successors().push_back((*it)->GetRpoNumber());
}
}
size_t InstructionBlock::PredecessorIndexOf(
BasicBlock::RpoNumber rpo_number) const {
size_t j = 0;
for (InstructionBlock::Predecessors::const_iterator i = predecessors_.begin();
i != predecessors_.end(); ++i, ++j) {
if (*i == rpo_number) break;
instr_block->predecessors().reserve(block->PredecessorCount());
for (auto it = block->predecessors_begin(); it != block->predecessors_end();
++it) {
instr_block->predecessors().push_back((*it)->GetRpoNumber());
}
return j;
return instr_block;
}
......@@ -400,7 +410,7 @@ InstructionBlocks* InstructionSequence::InstructionBlocksFor(
it != schedule->rpo_order()->end(); ++it, ++rpo_number) {
DCHECK_EQ(NULL, (*blocks)[rpo_number]);
DCHECK((*it)->GetRpoNumber().ToSize() == rpo_number);
(*blocks)[rpo_number] = new (zone) InstructionBlock(zone, *it);
(*blocks)[rpo_number] = InstructionBlockFor(zone, *it);
}
return blocks;
}
......@@ -436,18 +446,18 @@ BlockStartInstruction* InstructionSequence::GetBlockStart(
}
void InstructionSequence::StartBlock(BasicBlock* basic_block) {
InstructionBlock* block = InstructionBlockAt(basic_block->GetRpoNumber());
void InstructionSequence::StartBlock(BasicBlock::RpoNumber rpo) {
InstructionBlock* block = InstructionBlockAt(rpo);
block->set_code_start(static_cast<int>(instructions_.size()));
BlockStartInstruction* block_start =
BlockStartInstruction::New(zone(), basic_block);
BlockStartInstruction::New(zone(), block->id(), rpo);
AddInstruction(block_start);
}
void InstructionSequence::EndBlock(BasicBlock* basic_block) {
void InstructionSequence::EndBlock(BasicBlock::RpoNumber rpo) {
int end = static_cast<int>(instructions_.size());
InstructionBlock* block = InstructionBlockAt(basic_block->GetRpoNumber());
InstructionBlock* block = InstructionBlockAt(rpo);
DCHECK(block->code_start() >= 0 && block->code_start() < end);
block->set_code_end(end);
}
......
......@@ -624,9 +624,10 @@ class BlockStartInstruction FINAL : public GapInstruction {
BasicBlock::RpoNumber rpo_number() const { return rpo_number_; }
BasicBlock::Id id() const { return id_; }
static BlockStartInstruction* New(Zone* zone, BasicBlock* block) {
static BlockStartInstruction* New(Zone* zone, BasicBlock::Id id,
BasicBlock::RpoNumber rpo_number) {
void* buffer = zone->New(sizeof(BlockStartInstruction));
return new (buffer) BlockStartInstruction(block);
return new (buffer) BlockStartInstruction(id, rpo_number);
}
static BlockStartInstruction* cast(Instruction* instr) {
......@@ -635,10 +636,10 @@ class BlockStartInstruction FINAL : public GapInstruction {
}
private:
explicit BlockStartInstruction(BasicBlock* block)
BlockStartInstruction(BasicBlock::Id id, BasicBlock::RpoNumber rpo_number)
: GapInstruction(kBlockStartInstruction),
id_(block->id()),
rpo_number_(block->GetRpoNumber()) {}
id_(id),
rpo_number_(rpo_number) {}
BasicBlock::Id id_;
BasicBlock::RpoNumber rpo_number_;
......@@ -799,7 +800,11 @@ class PhiInstruction FINAL : public ZoneObject {
// Analogue of BasicBlock for Instructions instead of Nodes.
class InstructionBlock FINAL : public ZoneObject {
public:
explicit InstructionBlock(Zone* zone, const BasicBlock* block);
InstructionBlock(Zone* zone, BasicBlock::Id id,
BasicBlock::RpoNumber ao_number,
BasicBlock::RpoNumber rpo_number,
BasicBlock::RpoNumber loop_header,
BasicBlock::RpoNumber loop_end, bool deferred);
// Instruction indexes (used by the register allocator).
int first_instruction_index() const {
......@@ -943,8 +948,8 @@ class InstructionSequence FINAL {
// Used by the instruction selector while adding instructions.
int AddInstruction(Instruction* instr);
void StartBlock(BasicBlock* block);
void EndBlock(BasicBlock* block);
void StartBlock(BasicBlock::RpoNumber rpo);
void EndBlock(BasicBlock::RpoNumber rpo);
int AddConstant(int virtual_register, Constant constant) {
DCHECK(virtual_register >= 0 && virtual_register < next_virtual_register_);
......
......@@ -158,23 +158,23 @@ TEST(InstructionGetBasicBlock) {
R.allocCode();
R.code->StartBlock(b0);
R.code->StartBlock(b0->GetRpoNumber());
int i0 = R.NewInstr();
int i1 = R.NewInstr();
R.code->EndBlock(b0);
R.code->StartBlock(b1);
R.code->EndBlock(b0->GetRpoNumber());
R.code->StartBlock(b1->GetRpoNumber());
int i2 = R.NewInstr();
int i3 = R.NewInstr();
int i4 = R.NewInstr();
int i5 = R.NewInstr();
R.code->EndBlock(b1);
R.code->StartBlock(b2);
R.code->EndBlock(b1->GetRpoNumber());
R.code->StartBlock(b2->GetRpoNumber());
int i6 = R.NewInstr();
int i7 = R.NewInstr();
int i8 = R.NewInstr();
R.code->EndBlock(b2);
R.code->StartBlock(b3);
R.code->EndBlock(b3);
R.code->EndBlock(b2->GetRpoNumber());
R.code->StartBlock(b3->GetRpoNumber());
R.code->EndBlock(b3->GetRpoNumber());
CHECK_EQ(b0, R.GetBasicBlock(i0));
CHECK_EQ(b0, R.GetBasicBlock(i1));
......@@ -211,10 +211,10 @@ TEST(InstructionIsGapAt) {
R.allocCode();
TestInstr* i0 = TestInstr::New(R.zone(), 100);
TestInstr* g = TestInstr::New(R.zone(), 103)->MarkAsControl();
R.code->StartBlock(b0);
R.code->StartBlock(b0->GetRpoNumber());
R.code->AddInstruction(i0);
R.code->AddInstruction(g);
R.code->EndBlock(b0);
R.code->EndBlock(b0->GetRpoNumber());
CHECK_EQ(true, R.code->InstructionAt(0)->IsBlockStart());
......@@ -238,17 +238,17 @@ TEST(InstructionIsGapAt2) {
R.allocCode();
TestInstr* i0 = TestInstr::New(R.zone(), 100);
TestInstr* g = TestInstr::New(R.zone(), 103)->MarkAsControl();
R.code->StartBlock(b0);
R.code->StartBlock(b0->GetRpoNumber());
R.code->AddInstruction(i0);
R.code->AddInstruction(g);
R.code->EndBlock(b0);
R.code->EndBlock(b0->GetRpoNumber());
TestInstr* i1 = TestInstr::New(R.zone(), 102);
TestInstr* g1 = TestInstr::New(R.zone(), 104)->MarkAsControl();
R.code->StartBlock(b1);
R.code->StartBlock(b1->GetRpoNumber());
R.code->AddInstruction(i1);
R.code->AddInstruction(g1);
R.code->EndBlock(b1);
R.code->EndBlock(b1->GetRpoNumber());
CHECK_EQ(true, R.code->InstructionAt(0)->IsBlockStart());
......@@ -279,10 +279,10 @@ TEST(InstructionAddGapMove) {
R.allocCode();
TestInstr* i0 = TestInstr::New(R.zone(), 100);
TestInstr* g = TestInstr::New(R.zone(), 103)->MarkAsControl();
R.code->StartBlock(b0);
R.code->StartBlock(b0->GetRpoNumber());
R.code->AddInstruction(i0);
R.code->AddInstruction(g);
R.code->EndBlock(b0);
R.code->EndBlock(b0->GetRpoNumber());
CHECK_EQ(true, R.code->InstructionAt(0)->IsBlockStart());
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment