mirror of
https://github.com/openjdk/jdk.git
synced 2025-09-23 12:34:32 +02:00
6730716: nulls from two unrelated classes compare not equal
Check for not-nullness after proving that types are unrelated Reviewed-by: kvn, never
This commit is contained in:
parent
45f8e241e3
commit
ae4e755124
1 changed files with 34 additions and 12 deletions
|
@ -633,20 +633,31 @@ const Type *CmpPNode::sub( const Type *t1, const Type *t2 ) const {
|
||||||
kps != 1 && // both or neither are klass pointers
|
kps != 1 && // both or neither are klass pointers
|
||||||
!klass0->is_interface() && // do not trust interfaces
|
!klass0->is_interface() && // do not trust interfaces
|
||||||
!klass1->is_interface()) {
|
!klass1->is_interface()) {
|
||||||
|
bool unrelated_classes = false;
|
||||||
// See if neither subclasses the other, or if the class on top
|
// See if neither subclasses the other, or if the class on top
|
||||||
// is precise. In either of these cases, the compare must fail.
|
// is precise. In either of these cases, the compare is known
|
||||||
|
// to fail if at least one of the pointers is provably not null.
|
||||||
if (klass0->equals(klass1) || // if types are unequal but klasses are
|
if (klass0->equals(klass1) || // if types are unequal but klasses are
|
||||||
!klass0->is_java_klass() || // types not part of Java language?
|
!klass0->is_java_klass() || // types not part of Java language?
|
||||||
!klass1->is_java_klass()) { // types not part of Java language?
|
!klass1->is_java_klass()) { // types not part of Java language?
|
||||||
// Do nothing; we know nothing for imprecise types
|
// Do nothing; we know nothing for imprecise types
|
||||||
} else if (klass0->is_subtype_of(klass1)) {
|
} else if (klass0->is_subtype_of(klass1)) {
|
||||||
// If klass1's type is PRECISE, then we can fail.
|
// If klass1's type is PRECISE, then classes are unrelated.
|
||||||
if (xklass1) return TypeInt::CC_GT;
|
unrelated_classes = xklass1;
|
||||||
} else if (klass1->is_subtype_of(klass0)) {
|
} else if (klass1->is_subtype_of(klass0)) {
|
||||||
// If klass0's type is PRECISE, then we can fail.
|
// If klass0's type is PRECISE, then classes are unrelated.
|
||||||
if (xklass0) return TypeInt::CC_GT;
|
unrelated_classes = xklass0;
|
||||||
} else { // Neither subtypes the other
|
} else { // Neither subtypes the other
|
||||||
return TypeInt::CC_GT; // ...so always fail
|
unrelated_classes = true;
|
||||||
|
}
|
||||||
|
if (unrelated_classes) {
|
||||||
|
// The oops classes are known to be unrelated. If the joined PTRs of
|
||||||
|
// two oops is not Null and not Bottom, then we are sure that one
|
||||||
|
// of the two oops is non-null, and the comparison will always fail.
|
||||||
|
TypePtr::PTR jp = r0->join_ptr(r1->_ptr);
|
||||||
|
if (jp != TypePtr::Null && jp != TypePtr::BotPTR) {
|
||||||
|
return TypeInt::CC_GT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -777,20 +788,31 @@ const Type *CmpNNode::sub( const Type *t1, const Type *t2 ) const {
|
||||||
kps != 1 && // both or neither are klass pointers
|
kps != 1 && // both or neither are klass pointers
|
||||||
!klass0->is_interface() && // do not trust interfaces
|
!klass0->is_interface() && // do not trust interfaces
|
||||||
!klass1->is_interface()) {
|
!klass1->is_interface()) {
|
||||||
|
bool unrelated_classes = false;
|
||||||
// See if neither subclasses the other, or if the class on top
|
// See if neither subclasses the other, or if the class on top
|
||||||
// is precise. In either of these cases, the compare must fail.
|
// is precise. In either of these cases, the compare is known
|
||||||
|
// to fail if at least one of the pointers is provably not null.
|
||||||
if (klass0->equals(klass1) || // if types are unequal but klasses are
|
if (klass0->equals(klass1) || // if types are unequal but klasses are
|
||||||
!klass0->is_java_klass() || // types not part of Java language?
|
!klass0->is_java_klass() || // types not part of Java language?
|
||||||
!klass1->is_java_klass()) { // types not part of Java language?
|
!klass1->is_java_klass()) { // types not part of Java language?
|
||||||
// Do nothing; we know nothing for imprecise types
|
// Do nothing; we know nothing for imprecise types
|
||||||
} else if (klass0->is_subtype_of(klass1)) {
|
} else if (klass0->is_subtype_of(klass1)) {
|
||||||
// If klass1's type is PRECISE, then we can fail.
|
// If klass1's type is PRECISE, then classes are unrelated.
|
||||||
if (xklass1) return TypeInt::CC_GT;
|
unrelated_classes = xklass1;
|
||||||
} else if (klass1->is_subtype_of(klass0)) {
|
} else if (klass1->is_subtype_of(klass0)) {
|
||||||
// If klass0's type is PRECISE, then we can fail.
|
// If klass0's type is PRECISE, then classes are unrelated.
|
||||||
if (xklass0) return TypeInt::CC_GT;
|
unrelated_classes = xklass0;
|
||||||
} else { // Neither subtypes the other
|
} else { // Neither subtypes the other
|
||||||
return TypeInt::CC_GT; // ...so always fail
|
unrelated_classes = true;
|
||||||
|
}
|
||||||
|
if (unrelated_classes) {
|
||||||
|
// The oops classes are known to be unrelated. If the joined PTRs of
|
||||||
|
// two oops is not Null and not Bottom, then we are sure that one
|
||||||
|
// of the two oops is non-null, and the comparison will always fail.
|
||||||
|
TypePtr::PTR jp = r0->join_ptr(r1->_ptr);
|
||||||
|
if (jp != TypePtr::Null && jp != TypePtr::BotPTR) {
|
||||||
|
return TypeInt::CC_GT;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
Loading…
Add table
Add a link
Reference in a new issue