Wed, 14 Jan 2009 14:12:00 -0800
6788347: C2Compiler crash 6u7
Reviewed-by: kvn
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