--- old/src/share/vm/opto/type.cpp 2017-07-14 16:33:38.869651891 +0200 +++ new/src/share/vm/opto/type.cpp 2017-07-14 16:33:38.785651895 +0200 @@ -645,6 +645,7 @@ TypeKlassPtr::OBJECT = TypeKlassPtr::make(TypePtr::NotNull, current->env()->Object_klass(), Offset(0) ); TypeKlassPtr::OBJECT_OR_NULL = TypeKlassPtr::make(TypePtr::BotPTR, current->env()->Object_klass(), Offset(0) ); + TypeKlassPtr::BOTTOM = (EnableValhalla | EnableMVT) ? TypeKlassPtr::make(TypePtr::BotPTR, NULL, Offset(0)) : TypeKlassPtr::OBJECT_OR_NULL; const Type **fi2c = TypeTuple::fields(2); fi2c[TypeFunc::Parms+0] = TypeInstPtr::BOTTOM; // Method* @@ -5248,6 +5249,7 @@ // Not-null object klass or below const TypeKlassPtr *TypeKlassPtr::OBJECT; const TypeKlassPtr *TypeKlassPtr::OBJECT_OR_NULL; +const TypeKlassPtr* TypeKlassPtr::BOTTOM; //------------------------------TypeKlassPtr----------------------------------- TypeKlassPtr::TypeKlassPtr( PTR ptr, ciKlass* klass, Offset offset ) @@ -5257,27 +5259,21 @@ //------------------------------make------------------------------------------- // ptr to klass 'k', if Constant, or possibly to a sub-klass if not a Constant const TypeKlassPtr* TypeKlassPtr::make(PTR ptr, ciKlass* k, Offset offset) { - assert( k != NULL, "Expect a non-NULL klass"); - assert(k->is_instance_klass() || k->is_array_klass(), "Incorrect type of klass oop"); - TypeKlassPtr *r = - (TypeKlassPtr*)(new TypeKlassPtr(ptr, k, offset))->hashcons(); - - return r; + assert(k == NULL || k->is_instance_klass() || k->is_array_klass(), "Incorrect type of klass oop"); + return (TypeKlassPtr*)(new TypeKlassPtr(ptr, k, offset))->hashcons(); } //------------------------------eq--------------------------------------------- // Structural equality check for Type representations bool TypeKlassPtr::eq( const Type *t ) const { const TypeKlassPtr *p = t->is_klassptr(); - return - klass()->equals(p->klass()) && - TypePtr::eq(p); + return klass() == p->klass() && TypePtr::eq(p); } //------------------------------hash------------------------------------------- // Type-specific hashing function. int TypeKlassPtr::hash(void) const { - return java_add(klass()->hash(), TypePtr::hash()); + return java_add(klass() != NULL ? klass()->hash() : 0, TypePtr::hash()); } //------------------------------singleton-------------------------------------- @@ -5298,7 +5294,7 @@ const TypeKlassPtr* ktkp = kills->isa_klassptr(); if (ft->empty()) { - if (!empty() && ktkp != NULL && ktkp->klass()->is_loaded() && ktkp->klass()->is_interface()) + if (!empty() && ktkp != NULL && ktkp->is_loaded() && ktkp->klass()->is_interface()) return kills; // Uplift to interface return Type::TOP; // Canonical empty value @@ -5432,6 +5428,7 @@ // It will be NotNull, and exact if and only if the klass type is exact. const TypeOopPtr* TypeKlassPtr::as_instance_type() const { ciKlass* k = klass(); + assert(k != NULL, "klass should not be NULL"); bool xk = klass_is_exact(); //return TypeInstPtr::make(TypePtr::NotNull, k, xk, NULL, 0); const TypeOopPtr* toop = TypeOopPtr::make_from_klass_raw(k); @@ -5516,6 +5513,14 @@ Offset off = meet_offset(tkls->offset()); PTR ptr = meet_ptr(tkls->ptr()); + if (klass() == NULL || tkls->klass() == NULL) { + ciKlass* k = NULL; + if (ptr == Constant) { + k = (klass() == NULL) ? tkls->klass() : klass(); + } + return make(ptr, k, off); + } + // Check for easy case; klasses are equal (and perhaps not loaded!) // If we have constants, then we created oops so classes are loaded // and we can handle the constants further down. This case handles @@ -5606,11 +5611,11 @@ st->print("precise "); case NotNull: { - const char *name = klass()->name()->as_utf8(); - if( name ) { + if (klass() != NULL) { + const char* name = klass()->name()->as_utf8(); st->print("klass %s: " INTPTR_FORMAT, name, p2i(klass())); } else { - ShouldNotReachHere(); + st->print("klass BOTTOM"); } } case BotPTR: