6589823: Error: meet not symmetric
Summary: arrays pointers meet must fall to bottom if exact array klasses in upper lattice are not equal or super klass is exact.
Reviewed-by: never
--- a/hotspot/src/share/vm/opto/type.cpp Fri Mar 04 22:44:50 2011 -0800
+++ b/hotspot/src/share/vm/opto/type.cpp Sat Mar 05 11:02:04 2011 -0800
@@ -3386,7 +3386,22 @@
instance_id = InstanceBot;
tary = TypeAry::make(Type::BOTTOM, tary->_size);
}
+ } else // Non integral arrays.
+ // Must fall to bottom if exact klasses in upper lattice
+ // are not equal or super klass is exact.
+ if ( above_centerline(ptr) && klass() != tap->klass() &&
+ // meet with top[] and bottom[] are processed further down:
+ tap ->_klass != NULL && this->_klass != NULL &&
+ // both are exact and not equal:
+ ((tap ->_klass_is_exact && this->_klass_is_exact) ||
+ // 'tap' is exact and super or unrelated:
+ (tap ->_klass_is_exact && !tap->klass()->is_subtype_of(klass())) ||
+ // 'this' is exact and super or unrelated:
+ (this->_klass_is_exact && !klass()->is_subtype_of(tap->klass())))) {
+ tary = TypeAry::make(Type::BOTTOM, tary->_size);
+ return make( NotNull, NULL, tary, lazy_klass, false, off, InstanceBot );
}
+
bool xk = false;
switch (tap->ptr()) {
case AnyNull: