Index: src/compiler/register-allocator-verifier.cc |
diff --git a/src/compiler/register-allocator-verifier.cc b/src/compiler/register-allocator-verifier.cc |
index c7ebd3c51029c3f825920014367b7a586590613d..c57591dfb4613d94c9a2d22d17687b562555e316 100644 |
--- a/src/compiler/register-allocator-verifier.cc |
+++ b/src/compiler/register-allocator-verifier.cc |
@@ -162,6 +162,13 @@ void RegisterAllocatorVerifier::BuildConstraint(const InstructionOperand* op, |
constraint->type_ = kRegister; |
} |
break; |
+ case UnallocatedOperand::MUST_HAVE_SLOT: |
+ if (sequence()->IsDouble(vreg)) { |
+ constraint->type_ = kDoubleSlot; |
+ } else { |
+ constraint->type_ = kSlot; |
+ } |
+ break; |
case UnallocatedOperand::SAME_AS_FIRST_INPUT: |
constraint->type_ = kSameAsFirst; |
break; |
@@ -200,6 +207,12 @@ void RegisterAllocatorVerifier::CheckConstraint( |
CHECK(op->IsStackSlot()); |
CHECK_EQ(op->index(), constraint->value_); |
return; |
+ case kSlot: |
+ CHECK(op->IsStackSlot()); |
+ return; |
+ case kDoubleSlot: |
+ CHECK(op->IsDoubleStackSlot()); |
+ return; |
case kNone: |
CHECK(op->IsRegister() || op->IsStackSlot()); |
return; |
@@ -301,7 +314,10 @@ class OperandMap : public ZoneObject { |
if (i->IsEliminated()) continue; |
auto cur = map().find(i->source()); |
CHECK(cur != map().end()); |
- to_insert.insert(std::make_pair(i->destination(), cur->second)); |
+ auto res = |
+ to_insert.insert(std::make_pair(i->destination(), cur->second)); |
+ // Ensure injectivity of moves. |
+ CHECK(res.second); |
} |
// Drop current mappings. |
for (auto i = moves->begin(); i != moves->end(); ++i) { |