8339939: [JVMCI] Don't compress abstract and interface Klasses

Co-authored-by: Doug Simon <dnsimon@openjdk.org>
Reviewed-by: dnsimon
This commit is contained in:
Yudi Zheng 2024-10-28 12:39:04 +00:00
parent a5ad974bec
commit d5fb6b4a3c
7 changed files with 72 additions and 8 deletions

View File

@ -343,6 +343,7 @@ narrowKlass CodeInstaller::record_narrow_metadata_reference(CodeSection* section
int index = _oop_recorder->find_index(klass);
section->relocate(dest, metadata_Relocation::spec(index));
JVMCI_event_3("narrowKlass[%d of %d] = %s", index, _oop_recorder->metadata_count(), klass->name()->as_C_string());
guarantee(CompressedKlassPointers::is_encodable(klass), "klass cannot be compressed: %s", klass->external_name());
return CompressedKlassPointers::encode(klass);
}
#endif

View File

@ -51,13 +51,17 @@ final class DirectHotSpotObjectConstantImpl extends HotSpotObjectConstantImpl {
@Override
public JavaConstant compress() {
assert !compressed;
if (compressed) {
throw new IllegalArgumentException("already compressed: " + this);
}
return new DirectHotSpotObjectConstantImpl(object, true);
}
@Override
public JavaConstant uncompress() {
assert compressed;
if (!compressed) {
throw new IllegalArgumentException("not compressed: " + this);
}
return new DirectHotSpotObjectConstantImpl(object, false);
}

View File

@ -51,9 +51,14 @@ public final class HotSpotCompressedNullConstant implements JavaConstant, HotSpo
return true;
}
@Override
public boolean isCompressible() {
return false;
}
@Override
public Constant compress() {
throw new IllegalArgumentException();
throw new IllegalArgumentException("not compressible");
}
@Override

View File

@ -25,13 +25,34 @@ package jdk.vm.ci.hotspot;
import jdk.vm.ci.meta.Constant;
/**
* Marker interface for hotspot specific constants.
* A value in a space managed by Hotspot (e.g. heap or metaspace).
* Some of these values can be referenced with a compressed pointer
* instead of a full word-sized pointer.
*/
public interface HotSpotConstant extends Constant {
/**
* Determines if this constant is compressed.
*/
boolean isCompressed();
/**
* Determines if this constant is compressible.
*/
boolean isCompressible();
/**
* Gets a compressed version of this uncompressed constant.
*
* @throws IllegalArgumentException if this constant is not compressible
*/
Constant compress();
/**
* Gets an uncompressed version of this compressed constant.
*
* @throws IllegalArgumentException if this is an uncompressed constant
* or this constant is not compressible
*/
Constant uncompress();
}

View File

@ -43,6 +43,9 @@ final class HotSpotMetaspaceConstantImpl implements HotSpotMetaspaceConstant, VM
private HotSpotMetaspaceConstantImpl(MetaspaceObject metaspaceObject, boolean compressed) {
this.metaspaceObject = metaspaceObject;
this.compressed = compressed;
if (compressed && !canBeStoredInCompressibleMetaSpace()) {
throw new IllegalArgumentException("constant cannot be compressed: " + metaspaceObject);
}
}
@Override
@ -83,9 +86,28 @@ final class HotSpotMetaspaceConstantImpl implements HotSpotMetaspaceConstant, VM
return compressed;
}
@Override
public boolean isCompressible() {
if (compressed) {
return false;
}
return canBeStoredInCompressibleMetaSpace();
}
private boolean canBeStoredInCompressibleMetaSpace() {
if (metaspaceObject instanceof HotSpotResolvedJavaType t && !t.isArray()) {
// As of JDK-8338526, interface and abstract types are not stored
// in compressible metaspace.
return !t.isInterface() && !t.isAbstract();
}
return true;
}
@Override
public Constant compress() {
assert !isCompressed();
if (compressed) {
throw new IllegalArgumentException("already compressed: " + this);
}
HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceObject, true);
assert res.isCompressed();
return res;
@ -93,7 +115,9 @@ final class HotSpotMetaspaceConstantImpl implements HotSpotMetaspaceConstant, VM
@Override
public Constant uncompress() {
assert isCompressed();
if (!compressed) {
throw new IllegalArgumentException("not compressed: " + this);
}
HotSpotMetaspaceConstantImpl res = HotSpotMetaspaceConstantImpl.forMetaspaceObject(metaspaceObject, false);
assert !res.isCompressed();
return res;

View File

@ -52,6 +52,11 @@ abstract class HotSpotObjectConstantImpl implements HotSpotObjectConstant {
return compressed;
}
@Override
public boolean isCompressible() {
return !compressed;
}
@Override
public abstract JavaConstant compress();

View File

@ -164,13 +164,17 @@ final class IndirectHotSpotObjectConstantImpl extends HotSpotObjectConstantImpl
@Override
public JavaConstant compress() {
assert !compressed;
if (compressed) {
throw new IllegalArgumentException("already compressed: " + this);
}
return new IndirectHotSpotObjectConstantImpl(this, true);
}
@Override
public JavaConstant uncompress() {
assert compressed;
if (!compressed) {
throw new IllegalArgumentException("not compressed: " + this);
}
return new IndirectHotSpotObjectConstantImpl(this, false);
}