Index: src/compiler/register-allocator-verifier.h |
diff --git a/src/compiler/register-allocator-verifier.h b/src/compiler/register-allocator-verifier.h |
index 18d38c58a1511af434eeaf290c9d69a8a083f282..251840658ce97781c08e4f222fa8829e37aa7ff4 100644 |
--- a/src/compiler/register-allocator-verifier.h |
+++ b/src/compiler/register-allocator-verifier.h |
@@ -62,25 +62,6 @@ class Assessment : public ZoneObject { |
DISALLOW_COPY_AND_ASSIGN(Assessment); |
}; |
-// FinalAssessmens are associated to operands that we know to be a certain |
-// virtual register. |
-class FinalAssessment final : public Assessment { |
- public: |
- explicit FinalAssessment(int virtual_register) |
- : Assessment(Final), virtual_register_(virtual_register) {} |
- |
- int virtual_register() const { return virtual_register_; } |
- static const FinalAssessment* cast(const Assessment* assessment) { |
- CHECK(assessment->kind() == Final); |
- return static_cast<const FinalAssessment*>(assessment); |
- } |
- |
- private: |
- int virtual_register_; |
- |
- DISALLOW_COPY_AND_ASSIGN(FinalAssessment); |
-}; |
- |
// PendingAssessments are associated to operands coming from the multiple |
// predecessors of a block. We only record the operand and the block, and |
// will determine if the way the operand is defined (from the predecessors) |
@@ -108,6 +89,33 @@ class PendingAssessment final : public Assessment { |
DISALLOW_COPY_AND_ASSIGN(PendingAssessment); |
}; |
+// FinalAssessmens are associated to operands that we know to be a certain |
+// virtual register. |
+class FinalAssessment final : public Assessment { |
+ public: |
+ explicit FinalAssessment(int virtual_register, |
+ const PendingAssessment* original_pending = nullptr) |
+ : Assessment(Final), |
+ virtual_register_(virtual_register), |
+ original_pending_assessment_(original_pending) {} |
+ |
+ int virtual_register() const { return virtual_register_; } |
+ static const FinalAssessment* cast(const Assessment* assessment) { |
+ CHECK(assessment->kind() == Final); |
+ return static_cast<const FinalAssessment*>(assessment); |
+ } |
+ |
+ const PendingAssessment* original_pending_assessment() const { |
+ return original_pending_assessment_; |
+ } |
+ |
+ private: |
+ int virtual_register_; |
+ const PendingAssessment* original_pending_assessment_; |
+ |
+ DISALLOW_COPY_AND_ASSIGN(FinalAssessment); |
+}; |
+ |
struct OperandAsKeyLess { |
bool operator()(const InstructionOperand& a, |
const InstructionOperand& b) const { |
@@ -231,8 +239,13 @@ class RegisterAllocatorVerifier final : public ZoneObject { |
BlockAssessments* CreateForBlock(const InstructionBlock* block); |
void ValidatePendingAssessment(RpoNumber block_id, InstructionOperand op, |
- PendingAssessment* assessment, |
+ BlockAssessments* current_assessments, |
+ const PendingAssessment* assessment, |
int virtual_register); |
+ void ValidateFinalAssessment(RpoNumber block_id, InstructionOperand op, |
+ BlockAssessments* current_assessments, |
+ const FinalAssessment* assessment, |
+ int virtual_register); |
void ValidateUse(RpoNumber block_id, BlockAssessments* current_assessments, |
InstructionOperand op, int virtual_register); |
@@ -243,11 +256,6 @@ class RegisterAllocatorVerifier final : public ZoneObject { |
ZoneMap<RpoNumber, BlockAssessments*> assessments_; |
ZoneMap<RpoNumber, DelayedAssessments*> outstanding_assessments_; |
- // Cached structures, to avoid memory churn. Needed solely in |
- // ValidatePendingAssessment. |
- ZoneQueue<std::pair<PendingAssessment*, int>> worklist_; |
- ZoneSet<RpoNumber> seen_; |
- |
DISALLOW_COPY_AND_ASSIGN(RegisterAllocatorVerifier); |
}; |