| 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_;
|
|
|