Index: src/compiler/instruction.h |
diff --git a/src/compiler/instruction.h b/src/compiler/instruction.h |
index 2bb2b72c1b89380ddb97b7bd21c9a0d24753b931..72ea0433d59d536491a7d73f524908bd55e4df5d 100644 |
--- a/src/compiler/instruction.h |
+++ b/src/compiler/instruction.h |
@@ -12,10 +12,10 @@ |
#include "src/compiler/common-operator.h" |
#include "src/compiler/frame.h" |
-#include "src/compiler/graph.h" |
#include "src/compiler/instruction-codes.h" |
#include "src/compiler/opcodes.h" |
#include "src/compiler/schedule.h" |
+#include "src/compiler/source-position.h" |
// TODO(titzer): don't include the macro-assembler? |
#include "src/macro-assembler.h" |
#include "src/zone-allocator.h" |
@@ -596,8 +596,8 @@ class GapInstruction : public Instruction { |
// TODO(titzer): move code_start and code_end from BasicBlock to here. |
class BlockStartInstruction FINAL : public GapInstruction { |
public: |
- BasicBlock* block() const { return block_; } |
Label* label() { return &label_; } |
+ BasicBlock::RpoNumber rpo_number() const { return rpo_number_; } |
static BlockStartInstruction* New(Zone* zone, BasicBlock* block) { |
void* buffer = zone->New(sizeof(BlockStartInstruction)); |
@@ -611,9 +611,10 @@ class BlockStartInstruction FINAL : public GapInstruction { |
private: |
explicit BlockStartInstruction(BasicBlock* block) |
- : GapInstruction(kBlockStartInstruction), block_(block) {} |
+ : GapInstruction(kBlockStartInstruction), |
+ rpo_number_(block->GetRpoNumber()) {} |
- BasicBlock* block_; |
+ BasicBlock::RpoNumber rpo_number_; |
Label label_; |
}; |
@@ -781,8 +782,6 @@ class InstructionSequence FINAL { |
return block->loop_header(); |
} |
- int GetLoopEnd(BasicBlock* block) const { return block->loop_end(); } |
- |
BasicBlock* GetBasicBlock(int instruction_index); |
int GetVirtualRegister(const Node* node); |
@@ -797,8 +796,8 @@ class InstructionSequence FINAL { |
void AddGapMove(int index, InstructionOperand* from, InstructionOperand* to); |
- Label* GetLabel(BasicBlock* block); |
- BlockStartInstruction* GetBlockStart(BasicBlock* block); |
+ Label* GetLabel(BasicBlock::RpoNumber rpo); |
+ BlockStartInstruction* GetBlockStart(BasicBlock::RpoNumber rpo); |
typedef InstructionDeque::const_iterator const_iterator; |
const_iterator begin() const { return instructions_.begin(); } |
@@ -821,10 +820,32 @@ class InstructionSequence FINAL { |
const PointerMapDeque* pointer_maps() const { return &pointer_maps_; } |
Zone* zone() const { return zone_; } |
- // Used by the code generator while adding instructions. |
- int AddInstruction(Instruction* instr, BasicBlock* block); |
+ // Used by the instruction selector while adding instructions. |
+ int AddInstruction(Instruction* instr); |
void StartBlock(BasicBlock* block); |
void EndBlock(BasicBlock* block); |
+ void set_code_start(BasicBlock* block, int start) { |
+ return GetBlockData(block->GetRpoNumber()).set_code_start(start); |
+ } |
+ void set_code_end(BasicBlock* block, int end) { |
+ return GetBlockData(block->GetRpoNumber()).set_code_end(end); |
+ } |
+ // TODO(dcarney): use RpoNumber for all of the below. |
+ int code_start(BasicBlock::RpoNumber rpo_number) const { |
+ return GetBlockData(rpo_number).code_start(); |
+ } |
+ int code_start(BasicBlock* block) const { |
+ return GetBlockData(block->GetRpoNumber()).code_start(); |
+ } |
+ int code_end(BasicBlock* block) const { |
+ return GetBlockData(block->GetRpoNumber()).code_end(); |
+ } |
+ int first_instruction_index(BasicBlock* block) const { |
+ return GetBlockData(block->GetRpoNumber()).first_instruction_index(); |
+ } |
+ int last_instruction_index(BasicBlock* block) const { |
+ return GetBlockData(block->GetRpoNumber()).last_instruction_index(); |
+ } |
int AddConstant(Node* node, Constant constant) { |
int virtual_register = GetVirtualRegister(node); |
@@ -868,14 +889,51 @@ class InstructionSequence FINAL { |
int GetFrameStateDescriptorCount(); |
private: |
+ class BlockData { |
+ public: |
+ BlockData() : code_start_(-1), code_end_(-1) {} |
+ // Instruction indexes (used by the register allocator). |
+ int first_instruction_index() const { |
+ DCHECK(code_start_ >= 0); |
+ DCHECK(code_end_ > 0); |
+ DCHECK(code_end_ >= code_start_); |
+ return code_start_; |
+ } |
+ int last_instruction_index() const { |
+ DCHECK(code_start_ >= 0); |
+ DCHECK(code_end_ > 0); |
+ DCHECK(code_end_ >= code_start_); |
+ return code_end_ - 1; |
+ } |
+ |
+ int32_t code_start() const { return code_start_; } |
+ void set_code_start(int32_t start) { code_start_ = start; } |
+ |
+ int32_t code_end() const { return code_end_; } |
+ void set_code_end(int32_t end) { code_end_ = end; } |
+ |
+ private: |
+ int32_t code_start_; // start index of arch-specific code. |
+ int32_t code_end_; // end index of arch-specific code. |
+ }; |
+ |
+ const BlockData& GetBlockData(BasicBlock::RpoNumber rpo_number) const { |
+ return block_data_[rpo_number.ToSize()]; |
+ } |
+ BlockData& GetBlockData(BasicBlock::RpoNumber rpo_number) { |
+ return block_data_[rpo_number.ToSize()]; |
+ } |
+ |
friend std::ostream& operator<<(std::ostream& os, |
const InstructionSequence& code); |
typedef std::set<int, std::less<int>, ZoneIntAllocator> VirtualRegisterSet; |
+ typedef ZoneVector<BlockData> BlockDataVector; |
Zone* zone_; |
int node_count_; |
int* node_map_; |
+ BlockDataVector block_data_; |
Linkage* linkage_; |
Schedule* schedule_; |
ConstantMap constants_; |