Reviewers: titzer,
Message:
ptal
Description:
[turbofan] move assembly order to InstructionBlock
[email protected]
BUG=
Please review this at https://codereview.chromium.org/805263003/
Base URL: https://chromium.googlesource.com/v8/v8.git@master
Affected files (+32, -56 lines):
M src/compiler/instruction.h
M src/compiler/instruction.cc
M src/compiler/instruction-selector.h
M src/compiler/instruction-selector.cc
M src/compiler/schedule.h
M src/compiler/schedule.cc
M src/compiler/scheduler.cc
M test/cctest/compiler/test-jump-threading.cc
M test/cctest/compiler/test-scheduler.cc
M test/unittests/compiler/instruction-sequence-unittest.cc
Index: src/compiler/instruction-selector.cc
diff --git a/src/compiler/instruction-selector.cc
b/src/compiler/instruction-selector.cc
index
a0bb6b6a20b718bca1afa98463474bbbb92d5a81..14f08f2729ff7a76c46cf036093c43a7dfaaeebc
100644
--- a/src/compiler/instruction-selector.cc
+++ b/src/compiler/instruction-selector.cc
@@ -173,11 +173,6 @@ Instruction* InstructionSelector::Emit(Instruction*
instr) {
}
-bool InstructionSelector::IsNextInAssemblyOrder(const BasicBlock* block)
const {
- return current_block_->GetAoNumber().IsNext(block->GetAoNumber());
-}
-
-
bool InstructionSelector::CanCover(Node* user, Node* node) const {
return node->OwnedBy(user) &&
schedule()->block(node) == schedule()->block(user);
Index: src/compiler/instruction-selector.h
diff --git a/src/compiler/instruction-selector.h
b/src/compiler/instruction-selector.h
index
ca5e7e3218b58d72f895822b991e14ad076198b6..5e3c52f959bf11da7bf6e1e78cf07f90ec5b77bf
100644
--- a/src/compiler/instruction-selector.h
+++ b/src/compiler/instruction-selector.h
@@ -133,10 +133,6 @@ class InstructionSelector FINAL {
private:
friend class OperandGenerator;
- // Checks if {block} will appear directly after {current_block_} when
- // assembling code, in which case, a fall-through can be used.
- bool IsNextInAssemblyOrder(const BasicBlock* block) const;
-
// Inform the instruction selection that {node} was just defined.
void MarkAsDefined(Node* node);
Index: src/compiler/instruction.cc
diff --git a/src/compiler/instruction.cc b/src/compiler/instruction.cc
index
86550d0e1d3291538029afa4152d9d94a56fd178..e85b2c8a68e243ae1711550f2c429dc9cda6c82f
100644
--- a/src/compiler/instruction.cc
+++ b/src/compiler/instruction.cc
@@ -348,7 +348,6 @@ 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,
@@ -357,7 +356,7 @@ InstructionBlock::InstructionBlock(Zone* zone,
BasicBlock::Id id,
predecessors_(zone),
phis_(zone),
id_(id),
- ao_number_(ao_number),
+ ao_number_(rpo_number),
rpo_number_(rpo_number),
loop_header_(loop_header),
loop_end_(loop_end),
@@ -392,8 +391,8 @@ static BasicBlock::RpoNumber GetLoopEndRpo(const
BasicBlock* block) {
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());
+ zone, block->id(), block->GetRpoNumber(),
GetRpo(block->loop_header()),
+ GetLoopEndRpo(block), block->deferred());
// Map successors and precessors
instr_block->successors().reserve(block->SuccessorCount());
for (auto it = block->successors_begin(); it != block->successors_end();
@@ -421,10 +420,26 @@ InstructionBlocks*
InstructionSequence::InstructionBlocksFor(
DCHECK((*it)->GetRpoNumber().ToSize() == rpo_number);
(*blocks)[rpo_number] = InstructionBlockFor(zone, *it);
}
+ SetAssemblyOrder(blocks);
return blocks;
}
+void InstructionSequence::SetAssemblyOrder(InstructionBlocks* blocks) {
+ int ao = 0;
+ for (auto const block : *blocks) {
+ if (!block->IsDeferred()) {
+ block->set_ao_number(BasicBlock::RpoNumber::FromInt(ao++));
+ }
+ }
+ for (auto const block : *blocks) {
+ if (block->IsDeferred()) {
+ block->set_ao_number(BasicBlock::RpoNumber::FromInt(ao++));
+ }
+ }
+}
+
+
InstructionSequence::InstructionSequence(Zone* instruction_zone,
InstructionBlocks*
instruction_blocks)
: zone_(instruction_zone),
Index: src/compiler/instruction.h
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h
index
5d5e6813a782c5de83df3467165ca75a88a5f8cf..9cf0afd8d9ab83e47a8320a13b2bede9b9c2570c
100644
--- a/src/compiler/instruction.h
+++ b/src/compiler/instruction.h
@@ -816,7 +816,6 @@ class PhiInstruction FINAL : public ZoneObject {
class InstructionBlock FINAL : public ZoneObject {
public:
InstructionBlock(Zone* zone, BasicBlock::Id id,
- BasicBlock::RpoNumber ao_number,
BasicBlock::RpoNumber rpo_number,
BasicBlock::RpoNumber loop_header,
BasicBlock::RpoNumber loop_end, bool deferred);
@@ -905,6 +904,8 @@ class InstructionSequence FINAL : public ZoneObject {
public:
static InstructionBlocks* InstructionBlocksFor(Zone* zone,
const Schedule* schedule);
+ // Puts the deferred blocks last.
+ static void SetAssemblyOrder(InstructionBlocks* blocks);
InstructionSequence(Zone* zone, InstructionBlocks* instruction_blocks);
Index: src/compiler/schedule.cc
diff --git a/src/compiler/schedule.cc b/src/compiler/schedule.cc
index
488198787321d60b960bb8244b0728312013f3e1..30bfbc8ecfecc089380d9db4114c0139ef3737b2
100644
--- a/src/compiler/schedule.cc
+++ b/src/compiler/schedule.cc
@@ -13,7 +13,7 @@ namespace internal {
namespace compiler {
BasicBlock::BasicBlock(Zone* zone, Id id)
- : ao_number_(-1),
+ : loop_number_(-1),
rpo_number_(-1),
deferred_(false),
dominator_depth_(-1),
Index: src/compiler/schedule.h
diff --git a/src/compiler/schedule.h b/src/compiler/schedule.h
index
8c3e29a45a784a6541ce2ce6759094221a91cbce..0bba689785728fe9409bdc7fd8edca499cfda020
100644
--- a/src/compiler/schedule.h
+++ b/src/compiler/schedule.h
@@ -163,9 +163,8 @@ class BasicBlock FINAL : public ZoneObject {
int32_t loop_depth() const { return loop_depth_; }
void set_loop_depth(int32_t loop_depth);
- RpoNumber GetAoNumber() const { return RpoNumber::FromInt(ao_number_); }
- int32_t ao_number() const { return ao_number_; }
- void set_ao_number(int32_t ao_number) { ao_number_ = ao_number; }
+ int32_t loop_number() const { return loop_number_; }
+ void set_loop_number(int32_t loop_number) { loop_number_ = loop_number; }
RpoNumber GetRpoNumber() const { return RpoNumber::FromInt(rpo_number_);
}
int32_t rpo_number() const { return rpo_number_; }
@@ -176,7 +175,7 @@ class BasicBlock FINAL : public ZoneObject {
bool LoopContains(BasicBlock* block) const;
private:
- int32_t ao_number_; // assembly order number of the block.
+ int32_t loop_number_; // loop number of the block.
int32_t rpo_number_; // special RPO number of the block.
bool deferred_; // true if the block contains deferred code.
int32_t dominator_depth_; // Depth within the dominator tree.
Index: src/compiler/scheduler.cc
diff --git a/src/compiler/scheduler.cc b/src/compiler/scheduler.cc
index
96d1c3715f6e956c82154218eca3021a994740c1..f12c6318d3da8d29e47028980da4f12c328883ec
100644
--- a/src/compiler/scheduler.cc
+++ b/src/compiler/scheduler.cc
@@ -568,20 +568,6 @@ class SpecialRPONumberer : public ZoneObject {
ComputeAndInsertSpecialRPO(entry, end);
}
- // Serialize the previously computed order as an assembly order
(non-deferred
- // code first, deferred code afterwards) into the final schedule.
- void SerializeAOIntoSchedule() {
- int32_t number = 0;
- for (BasicBlock* b = order_; b != NULL; b = b->rpo_next()) {
- if (b->deferred()) continue;
- b->set_ao_number(number++);
- }
- for (BasicBlock* b = order_; b != NULL; b = b->rpo_next()) {
- if (!b->deferred()) continue;
- b->set_ao_number(number++);
- }
- }
-
// Serialize the previously computed order as a special
reverse-post-order
// numbering for basic blocks into the final schedule.
void SerializeRPOIntoSchedule() {
@@ -648,14 +634,12 @@ class SpecialRPONumberer : public ZoneObject {
return block;
}
- // We are hijacking the {ao_number} to enumerate loops temporarily. Note
that
- // these numbers are only valid within this class.
- static int GetLoopNumber(BasicBlock* block) { return block->ao_number();
}
+ static int GetLoopNumber(BasicBlock* block) { return
block->loop_number(); }
static void SetLoopNumber(BasicBlock* block, int loop_number) {
- return block->set_ao_number(loop_number);
+ return block->set_loop_number(loop_number);
}
static bool HasLoopNumber(BasicBlock* block) {
- return block->ao_number() >= 0;
+ return block->loop_number() >= 0;
}
// TODO(mstarzinger): We only need this special sentinel because some
tests
@@ -673,7 +657,7 @@ class SpecialRPONumberer : public ZoneObject {
// mutating any existing order so that the result is still valid.
void ComputeAndInsertSpecialRPO(BasicBlock* entry, BasicBlock* end) {
// RPO should not have been serialized for this schedule yet.
- CHECK_EQ(kBlockUnvisited1, schedule_->start()->ao_number());
+ CHECK_EQ(kBlockUnvisited1, schedule_->start()->loop_number());
CHECK_EQ(kBlockUnvisited1, schedule_->start()->rpo_number());
CHECK_EQ(0, static_cast<int>(schedule_->rpo_order()->size()));
@@ -1031,7 +1015,6 @@ class SpecialRPONumberer : public ZoneObject {
BasicBlockVector* Scheduler::ComputeSpecialRPO(Zone* zone, Schedule*
schedule) {
SpecialRPONumberer numberer(zone, schedule);
numberer.ComputeSpecialRPO();
- numberer.SerializeAOIntoSchedule();
numberer.SerializeRPOIntoSchedule();
numberer.PrintAndVerifySpecialRPO();
return schedule->rpo_order();
@@ -1412,7 +1395,6 @@ void Scheduler::SealFinalSchedule() {
Trace("--- SEAL FINAL SCHEDULE ------------------------------------\n");
// Serialize the assembly order and reverse-post-order numbering.
- special_rpo_->SerializeAOIntoSchedule();
special_rpo_->SerializeRPOIntoSchedule();
special_rpo_->PrintAndVerifySpecialRPO();
Index: test/cctest/compiler/test-jump-threading.cc
diff --git a/test/cctest/compiler/test-jump-threading.cc
b/test/cctest/compiler/test-jump-threading.cc
index
45e9d0e7e080962ddfce8b4306677facbb841337..41e993678f83a2760faac358cea469b8b09668d5
100644
--- a/test/cctest/compiler/test-jump-threading.cc
+++ b/test/cctest/compiler/test-jump-threading.cc
@@ -89,8 +89,7 @@ class TestCode : public HandleAndZoneScope {
if (current_ == NULL) {
current_ = new (main_zone()) InstructionBlock(
main_zone(), BasicBlock::Id::FromInt(rpo_number_.ToInt()),
- rpo_number_, rpo_number_, RpoNumber::Invalid(),
RpoNumber::Invalid(),
- deferred);
+ rpo_number_, RpoNumber::Invalid(), RpoNumber::Invalid(),
deferred);
blocks_.push_back(current_);
sequence_.StartBlock(rpo_number_);
}
Index: test/cctest/compiler/test-scheduler.cc
diff --git a/test/cctest/compiler/test-scheduler.cc
b/test/cctest/compiler/test-scheduler.cc
index
3b0e6e47094a1b08fb89c45016f8a0834a2f8b93..1b79ed5449d546ee11c8a23b5356d16b9e8f6e16
100644
--- a/test/cctest/compiler/test-scheduler.cc
+++ b/test/cctest/compiler/test-scheduler.cc
@@ -35,17 +35,6 @@ static void CheckRPONumbers(BasicBlockVector* order,
size_t expected,
CHECK_EQ(NULL, order->at(i)->loop_header());
}
}
- int number = 0;
- for (auto const block : *order) {
- if (block->deferred()) continue;
- CHECK_EQ(number, block->ao_number());
- ++number;
- }
- for (auto const block : *order) {
- if (!block->deferred()) continue;
- CHECK_EQ(number, block->ao_number());
- ++number;
- }
}
Index: test/unittests/compiler/instruction-sequence-unittest.cc
diff --git a/test/unittests/compiler/instruction-sequence-unittest.cc
b/test/unittests/compiler/instruction-sequence-unittest.cc
index
ae31f40c2e9a65ef64e9817dd424073792222d1c..0fa4673e8ee32a7720b954f839fb1819591be5b5
100644
--- a/test/unittests/compiler/instruction-sequence-unittest.cc
+++ b/test/unittests/compiler/instruction-sequence-unittest.cc
@@ -406,8 +406,8 @@ InstructionBlock* InstructionSequenceTest::NewBlock() {
}
}
// Construct instruction block.
- auto instruction_block = new (zone()) InstructionBlock(
- zone(), block_id, rpo, rpo, loop_header, loop_end, false);
+ auto instruction_block = new (zone())
+ InstructionBlock(zone(), block_id, rpo, loop_header, loop_end,
false);
instruction_blocks_.push_back(instruction_block);
current_block_ = instruction_block;
sequence()->StartBlock(rpo);
--
--
v8-dev mailing list
[email protected]
http://groups.google.com/group/v8-dev
---
You received this message because you are subscribed to the Google Groups "v8-dev" group.
To unsubscribe from this group and stop receiving emails from it, send an email
to [email protected].
For more options, visit https://groups.google.com/d/optout.