Chromium Code Reviews
chromiumcodereview-hr@appspot.gserviceaccount.com (chromiumcodereview-hr) | Please choose your nickname with Settings | Help | Chromium Project | Gerrit Changes | Sign out
(318)

Unified Diff: runtime/vm/intermediate_language.h

Issue 9719003: Compute preorder as well as postorder basic block orderings. (Closed) Base URL: https://dart.googlecode.com/svn/branches/bleeding_edge/dart
Patch Set: Created 8 years, 9 months ago
Use n/p to move between diff chunks; N/P to move between comments. Draft comments are only viewable by you.
Jump to:
View side-by-side diff with in-line comments
Download patch
Index: runtime/vm/intermediate_language.h
diff --git a/runtime/vm/intermediate_language.h b/runtime/vm/intermediate_language.h
index 056b9720166c062b2155da7f502555164bda547b..d5446b43d89a80b470edbc1fdb09a3b99c695427 100644
--- a/runtime/vm/intermediate_language.h
+++ b/runtime/vm/intermediate_language.h
@@ -792,7 +792,7 @@ FOR_EACH_INSTRUCTION(FORWARD_DECLARATION)
class Instruction : public ZoneAllocated {
public:
- Instruction() : mark_(false) { }
+ Instruction() { }
virtual bool IsBlockEntry() const { return false; }
BlockEntryInstr* AsBlockEntry() {
@@ -806,13 +806,9 @@ class Instruction : public ZoneAllocated {
// Perform a postorder traversal of the instruction graph reachable from
// this instruction. Accumulate basic block entries in the order visited
// in the in/out parameter 'block_entries'.
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries) = 0;
-
- // Mark bit to support non-reentrant recursive traversal (i.e.,
- // identification of cycles). Before and after a traversal, all the nodes
- // must have the same mark.
- bool mark() const { return mark_; }
- void flip_mark() { mark_ = !mark_; }
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder) = 0;
#define INSTRUCTION_TYPE_CHECK(type) \
virtual bool Is##type() const { return false; } \
@@ -821,8 +817,6 @@ FOR_EACH_INSTRUCTION(INSTRUCTION_TYPE_CHECK)
#undef INSTRUCTION_TYPE_CHECK
private:
- bool mark_;
-
DISALLOW_COPY_AND_ASSIGN(Instruction);
};
@@ -835,14 +829,18 @@ class BlockEntryInstr : public Instruction {
public:
virtual bool IsBlockEntry() const { return true; }
- intptr_t block_number() const { return block_number_; }
- void set_block_number(intptr_t number) { block_number_ = number; }
+ intptr_t preorder_number() const { return preorder_number_; }
+ void set_preorder_number(intptr_t number) { preorder_number_ = number; }
+
+ intptr_t postorder_number() const { return postorder_number_; }
+ void set_postorder_number(intptr_t number) { postorder_number_ = number; }
protected:
- BlockEntryInstr() : Instruction(), block_number_(-1) { }
+ BlockEntryInstr() : preorder_number_(-1), postorder_number_(-1) { }
private:
- intptr_t block_number_;
+ intptr_t preorder_number_;
+ intptr_t postorder_number_;
DISALLOW_COPY_AND_ASSIGN(BlockEntryInstr);
};
@@ -859,7 +857,9 @@ class JoinEntryInstr : public BlockEntryInstr {
successor_ = instr;
}
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
Instruction* successor_;
@@ -880,7 +880,9 @@ class TargetEntryInstr : public BlockEntryInstr {
successor_ = instr;
}
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
Instruction* successor_;
@@ -899,7 +901,7 @@ class TargetEntryInstr : public BlockEntryInstr {
class PickTempInstr : public Instruction {
public:
PickTempInstr(intptr_t dst, intptr_t src)
- : Instruction(), destination_(dst), source_(src), successor_(NULL) { }
+ : destination_(dst), source_(src), successor_(NULL) { }
DECLARE_INSTRUCTION(PickTemp)
@@ -911,7 +913,9 @@ class PickTempInstr : public Instruction {
successor_ = instr;
}
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
const intptr_t destination_;
@@ -934,7 +938,7 @@ class PickTempInstr : public Instruction {
class TuckTempInstr : public Instruction {
public:
TuckTempInstr(intptr_t dst, intptr_t src)
- : Instruction(), destination_(dst), source_(src), successor_(NULL) { }
+ : destination_(dst), source_(src), successor_(NULL) { }
DECLARE_INSTRUCTION(TuckTemp)
@@ -946,7 +950,9 @@ class TuckTempInstr : public Instruction {
successor_ = instr;
}
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
const intptr_t destination_;
@@ -960,7 +966,7 @@ class TuckTempInstr : public Instruction {
class DoInstr : public Instruction {
public:
explicit DoInstr(Computation* comp)
- : Instruction(), computation_(comp), successor_(NULL) { }
+ : computation_(comp), successor_(NULL) { }
DECLARE_INSTRUCTION(Do)
@@ -971,7 +977,9 @@ class DoInstr : public Instruction {
successor_ = instr;
}
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
Computation* computation_;
@@ -984,10 +992,7 @@ class DoInstr : public Instruction {
class BindInstr : public Instruction {
public:
BindInstr(intptr_t temp_index, Computation* computation)
- : Instruction(),
- temp_index_(temp_index),
- computation_(computation),
- successor_(NULL) { }
+ : temp_index_(temp_index), computation_(computation), successor_(NULL) { }
DECLARE_INSTRUCTION(Bind)
@@ -999,7 +1004,9 @@ class BindInstr : public Instruction {
successor_ = instr;
}
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
const intptr_t temp_index_;
@@ -1013,7 +1020,7 @@ class BindInstr : public Instruction {
class ReturnInstr : public Instruction {
public:
ReturnInstr(Value* value, intptr_t token_index)
- : Instruction(), value_(value), token_index_(token_index) {
+ : value_(value), token_index_(token_index) {
ASSERT(value_ != NULL);
}
@@ -1024,7 +1031,9 @@ class ReturnInstr : public Instruction {
virtual void SetSuccessor(Instruction* instr) { UNREACHABLE(); }
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
Value* value_;
@@ -1037,10 +1046,7 @@ class ReturnInstr : public Instruction {
class ThrowInstr : public Instruction {
public:
ThrowInstr(intptr_t node_id, intptr_t token_index, Value* exception)
- : Instruction(),
- node_id_(node_id),
- token_index_(token_index),
- exception_(exception) {
+ : node_id_(node_id), token_index_(token_index), exception_(exception) {
ASSERT(exception_ != NULL);
}
@@ -1052,7 +1058,9 @@ class ThrowInstr : public Instruction {
virtual void SetSuccessor(Instruction* instr) { UNREACHABLE(); }
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
intptr_t node_id_;
@@ -1086,7 +1094,9 @@ class ReThrowInstr : public Instruction {
virtual void SetSuccessor(Instruction* instr) { UNREACHABLE(); }
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
intptr_t node_id_;
@@ -1101,8 +1111,7 @@ class ReThrowInstr : public Instruction {
class BranchInstr : public Instruction {
public:
explicit BranchInstr(Value* value)
- : Instruction(),
- value_(value),
+ : value_(value),
true_successor_(NULL),
false_successor_(NULL) { }
@@ -1117,7 +1126,9 @@ class BranchInstr : public Instruction {
virtual void SetSuccessor(Instruction* instr) { UNREACHABLE(); }
- virtual void Postorder(GrowableArray<BlockEntryInstr*>* block_entries);
+ virtual void DepthFirstSearch(
+ GrowableArray<BlockEntryInstr*>* preorder,
+ GrowableArray<BlockEntryInstr*>* postorder);
private:
Value* value_;
@@ -1134,12 +1145,13 @@ class BranchInstr : public Instruction {
// graph as defined by a reversed list of basic blocks.
class FlowGraphVisitor : public ValueObject {
public:
- FlowGraphVisitor() { }
+ explicit FlowGraphVisitor(const GrowableArray<BlockEntryInstr*>& block_order)
+ : block_order_(block_order) { }
virtual ~FlowGraphVisitor() { }
- // Visit each block in the array list in reverse, and for each block its
+ // Visit each block in the block order, and for each block its
// instructions in order from the block entry to exit.
- virtual void VisitBlocks(const GrowableArray<BlockEntryInstr*>& block_order);
+ virtual void VisitBlocks();
// Visit functions for instruction and computation classes, with empty
// default implementations.
@@ -1155,6 +1167,16 @@ class FlowGraphVisitor : public ValueObject {
#undef DECLARE_VISIT_COMPUTATION
#undef DECLARE_VISIT_INSTRUCTION
+ protected:
+ // Map a block number in a forward iteration into the block number in the
+ // corresponding reverse iteration. Used to obtain an index into
+ // block_order for reverse iterations.
+ intptr_t reverse_index(intptr_t index) {
+ return block_order_.length() - index - 1;
+ }
+
+ const GrowableArray<BlockEntryInstr*>& block_order_;
+
private:
DISALLOW_COPY_AND_ASSIGN(FlowGraphVisitor);
};

Powered by Google App Engine
This is Rietveld 408576698