diff options
author | 2016-01-06 12:47:07 +0000 | |
---|---|---|
committer | 2016-01-06 12:47:07 +0000 | |
commit | 5b7b5ddb515828c93f0c2aec67aa513c32d0de22 (patch) | |
tree | ea04b85d15f74e8e8a88ab6de120ff2e330144c9 /compiler | |
parent | a6bfd5967b751715e15c4f22d8a6a03285bed9bc (diff) | |
parent | 744a1c687fb92050828e188838b0ce5e0474f94a (diff) |
Merge "ART: Don't set initial RTI for BoundType if input untyped"
Diffstat (limited to 'compiler')
-rw-r--r-- | compiler/optimizing/reference_type_propagation.cc | 15 |
1 files changed, 11 insertions, 4 deletions
diff --git a/compiler/optimizing/reference_type_propagation.cc b/compiler/optimizing/reference_type_propagation.cc index e55061c92a..1c25e4824c 100644 --- a/compiler/optimizing/reference_type_propagation.cc +++ b/compiler/optimizing/reference_type_propagation.cc @@ -583,11 +583,18 @@ void RTPVisitor::VisitBoundType(HBoundType* instr) { if (class_rti.GetTypeHandle()->CannotBeAssignedFromOtherTypes()) { instr->SetReferenceTypeInfo( ReferenceTypeInfo::Create(class_rti.GetTypeHandle(), /* is_exact */ true)); - } else if (obj_rti.IsValid() && class_rti.IsSupertypeOf(obj_rti)) { - instr->SetReferenceTypeInfo(obj_rti); + } else if (obj_rti.IsValid()) { + if (class_rti.IsSupertypeOf(obj_rti)) { + // Object type is more specific. + instr->SetReferenceTypeInfo(obj_rti); + } else { + // Upper bound is more specific. + instr->SetReferenceTypeInfo( + ReferenceTypeInfo::Create(class_rti.GetTypeHandle(), /* is_exact */ false)); + } } else { - instr->SetReferenceTypeInfo( - ReferenceTypeInfo::Create(class_rti.GetTypeHandle(), /* is_exact */ false)); + // Object not typed yet. Leave BoundType untyped for now rather than + // assign the type conservatively. } instr->SetCanBeNull(obj->CanBeNull() && instr->GetUpperCanBeNull()); } else { |