Commit 6a7cb78c authored by dcarney's avatar dcarney Committed by Commit bot

[turbofan] Split ConstraintBuilder off of LiveRangeBuilder.

Plus some driveby cleanup.

Review URL: https://codereview.chromium.org/1099093002

Cr-Commit-Position: refs/heads/master@{#27961}
parent 636cb4f3
...@@ -716,7 +716,7 @@ struct MeetRegisterConstraintsPhase { ...@@ -716,7 +716,7 @@ struct MeetRegisterConstraintsPhase {
static const char* phase_name() { return "meet register constraints"; } static const char* phase_name() { return "meet register constraints"; }
void Run(PipelineData* data, Zone* temp_zone) { void Run(PipelineData* data, Zone* temp_zone) {
LiveRangeBuilder builder(data->register_allocation_data()); ConstraintBuilder builder(data->register_allocation_data());
builder.MeetRegisterConstraints(); builder.MeetRegisterConstraints();
} }
}; };
...@@ -726,7 +726,7 @@ struct ResolvePhisPhase { ...@@ -726,7 +726,7 @@ struct ResolvePhisPhase {
static const char* phase_name() { return "resolve phis"; } static const char* phase_name() { return "resolve phis"; }
void Run(PipelineData* data, Zone* temp_zone) { void Run(PipelineData* data, Zone* temp_zone) {
LiveRangeBuilder builder(data->register_allocation_data()); ConstraintBuilder builder(data->register_allocation_data());
builder.ResolvePhis(); builder.ResolvePhis();
} }
}; };
......
This diff is collapsed.
...@@ -444,10 +444,8 @@ class RegisterAllocationData final : public ZoneObject { ...@@ -444,10 +444,8 @@ class RegisterAllocationData final : public ZoneObject {
const ZoneVector<LiveRange*>& fixed_double_live_ranges() const { const ZoneVector<LiveRange*>& fixed_double_live_ranges() const {
return fixed_double_live_ranges_; return fixed_double_live_ranges_;
} }
const ZoneVector<BitVector*>& live_in_sets() const { return live_in_sets_; }
ZoneVector<BitVector*>& live_in_sets() { return live_in_sets_; } ZoneVector<BitVector*>& live_in_sets() { return live_in_sets_; }
ZoneVector<SpillRange*>& spill_ranges() { return spill_ranges_; } ZoneVector<SpillRange*>& spill_ranges() { return spill_ranges_; }
const ZoneVector<SpillRange*>& spill_ranges() const { return spill_ranges_; }
InstructionSequence* code() const { return code_; } InstructionSequence* code() const { return code_; }
// This zone is for datastructures only needed during register allocation // This zone is for datastructures only needed during register allocation
// phases. // phases.
...@@ -463,9 +461,6 @@ class RegisterAllocationData final : public ZoneObject { ...@@ -463,9 +461,6 @@ class RegisterAllocationData final : public ZoneObject {
void SetLiveRangeAssignedRegister(LiveRange* range, int reg); void SetLiveRangeAssignedRegister(LiveRange* range, int reg);
LiveRange* LiveRangeFor(int index); LiveRange* LiveRangeFor(int index);
Instruction* InstructionAt(int index) const {
return code()->InstructionAt(index);
}
void AssignPhiInput(LiveRange* range, const InstructionOperand& assignment); void AssignPhiInput(LiveRange* range, const InstructionOperand& assignment);
SpillRange* AssignSpillRangeToLiveRange(LiveRange* range); SpillRange* AssignSpillRangeToLiveRange(LiveRange* range);
...@@ -502,9 +497,9 @@ class RegisterAllocationData final : public ZoneObject { ...@@ -502,9 +497,9 @@ class RegisterAllocationData final : public ZoneObject {
}; };
class LiveRangeBuilder final : public ZoneObject { class ConstraintBuilder final : public ZoneObject {
public: public:
explicit LiveRangeBuilder(RegisterAllocationData* data); explicit ConstraintBuilder(RegisterAllocationData* data);
// Phase 1 : insert moves to account for fixed register operands. // Phase 1 : insert moves to account for fixed register operands.
void MeetRegisterConstraints(); void MeetRegisterConstraints();
...@@ -513,6 +508,36 @@ class LiveRangeBuilder final : public ZoneObject { ...@@ -513,6 +508,36 @@ class LiveRangeBuilder final : public ZoneObject {
// of blocks containing phis. // of blocks containing phis.
void ResolvePhis(); void ResolvePhis();
private:
RegisterAllocationData* data() const { return data_; }
InstructionSequence* code() const { return data()->code(); }
Zone* allocation_zone() const { return data()->allocation_zone(); }
Instruction* InstructionAt(int index) { return code()->InstructionAt(index); }
bool IsReference(int virtual_register) const {
return data()->IsReference(virtual_register);
}
LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); }
InstructionOperand* AllocateFixed(UnallocatedOperand* operand, int pos,
bool is_tagged);
void MeetRegisterConstraints(const InstructionBlock* block);
void MeetConstraintsBefore(int index);
void MeetConstraintsAfter(int index);
void MeetRegisterConstraintsForLastInstructionInBlock(
const InstructionBlock* block);
void ResolvePhis(const InstructionBlock* block);
RegisterAllocationData* const data_;
DISALLOW_COPY_AND_ASSIGN(ConstraintBuilder);
};
class LiveRangeBuilder final : public ZoneObject {
public:
explicit LiveRangeBuilder(RegisterAllocationData* data);
// Phase 3: compute liveness of all virtual register. // Phase 3: compute liveness of all virtual register.
void BuildLiveRanges(); void BuildLiveRanges();
...@@ -525,20 +550,8 @@ class LiveRangeBuilder final : public ZoneObject { ...@@ -525,20 +550,8 @@ class LiveRangeBuilder final : public ZoneObject {
ZoneVector<BitVector*>& live_in_sets() const { ZoneVector<BitVector*>& live_in_sets() const {
return data()->live_in_sets(); return data()->live_in_sets();
} }
ZoneVector<LiveRange*>& live_ranges() { return data()->live_ranges(); }
ZoneVector<LiveRange*>& fixed_live_ranges() {
return data()->fixed_live_ranges();
}
ZoneVector<LiveRange*>& fixed_double_live_ranges() {
return data()->fixed_double_live_ranges();
}
ZoneVector<SpillRange*>& spill_ranges() { return data()->spill_ranges(); }
RegisterAllocationData::PhiMap& phi_map() { return data()->phi_map(); }
Instruction* InstructionAt(int index) { return code()->InstructionAt(index); } LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); }
bool IsReference(int virtual_register) const {
return data()->IsReference(virtual_register);
}
void Verify() const; void Verify() const;
...@@ -548,26 +561,16 @@ class LiveRangeBuilder final : public ZoneObject { ...@@ -548,26 +561,16 @@ class LiveRangeBuilder final : public ZoneObject {
bool IsOutputRegisterOf(Instruction* instr, int index); bool IsOutputRegisterOf(Instruction* instr, int index);
bool IsOutputDoubleRegisterOf(Instruction* instr, int index); bool IsOutputDoubleRegisterOf(Instruction* instr, int index);
void ProcessInstructions(const InstructionBlock* block, BitVector* live); void ProcessInstructions(const InstructionBlock* block, BitVector* live);
void MeetRegisterConstraints(const InstructionBlock* block);
void MeetConstraintsBefore(int index);
void MeetConstraintsAfter(int index);
void MeetRegisterConstraintsForLastInstructionInBlock(
const InstructionBlock* block);
void ResolvePhis(const InstructionBlock* block);
LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); }
static int FixedLiveRangeID(int index) { return -index - 1; } static int FixedLiveRangeID(int index) { return -index - 1; }
int FixedDoubleLiveRangeID(int index); int FixedDoubleLiveRangeID(int index);
LiveRange* FixedLiveRangeFor(int index); LiveRange* FixedLiveRangeFor(int index);
LiveRange* FixedDoubleLiveRangeFor(int index); LiveRange* FixedDoubleLiveRangeFor(int index);
Instruction* GetLastInstruction(const InstructionBlock* block);
// Returns the register kind required by the given virtual register. // Returns the register kind required by the given virtual register.
RegisterKind RequiredRegisterKind(int virtual_register) const; RegisterKind RequiredRegisterKind(int virtual_register) const;
// Helper methods for building intervals. // Helper methods for building intervals.
InstructionOperand* AllocateFixed(UnallocatedOperand* operand, int pos,
bool is_tagged);
LiveRange* LiveRangeFor(InstructionOperand* operand); LiveRange* LiveRangeFor(InstructionOperand* operand);
void Define(LifetimePosition position, InstructionOperand* operand, void Define(LifetimePosition position, InstructionOperand* operand,
InstructionOperand* hint); InstructionOperand* hint);
...@@ -592,12 +595,9 @@ class LinearScanAllocator final : public ZoneObject { ...@@ -592,12 +595,9 @@ class LinearScanAllocator final : public ZoneObject {
RegisterAllocationData* data() const { return data_; } RegisterAllocationData* data() const { return data_; }
InstructionSequence* code() const { return data()->code(); } InstructionSequence* code() const { return data()->code(); }
Zone* allocation_zone() const { return data()->allocation_zone(); } Zone* allocation_zone() const { return data()->allocation_zone(); }
Zone* code_zone() const { return code()->zone(); }
const RegisterConfiguration* config() const { return data()->config(); }
int num_registers() const { return num_registers_; } int num_registers() const { return num_registers_; }
const char* RegisterName(int allocation_index) const; const char* RegisterName(int allocation_index) const;
ZoneVector<LiveRange*>& live_ranges() { return data()->live_ranges(); }
ZoneVector<LiveRange*>& unhandled_live_ranges() { ZoneVector<LiveRange*>& unhandled_live_ranges() {
return unhandled_live_ranges_; return unhandled_live_ranges_;
} }
...@@ -605,13 +605,7 @@ class LinearScanAllocator final : public ZoneObject { ...@@ -605,13 +605,7 @@ class LinearScanAllocator final : public ZoneObject {
ZoneVector<LiveRange*>& inactive_live_ranges() { ZoneVector<LiveRange*>& inactive_live_ranges() {
return inactive_live_ranges_; return inactive_live_ranges_;
} }
ZoneVector<SpillRange*>& spill_ranges() { return data()->spill_ranges(); }
RegisterAllocationData::PhiMap& phi_map() { return data()->phi_map(); }
Instruction* InstructionAt(int index) { return code()->InstructionAt(index); }
bool IsReference(int virtual_register) const {
return data()->IsReference(virtual_register);
}
LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); } LiveRange* LiveRangeFor(int index) { return data()->LiveRangeFor(index); }
// Helper methods for updating the life range lists. // Helper methods for updating the life range lists.
...@@ -715,14 +709,10 @@ class ReferenceMapPopulator final : public ZoneObject { ...@@ -715,14 +709,10 @@ class ReferenceMapPopulator final : public ZoneObject {
void PopulateReferenceMaps(); void PopulateReferenceMaps();
private: private:
bool SafePointsAreInOrder() const;
bool IsReference(int virtual_register) const {
return data()->IsReference(virtual_register);
}
RegisterAllocationData* data() const { return data_; } RegisterAllocationData* data() const { return data_; }
bool SafePointsAreInOrder() const;
RegisterAllocationData* const data_; RegisterAllocationData* const data_;
DISALLOW_COPY_AND_ASSIGN(ReferenceMapPopulator); DISALLOW_COPY_AND_ASSIGN(ReferenceMapPopulator);
...@@ -740,14 +730,15 @@ class LiveRangeConnector final : public ZoneObject { ...@@ -740,14 +730,15 @@ class LiveRangeConnector final : public ZoneObject {
void ResolveControlFlow(Zone* local_zone); void ResolveControlFlow(Zone* local_zone);
private: private:
RegisterAllocationData* data() const { return data_; }
InstructionSequence* code() const { return data()->code(); }
Zone* code_zone() const { return code()->zone(); }
bool CanEagerlyResolveControlFlow(const InstructionBlock* block) const; bool CanEagerlyResolveControlFlow(const InstructionBlock* block) const;
void ResolveControlFlow(const InstructionBlock* block, void ResolveControlFlow(const InstructionBlock* block,
const InstructionOperand& cur_op, const InstructionOperand& cur_op,
const InstructionBlock* pred, const InstructionBlock* pred,
const InstructionOperand& pred_op); const InstructionOperand& pred_op);
InstructionSequence* code() const { return data()->code(); }
Zone* code_zone() const { return code()->zone(); }
RegisterAllocationData* data() const { return data_; }
RegisterAllocationData* const data_; RegisterAllocationData* const data_;
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment