summaryrefslogtreecommitdiff
path: root/compiler
diff options
context:
space:
mode:
author David Brazdil <dbrazdil@google.com> 2016-01-06 12:47:07 +0000
committer Gerrit Code Review <noreply-gerritcodereview@google.com> 2016-01-06 12:47:07 +0000
commit5b7b5ddb515828c93f0c2aec67aa513c32d0de22 (patch)
treeea04b85d15f74e8e8a88ab6de120ff2e330144c9 /compiler
parenta6bfd5967b751715e15c4f22d8a6a03285bed9bc (diff)
parent744a1c687fb92050828e188838b0ce5e0474f94a (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.cc15
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 {