diff --git a/runtime/vm/intermediate_language.cc b/runtime/vm/intermediate_language.cc index 832214bdde8..f7bc0062642 100644 --- a/runtime/vm/intermediate_language.cc +++ b/runtime/vm/intermediate_language.cc @@ -312,9 +312,12 @@ void Definition::ReplaceUsesWith(Definition* other) { } current->definition_ = other; - current->next_use_ = other->use_list(); - other->use_list()->previous_use_ = current; + if (other->use_list() != NULL) { + current->next_use_ = other->use_list(); + other->use_list()->previous_use_ = current; + } other->set_use_list(head); + set_use_list(NULL); } diff --git a/runtime/vm/intermediate_language_test.cc b/runtime/vm/intermediate_language_test.cc index 2f7d5ae5f31..fd941fd90a5 100644 --- a/runtime/vm/intermediate_language_test.cc +++ b/runtime/vm/intermediate_language_test.cc @@ -39,6 +39,12 @@ TEST_CASE(DefUseTests) { BindInstr* bind = new BindInstr(BindInstr::kUsed, use2); bind->RemoveInputUses(); EXPECT(def1->use_list() == NULL); + // Test replacing with a definition without uses. + UseVal* use4 = new UseVal(def2); + def2->ReplaceUsesWith(def1); + EXPECT(def1->use_list() == use4); + EXPECT(def2->use_list() == NULL); + EXPECT(use4->definition() == def1); } } // namespace dart