5 #ifndef V8_COMPILER_BACKEND_REGISTER_ALLOCATOR_VERIFIER_H_ 6 #define V8_COMPILER_BACKEND_REGISTER_ALLOCATOR_VERIFIER_H_ 8 #include "src/compiler/backend/instruction.h" 9 #include "src/zone/zone-containers.h" 15 class InstructionBlock;
16 class InstructionSequence;
53 enum AssessmentKind { Final, Pending };
57 AssessmentKind kind()
const {
return kind_; }
60 explicit Assessment(AssessmentKind kind) : kind_(kind) {}
84 CHECK(assessment->kind() == Pending);
89 CHECK(assessment->kind() == Pending);
95 bool IsAliasOf(
int vreg)
const {
return aliases_.count(vreg) > 0; }
96 void AddAlias(
int vreg) { aliases_.insert(vreg); }
111 :
Assessment(Final), virtual_register_(virtual_register) {}
113 int virtual_register()
const {
return virtual_register_; }
115 CHECK(assessment->kind() == Final);
120 int virtual_register_;
128 return a.CompareCanonicalized(b);
137 : map_(zone), map_for_moves_(zone), zone_(zone) {}
139 void DropRegisters();
141 auto existent = map_.find(operand);
142 if (existent != map_.end()) {
144 map_.erase(existent);
147 std::make_pair(operand,
new (zone_)
FinalAssessment(virtual_register)));
154 CHECK_NOT_NULL(other);
155 map_.insert(other->map_.begin(), other->map_.end());
159 const OperandMap& map()
const {
return map_; }
175 void VerifyAssignment(
const char* caller_info);
176 void VerifyGapMoves();
179 enum ConstraintType {
190 kRegisterOrSlotOrConstant,
196 struct OperandConstraint {
197 ConstraintType type_;
202 int virtual_register_;
205 struct InstructionConstraint {
207 size_t operand_constaints_size_;
208 OperandConstraint* operand_constraints_;
213 class DelayedAssessments :
public ZoneObject {
215 explicit DelayedAssessments(
Zone* zone) : map_(zone) {}
222 auto it = map_.find(op);
223 if (it == map_.end()) {
224 map_.insert(std::make_pair(op, vreg));
226 CHECK_EQ(it->second, vreg);
234 Zone* zone()
const {
return zone_; }
237 Constraints* constraints() {
return &constraints_; }
239 static void VerifyInput(
const OperandConstraint& constraint);
240 static void VerifyTemp(
const OperandConstraint& constraint);
241 static void VerifyOutput(
const OperandConstraint& constraint);
244 OperandConstraint* constraint);
246 const OperandConstraint* constraint);
254 int virtual_register);
265 const char* caller_info_ =
nullptr;
274 #endif // V8_COMPILER_BACKEND_REGISTER_ALLOCATOR_VERIFIER_H_