8027140: Assertion in compiler when running bigapps/Kitchensink/stability

Mon, 28 Oct 2013 09:58:59 +0100

author
roland
date
Mon, 28 Oct 2013 09:58:59 +0100
changeset 6043
6c2f07d1495f
parent 6040
cbe8ba0fb8fc
child 6044
bfdb530cdffa

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

mercurial