Fix inliner crash related to type propagation.
- Do not agressively try to resolve a return type.
- Deal with unresolved return type.
bug:25492619
Change-Id: Idc9c96a0b376fe5ee86b411c02ce7078c7f48c84
diff --git a/compiler/optimizing/inliner.cc b/compiler/optimizing/inliner.cc
index d861e39..fe528a0 100644
--- a/compiler/optimizing/inliner.cc
+++ b/compiler/optimizing/inliner.cc
@@ -1279,10 +1279,14 @@
// some functionality from the reference type propagation.
DCHECK(return_replacement->IsPhi());
size_t pointer_size = Runtime::Current()->GetClassLinker()->GetImagePointerSize();
- ReferenceTypeInfo::TypeHandle return_handle =
- handles_->NewHandle(resolved_method->GetReturnType(true /* resolve */, pointer_size));
- return_replacement->SetReferenceTypeInfo(ReferenceTypeInfo::Create(
- return_handle, return_handle->CannotBeAssignedFromOtherTypes() /* is_exact */));
+ mirror::Class* cls = resolved_method->GetReturnType(false /* resolve */, pointer_size);
+ if (cls != nullptr) {
+ ReferenceTypeInfo::TypeHandle return_handle= handles_->NewHandle(cls);
+ return_replacement->SetReferenceTypeInfo(ReferenceTypeInfo::Create(
+ return_handle, return_handle->CannotBeAssignedFromOtherTypes() /* is_exact */));
+ } else {
+ return_replacement->SetReferenceTypeInfo(graph_->GetInexactObjectRti());
+ }
}
if (do_rtp) {