OLD | NEW |
1 // Copyright 2014 the V8 project authors. All rights reserved. | 1 // Copyright 2014 the V8 project authors. All rights reserved. |
2 // Use of this source code is governed by a BSD-style license that can be | 2 // Use of this source code is governed by a BSD-style license that can be |
3 // found in the LICENSE file. | 3 // found in the LICENSE file. |
4 | 4 |
5 #ifndef V8_REGISTER_ALLOCATOR_VERIFIER_H_ | 5 #ifndef V8_REGISTER_ALLOCATOR_VERIFIER_H_ |
6 #define V8_REGISTER_ALLOCATOR_VERIFIER_H_ | 6 #define V8_REGISTER_ALLOCATOR_VERIFIER_H_ |
7 | 7 |
8 #include "src/zone-containers.h" | 8 #include "src/zone-containers.h" |
9 | 9 |
10 namespace v8 { | 10 namespace v8 { |
(...skipping 44 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
55 AssessmentKind kind() const { return kind_; } | 55 AssessmentKind kind() const { return kind_; } |
56 | 56 |
57 protected: | 57 protected: |
58 explicit Assessment(AssessmentKind kind) : kind_(kind) {} | 58 explicit Assessment(AssessmentKind kind) : kind_(kind) {} |
59 AssessmentKind kind_; | 59 AssessmentKind kind_; |
60 | 60 |
61 private: | 61 private: |
62 DISALLOW_COPY_AND_ASSIGN(Assessment); | 62 DISALLOW_COPY_AND_ASSIGN(Assessment); |
63 }; | 63 }; |
64 | 64 |
65 // FinalAssessmens are associated to operands that we know to be a certain | |
66 // virtual register. | |
67 class FinalAssessment final : public Assessment { | |
68 public: | |
69 explicit FinalAssessment(int virtual_register) | |
70 : Assessment(Final), virtual_register_(virtual_register) {} | |
71 | |
72 int virtual_register() const { return virtual_register_; } | |
73 static const FinalAssessment* cast(const Assessment* assessment) { | |
74 CHECK(assessment->kind() == Final); | |
75 return static_cast<const FinalAssessment*>(assessment); | |
76 } | |
77 | |
78 private: | |
79 int virtual_register_; | |
80 | |
81 DISALLOW_COPY_AND_ASSIGN(FinalAssessment); | |
82 }; | |
83 | |
84 // PendingAssessments are associated to operands coming from the multiple | 65 // PendingAssessments are associated to operands coming from the multiple |
85 // predecessors of a block. We only record the operand and the block, and | 66 // predecessors of a block. We only record the operand and the block, and |
86 // will determine if the way the operand is defined (from the predecessors) | 67 // will determine if the way the operand is defined (from the predecessors) |
87 // matches a particular use. This handles scenarios where multiple phis are | 68 // matches a particular use. This handles scenarios where multiple phis are |
88 // defined with identical operands, and the move optimizer moved down the moves | 69 // defined with identical operands, and the move optimizer moved down the moves |
89 // separating the 2 phis in the block defining them. | 70 // separating the 2 phis in the block defining them. |
90 class PendingAssessment final : public Assessment { | 71 class PendingAssessment final : public Assessment { |
91 public: | 72 public: |
92 explicit PendingAssessment(const InstructionBlock* origin, | 73 explicit PendingAssessment(const InstructionBlock* origin, |
93 InstructionOperand operand) | 74 InstructionOperand operand) |
94 : Assessment(Pending), origin_(origin), operand_(operand) {} | 75 : Assessment(Pending), origin_(origin), operand_(operand) {} |
95 | 76 |
96 static PendingAssessment* cast(Assessment* assessment) { | 77 static PendingAssessment* cast(Assessment* assessment) { |
97 CHECK(assessment->kind() == Pending); | 78 CHECK(assessment->kind() == Pending); |
98 return static_cast<PendingAssessment*>(assessment); | 79 return static_cast<PendingAssessment*>(assessment); |
99 } | 80 } |
100 | 81 |
101 const InstructionBlock* origin() const { return origin_; } | 82 const InstructionBlock* origin() const { return origin_; } |
102 InstructionOperand operand() const { return operand_; } | 83 InstructionOperand operand() const { return operand_; } |
103 | 84 |
104 private: | 85 private: |
105 const InstructionBlock* const origin_; | 86 const InstructionBlock* const origin_; |
106 InstructionOperand operand_; | 87 InstructionOperand operand_; |
107 | 88 |
108 DISALLOW_COPY_AND_ASSIGN(PendingAssessment); | 89 DISALLOW_COPY_AND_ASSIGN(PendingAssessment); |
109 }; | 90 }; |
110 | 91 |
| 92 // FinalAssessmens are associated to operands that we know to be a certain |
| 93 // virtual register. |
| 94 class FinalAssessment final : public Assessment { |
| 95 public: |
| 96 explicit FinalAssessment(int virtual_register, |
| 97 const PendingAssessment* original_pending = nullptr) |
| 98 : Assessment(Final), |
| 99 virtual_register_(virtual_register), |
| 100 original_pending_assessment_(original_pending) {} |
| 101 |
| 102 int virtual_register() const { return virtual_register_; } |
| 103 static const FinalAssessment* cast(const Assessment* assessment) { |
| 104 CHECK(assessment->kind() == Final); |
| 105 return static_cast<const FinalAssessment*>(assessment); |
| 106 } |
| 107 |
| 108 const PendingAssessment* original_pending_assessment() const { |
| 109 return original_pending_assessment_; |
| 110 } |
| 111 |
| 112 private: |
| 113 int virtual_register_; |
| 114 const PendingAssessment* original_pending_assessment_; |
| 115 |
| 116 DISALLOW_COPY_AND_ASSIGN(FinalAssessment); |
| 117 }; |
| 118 |
111 struct OperandAsKeyLess { | 119 struct OperandAsKeyLess { |
112 bool operator()(const InstructionOperand& a, | 120 bool operator()(const InstructionOperand& a, |
113 const InstructionOperand& b) const { | 121 const InstructionOperand& b) const { |
114 return a.CompareCanonicalized(b); | 122 return a.CompareCanonicalized(b); |
115 } | 123 } |
116 }; | 124 }; |
117 | 125 |
118 // Assessments associated with a basic block. | 126 // Assessments associated with a basic block. |
119 class BlockAssessments : public ZoneObject { | 127 class BlockAssessments : public ZoneObject { |
120 public: | 128 public: |
(...skipping 103 matching lines...) Expand 10 before | Expand all | Expand 10 after Loading... |
224 static void VerifyTemp(const OperandConstraint& constraint); | 232 static void VerifyTemp(const OperandConstraint& constraint); |
225 static void VerifyOutput(const OperandConstraint& constraint); | 233 static void VerifyOutput(const OperandConstraint& constraint); |
226 | 234 |
227 void BuildConstraint(const InstructionOperand* op, | 235 void BuildConstraint(const InstructionOperand* op, |
228 OperandConstraint* constraint); | 236 OperandConstraint* constraint); |
229 void CheckConstraint(const InstructionOperand* op, | 237 void CheckConstraint(const InstructionOperand* op, |
230 const OperandConstraint* constraint); | 238 const OperandConstraint* constraint); |
231 BlockAssessments* CreateForBlock(const InstructionBlock* block); | 239 BlockAssessments* CreateForBlock(const InstructionBlock* block); |
232 | 240 |
233 void ValidatePendingAssessment(RpoNumber block_id, InstructionOperand op, | 241 void ValidatePendingAssessment(RpoNumber block_id, InstructionOperand op, |
234 PendingAssessment* assessment, | 242 BlockAssessments* current_assessments, |
| 243 const PendingAssessment* assessment, |
235 int virtual_register); | 244 int virtual_register); |
| 245 void ValidateFinalAssessment(RpoNumber block_id, InstructionOperand op, |
| 246 BlockAssessments* current_assessments, |
| 247 const FinalAssessment* assessment, |
| 248 int virtual_register); |
236 void ValidateUse(RpoNumber block_id, BlockAssessments* current_assessments, | 249 void ValidateUse(RpoNumber block_id, BlockAssessments* current_assessments, |
237 InstructionOperand op, int virtual_register); | 250 InstructionOperand op, int virtual_register); |
238 | 251 |
239 Zone* const zone_; | 252 Zone* const zone_; |
240 const RegisterConfiguration* config_; | 253 const RegisterConfiguration* config_; |
241 const InstructionSequence* const sequence_; | 254 const InstructionSequence* const sequence_; |
242 Constraints constraints_; | 255 Constraints constraints_; |
243 ZoneMap<RpoNumber, BlockAssessments*> assessments_; | 256 ZoneMap<RpoNumber, BlockAssessments*> assessments_; |
244 ZoneMap<RpoNumber, DelayedAssessments*> outstanding_assessments_; | 257 ZoneMap<RpoNumber, DelayedAssessments*> outstanding_assessments_; |
245 | 258 |
246 // Cached structures, to avoid memory churn. Needed solely in | |
247 // ValidatePendingAssessment. | |
248 ZoneQueue<std::pair<PendingAssessment*, int>> worklist_; | |
249 ZoneSet<RpoNumber> seen_; | |
250 | |
251 DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorVerifier); | 259 DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorVerifier); |
252 }; | 260 }; |
253 | 261 |
254 } // namespace compiler | 262 } // namespace compiler |
255 } // namespace internal | 263 } // namespace internal |
256 } // namespace v8 | 264 } // namespace v8 |
257 | 265 |
258 #endif | 266 #endif |
OLD | NEW |