6788347: C2Compiler crash 6u7

Wed, 14 Jan 2009 14:12:00 -0800

author
never
date
Wed, 14 Jan 2009 14:12:00 -0800
changeset 990
35ae4dd6c27c
parent 989
78144dc3db03
child 991
48bb4a49b7ac

6788347: C2Compiler crash 6u7
Reviewed-by: kvn

src/share/vm/opto/cfgnode.cpp file | annotate | diff | comparison | revisions
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/cfgnode.cpp	Tue Jan 13 14:02:19 2009 -0800
     1.2 +++ b/src/share/vm/opto/cfgnode.cpp	Wed Jan 14 14:12:00 2009 -0800
     1.3 @@ -858,12 +858,18 @@
     1.4    // convert the one to the other.
     1.5    const TypePtr* ttp = _type->make_ptr();
     1.6    const TypeInstPtr* ttip = (ttp != NULL) ? ttp->isa_instptr() : NULL;
     1.7 +  const TypeKlassPtr* ttkp = (ttp != NULL) ? ttp->isa_klassptr() : NULL;
     1.8    bool is_intf = false;
     1.9    if (ttip != NULL) {
    1.10      ciKlass* k = ttip->klass();
    1.11      if (k->is_loaded() && k->is_interface())
    1.12        is_intf = true;
    1.13    }
    1.14 +  if (ttkp != NULL) {
    1.15 +    ciKlass* k = ttkp->klass();
    1.16 +    if (k->is_loaded() && k->is_interface())
    1.17 +      is_intf = true;
    1.18 +  }
    1.19  
    1.20    // Default case: merge all inputs
    1.21    const Type *t = Type::TOP;        // Merged type starting value
    1.22 @@ -921,6 +927,8 @@
    1.23      // uplift the type.
    1.24      if( !t->empty() && ttip && ttip->is_loaded() && ttip->klass()->is_interface() )
    1.25        { assert(ft == _type, ""); } // Uplift to interface
    1.26 +    else if( !t->empty() && ttkp && ttkp->is_loaded() && ttkp->klass()->is_interface() )
    1.27 +      { assert(ft == _type, ""); } // Uplift to interface
    1.28      // Otherwise it's something stupid like non-overlapping int ranges
    1.29      // found on dying counted loops.
    1.30      else
    1.31 @@ -936,6 +944,7 @@
    1.32      // because the type system doesn't interact well with interfaces.
    1.33      const TypePtr *jtp = jt->make_ptr();
    1.34      const TypeInstPtr *jtip = (jtp != NULL) ? jtp->isa_instptr() : NULL;
    1.35 +    const TypeKlassPtr *jtkp = (jtp != NULL) ? jtp->isa_klassptr() : NULL;
    1.36      if( jtip && ttip ) {
    1.37        if( jtip->is_loaded() &&  jtip->klass()->is_interface() &&
    1.38            ttip->is_loaded() && !ttip->klass()->is_interface() ) {
    1.39 @@ -945,6 +954,14 @@
    1.40          jt = ft;
    1.41        }
    1.42      }
    1.43 +    if( jtkp && ttkp ) {
    1.44 +      if( jtkp->is_loaded() &&  jtkp->klass()->is_interface() &&
    1.45 +          ttkp->is_loaded() && !ttkp->klass()->is_interface() ) {
    1.46 +        assert(ft == ttkp->cast_to_ptr_type(jtkp->ptr()) ||
    1.47 +               ft->isa_narrowoop() && ft->make_ptr() == ttkp->cast_to_ptr_type(jtkp->ptr()), "");
    1.48 +        jt = ft;
    1.49 +      }
    1.50 +    }
    1.51      if (jt != ft && jt->base() == ft->base()) {
    1.52        if (jt->isa_int() &&
    1.53            jt->is_int()->_lo == ft->is_int()->_lo &&
     2.1 --- a/src/share/vm/opto/type.cpp	Tue Jan 13 14:02:19 2009 -0800
     2.2 +++ b/src/share/vm/opto/type.cpp	Wed Jan 14 14:12:00 2009 -0800
     2.3 @@ -2471,6 +2471,8 @@
     2.4    const Type* ft = join(kills);
     2.5    const TypeInstPtr* ftip = ft->isa_instptr();
     2.6    const TypeInstPtr* ktip = kills->isa_instptr();
     2.7 +  const TypeKlassPtr* ftkp = ft->isa_klassptr();
     2.8 +  const TypeKlassPtr* ktkp = kills->isa_klassptr();
     2.9  
    2.10    if (ft->empty()) {
    2.11      // Check for evil case of 'this' being a class and 'kills' expecting an
    2.12 @@ -2484,6 +2486,8 @@
    2.13      // uplift the type.
    2.14      if (!empty() && ktip != NULL && ktip->is_loaded() && ktip->klass()->is_interface())
    2.15        return kills;             // Uplift to interface
    2.16 +    if (!empty() && ktkp != NULL && ktkp->klass()->is_loaded() && ktkp->klass()->is_interface())
    2.17 +      return kills;             // Uplift to interface
    2.18  
    2.19      return Type::TOP;           // Canonical empty value
    2.20    }
    2.21 @@ -2499,6 +2503,12 @@
    2.22      // Happens in a CTW of rt.jar, 320-341, no extra flags
    2.23      return ktip->cast_to_ptr_type(ftip->ptr());
    2.24    }
    2.25 +  if (ftkp != NULL && ktkp != NULL &&
    2.26 +      ftkp->is_loaded() &&  ftkp->klass()->is_interface() &&
    2.27 +      ktkp->is_loaded() && !ktkp->klass()->is_interface()) {
    2.28 +    // Happens in a CTW of rt.jar, 320-341, no extra flags
    2.29 +    return ktkp->cast_to_ptr_type(ftkp->ptr());
    2.30 +  }
    2.31  
    2.32    return ft;
    2.33  }
     3.1 --- a/src/share/vm/opto/type.hpp	Tue Jan 13 14:02:19 2009 -0800
     3.2 +++ b/src/share/vm/opto/type.hpp	Wed Jan 14 14:12:00 2009 -0800
     3.3 @@ -882,6 +882,8 @@
     3.4  public:
     3.5    ciSymbol* name()  const { return _klass->name(); }
     3.6  
     3.7 +  bool  is_loaded() const { return _klass->is_loaded(); }
     3.8 +
     3.9    // ptr to klass 'k'
    3.10    static const TypeKlassPtr *make( ciKlass* k ) { return make( TypePtr::Constant, k, 0); }
    3.11    // ptr to klass 'k' with offset

mercurial