| Index: src/lithium-allocator.h
|
| ===================================================================
|
| --- src/lithium-allocator.h (revision 6414)
|
| +++ src/lithium-allocator.h (working copy)
|
| @@ -31,6 +31,7 @@
|
| #include "v8.h"
|
|
|
| #include "data-flow.h"
|
| +#include "lithium.h"
|
| #include "zone.h"
|
|
|
| namespace v8 {
|
| @@ -153,52 +154,49 @@
|
|
|
| // A register-allocator view of a Lithium instruction. It contains the id of
|
| // the output operand and a list of input operand uses.
|
| -class InstructionSummary: public ZoneObject {
|
| +
|
| +class LInstruction;
|
| +class LEnvironment;
|
| +
|
| +// Iterator for non-null temp operands.
|
| +class TempIterator BASE_EMBEDDED {
|
| public:
|
| - InstructionSummary()
|
| - : output_operand_(NULL),
|
| - input_count_(0),
|
| - operands_(4),
|
| - is_call_(false),
|
| - is_save_doubles_(false) {}
|
| + inline explicit TempIterator(LInstruction* instr);
|
| + inline bool HasNext();
|
| + inline LOperand* Next();
|
|
|
| - // Output operands.
|
| - LOperand* Output() const { return output_operand_; }
|
| - void SetOutput(LOperand* output) {
|
| - ASSERT(output_operand_ == NULL);
|
| - output_operand_ = output;
|
| - }
|
| + private:
|
| + inline void Advance();
|
| + LInstruction* instr_;
|
| + int current_;
|
| +};
|
|
|
| - // Input operands.
|
| - int InputCount() const { return input_count_; }
|
| - LOperand* InputAt(int i) const {
|
| - ASSERT(i < input_count_);
|
| - return operands_[i];
|
| - }
|
| - void AddInput(LOperand* input) {
|
| - operands_.InsertAt(input_count_, input);
|
| - input_count_++;
|
| - }
|
|
|
| - // Temporary operands.
|
| - int TempCount() const { return operands_.length() - input_count_; }
|
| - LOperand* TempAt(int i) const { return operands_[i + input_count_]; }
|
| - void AddTemp(LOperand* temp) { operands_.Add(temp); }
|
| +// Iterator for non-constant input operands.
|
| +class InputIterator BASE_EMBEDDED {
|
| + public:
|
| + inline explicit InputIterator(LInstruction* instr);
|
| + inline bool HasNext();
|
| + inline LOperand* Next();
|
|
|
| - void MarkAsCall() { is_call_ = true; }
|
| - bool IsCall() const { return is_call_; }
|
| + private:
|
| + inline void Advance();
|
| + LInstruction* instr_;
|
| + int current_;
|
| +};
|
|
|
| - void MarkAsSaveDoubles() { is_save_doubles_ = true; }
|
| - bool IsSaveDoubles() const { return is_save_doubles_; }
|
|
|
| +class UseIterator BASE_EMBEDDED {
|
| + public:
|
| + inline explicit UseIterator(LInstruction* instr);
|
| + inline bool HasNext();
|
| + inline LOperand* Next();
|
| private:
|
| - LOperand* output_operand_;
|
| - int input_count_;
|
| - ZoneList<LOperand*> operands_;
|
| - bool is_call_;
|
| - bool is_save_doubles_;
|
| + InputIterator input_iterator_;
|
| + LEnvironment::DeepIterator env_iterator_;
|
| };
|
|
|
| +
|
| // Representation of the non-empty interval [start,end[.
|
| class UseInterval: public ZoneObject {
|
| public:
|
| @@ -428,9 +426,6 @@
|
| public:
|
| explicit LAllocator(int first_virtual_register, HGraph* graph)
|
| : chunk_(NULL),
|
| - summaries_(0),
|
| - next_summary_(NULL),
|
| - summary_stack_(2),
|
| live_in_sets_(0),
|
| live_ranges_(16),
|
| fixed_live_ranges_(8),
|
| @@ -457,27 +452,12 @@
|
| // Record a temporary operand.
|
| void RecordTemporary(LUnallocated* operand);
|
|
|
| - // Marks the current instruction as a call.
|
| - void MarkAsCall();
|
| -
|
| - // Marks the current instruction as requiring saving double registers.
|
| - void MarkAsSaveDoubles();
|
| -
|
| // Checks whether the value of a given virtual register is tagged.
|
| bool HasTaggedValue(int virtual_register) const;
|
|
|
| // Returns the register kind required by the given virtual register.
|
| RegisterKind RequiredRegisterKind(int virtual_register) const;
|
|
|
| - // Begin a new instruction.
|
| - void BeginInstruction();
|
| -
|
| - // Summarize the current instruction.
|
| - void SummarizeInstruction(int index);
|
| -
|
| - // Summarize the current instruction.
|
| - void OmitInstruction();
|
| -
|
| // Control max function size.
|
| static int max_initial_value_ids();
|
|
|
| @@ -525,8 +505,8 @@
|
| void AddInitialIntervals(HBasicBlock* block, BitVector* live_out);
|
| void ProcessInstructions(HBasicBlock* block, BitVector* live);
|
| void MeetRegisterConstraints(HBasicBlock* block);
|
| - void MeetConstraintsBetween(InstructionSummary* first,
|
| - InstructionSummary* second,
|
| + void MeetConstraintsBetween(LInstruction* first,
|
| + LInstruction* second,
|
| int gap_index);
|
| void ResolvePhis(HBasicBlock* block);
|
|
|
| @@ -605,12 +585,6 @@
|
| // Return the block which contains give lifetime position.
|
| HBasicBlock* GetBlock(LifetimePosition pos);
|
|
|
| - // Current active summary.
|
| - InstructionSummary* current_summary() const { return summary_stack_.last(); }
|
| -
|
| - // Get summary for given instruction index.
|
| - InstructionSummary* GetSummary(int index) const { return summaries_[index]; }
|
| -
|
| // Helper methods for the fixed registers.
|
| int RegisterCount() const;
|
| static int FixedLiveRangeID(int index) { return -index - 1; }
|
| @@ -624,11 +598,7 @@
|
| const char* RegisterName(int allocation_index);
|
|
|
| LChunk* chunk_;
|
| - ZoneList<InstructionSummary*> summaries_;
|
| - InstructionSummary* next_summary_;
|
|
|
| - ZoneList<InstructionSummary*> summary_stack_;
|
| -
|
| // During liveness analysis keep a mapping from block id to live_in sets
|
| // for blocks already analyzed.
|
| ZoneList<BitVector*> live_in_sets_;
|
|
|