Mon, 28 Oct 2013 09:58:59 +0100
8027140: Assertion in compiler when running bigapps/Kitchensink/stability
Summary: filter() code for TypeKlassPtr not moved when permgen removal was introduced
Reviewed-by: twisti, iveresov
src/share/vm/opto/type.cpp | file | annotate | diff | comparison | revisions | |
src/share/vm/opto/type.hpp | file | annotate | diff | comparison | revisions |
1.1 --- a/src/share/vm/opto/type.cpp Thu Oct 24 16:26:31 2013 -0700 1.2 +++ b/src/share/vm/opto/type.cpp Mon Oct 28 09:58:59 2013 +0100 1.3 @@ -2787,13 +2787,11 @@ 1.4 1.5 //-----------------------------filter------------------------------------------ 1.6 // Do not allow interface-vs.-noninterface joins to collapse to top. 1.7 -const Type *TypeOopPtr::filter( const Type *kills ) const { 1.8 +const Type *TypeOopPtr::filter(const Type *kills) const { 1.9 1.10 const Type* ft = join(kills); 1.11 const TypeInstPtr* ftip = ft->isa_instptr(); 1.12 const TypeInstPtr* ktip = kills->isa_instptr(); 1.13 - const TypeKlassPtr* ftkp = ft->isa_klassptr(); 1.14 - const TypeKlassPtr* ktkp = kills->isa_klassptr(); 1.15 1.16 if (ft->empty()) { 1.17 // Check for evil case of 'this' being a class and 'kills' expecting an 1.18 @@ -2807,8 +2805,6 @@ 1.19 // uplift the type. 1.20 if (!empty() && ktip != NULL && ktip->is_loaded() && ktip->klass()->is_interface()) 1.21 return kills; // Uplift to interface 1.22 - if (!empty() && ktkp != NULL && ktkp->klass()->is_loaded() && ktkp->klass()->is_interface()) 1.23 - return kills; // Uplift to interface 1.24 1.25 return Type::TOP; // Canonical empty value 1.26 } 1.27 @@ -2825,14 +2821,6 @@ 1.28 assert(!ftip->klass_is_exact(), "interface could not be exact"); 1.29 return ktip->cast_to_ptr_type(ftip->ptr()); 1.30 } 1.31 - // Interface klass type could be exact in opposite to interface type, 1.32 - // return it here instead of incorrect Constant ptr J/L/Object (6894807). 1.33 - if (ftkp != NULL && ktkp != NULL && 1.34 - ftkp->is_loaded() && ftkp->klass()->is_interface() && 1.35 - !ftkp->klass_is_exact() && // Keep exact interface klass 1.36 - ktkp->is_loaded() && !ktkp->klass()->is_interface()) { 1.37 - return ktkp->cast_to_ptr_type(ftkp->ptr()); 1.38 - } 1.39 1.40 return ft; 1.41 } 1.42 @@ -4385,6 +4373,33 @@ 1.43 return (_offset == 0) && !below_centerline(_ptr); 1.44 } 1.45 1.46 +// Do not allow interface-vs.-noninterface joins to collapse to top. 1.47 +const Type *TypeKlassPtr::filter(const Type *kills) const { 1.48 + // logic here mirrors the one from TypeOopPtr::filter. See comments 1.49 + // there. 1.50 + const Type* ft = join(kills); 1.51 + const TypeKlassPtr* ftkp = ft->isa_klassptr(); 1.52 + const TypeKlassPtr* ktkp = kills->isa_klassptr(); 1.53 + 1.54 + if (ft->empty()) { 1.55 + if (!empty() && ktkp != NULL && ktkp->klass()->is_loaded() && ktkp->klass()->is_interface()) 1.56 + return kills; // Uplift to interface 1.57 + 1.58 + return Type::TOP; // Canonical empty value 1.59 + } 1.60 + 1.61 + // Interface klass type could be exact in opposite to interface type, 1.62 + // return it here instead of incorrect Constant ptr J/L/Object (6894807). 1.63 + if (ftkp != NULL && ktkp != NULL && 1.64 + ftkp->is_loaded() && ftkp->klass()->is_interface() && 1.65 + !ftkp->klass_is_exact() && // Keep exact interface klass 1.66 + ktkp->is_loaded() && !ktkp->klass()->is_interface()) { 1.67 + return ktkp->cast_to_ptr_type(ftkp->ptr()); 1.68 + } 1.69 + 1.70 + return ft; 1.71 +} 1.72 + 1.73 //----------------------compute_klass------------------------------------------ 1.74 // Compute the defining klass for this class 1.75 ciKlass* TypeAryPtr::compute_klass(DEBUG_ONLY(bool verify)) const {
2.1 --- a/src/share/vm/opto/type.hpp Thu Oct 24 16:26:31 2013 -0700 2.2 +++ b/src/share/vm/opto/type.hpp Mon Oct 28 09:58:59 2013 +0100 2.3 @@ -63,7 +63,7 @@ 2.4 class TypeOopPtr; 2.5 class TypeInstPtr; 2.6 class TypeAryPtr; 2.7 -class TypeKlassPtr; 2.8 +class TypeKlassPtr; 2.9 class TypeMetadataPtr; 2.10 2.11 //------------------------------Type------------------------------------------- 2.12 @@ -1202,6 +1202,9 @@ 2.13 2.14 virtual intptr_t get_con() const; 2.15 2.16 + // Do not allow interface-vs.-noninterface joins to collapse to top. 2.17 + virtual const Type *filter( const Type *kills ) const; 2.18 + 2.19 // Convenience common pre-built types. 2.20 static const TypeKlassPtr* OBJECT; // Not-null object klass or below 2.21 static const TypeKlassPtr* OBJECT_OR_NULL; // Maybe-null version of same