< prev index next >
src/share/vm/opto/type.cpp
Print this page
@@ -643,10 +643,11 @@
TypeAryPtr::_array_body_type[T_FLOAT] = TypeAryPtr::FLOATS;
TypeAryPtr::_array_body_type[T_DOUBLE] = TypeAryPtr::DOUBLES;
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*
fi2c[TypeFunc::Parms+1] = TypeRawPtr::BOTTOM; // argument pointer
TypeTuple::START_I2C = TypeTuple::make(TypeFunc::Parms+2, fi2c);
@@ -5246,40 +5247,35 @@
// Convenience common pre-built types.
// 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 )
: TypePtr(KlassPtr, ptr, offset), _klass(klass), _klass_is_exact(ptr == Constant) {
}
//------------------------------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--------------------------------------
// TRUE if Type is a singleton type, FALSE otherwise. Singletons are simple
// constants
@@ -5296,11 +5292,11 @@
const Type* ft = join_helper(kills, include_speculative);
const TypeKlassPtr* ftkp = ft->isa_klassptr();
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
}
@@ -5430,10 +5426,11 @@
//-----------------------------as_instance_type--------------------------------
// Corresponding type for an instance of the given class.
// 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);
guarantee(toop != NULL, "need type for given klass");
toop = toop->cast_to_ptr_type(TypePtr::NotNull)->is_oopptr();
@@ -5514,10 +5511,18 @@
case KlassPtr: { // Meet two KlassPtr types
const TypeKlassPtr *tkls = t->is_klassptr();
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
// not-loaded classes
if( ptr != Constant && tkls->klass()->equals(klass()) ) {
@@ -5604,15 +5609,15 @@
switch( _ptr ) {
case Constant:
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:
if( !WizardMode && !Verbose && !_klass_is_exact ) break;
case TopPTR:
< prev index next >