Skip to content

Commit 44e3a85

Browse files
committed
[JDK-8343584] Array types are considered non-abstract.
PullRequest: graal/19224
2 parents 5e91993 + 901a4b0 commit 44e3a85

File tree

4 files changed

+46
-3
lines changed

4 files changed

+46
-3
lines changed

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/HotSpotCompressedKlassPointerTest.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -59,12 +59,27 @@ public static boolean instanceOfComparable(Object o) {
5959
return o instanceof Comparable;
6060
}
6161

62+
// Array of non-abstract class
63+
public static boolean instanceOfIntegerArray(Object o) {
64+
return o instanceof Integer[];
65+
}
66+
67+
// Array of abstract class
68+
public static boolean instanceOfNumberArray(Object o) {
69+
return o instanceof Number[];
70+
}
71+
72+
// Array of interface
73+
public static boolean instanceOfComparableArray(Object o) {
74+
return o instanceof Comparable[];
75+
}
76+
6277
private void assertNoCompressedInterfaceOrAbstractClassConstant(String methodName) {
6378
StructuredGraph graph = getFinalGraph(methodName);
6479
for (ConstantNode constantNode : graph.getNodes().filter(ConstantNode.class)) {
6580
if (constantNode.asConstant() instanceof HotSpotMetaspaceConstant mc && mc.isCompressed()) {
6681
ResolvedJavaType type = mc.asResolvedJavaType();
67-
assertFalse(type.isInterface() || type.isAbstract(), "As of JDK-8338526, interface and abstract types are not compressible.");
82+
assertFalse(!type.isArray() && (type.isInterface() || type.isAbstract()), "As of JDK-8338526, interface and abstract types are not compressible.");
6883
}
6984
}
7085
}
@@ -74,5 +89,8 @@ public void testInstanceOf() {
7489
assertNoCompressedInterfaceOrAbstractClassConstant("instanceOfInteger");
7590
assertNoCompressedInterfaceOrAbstractClassConstant("instanceOfNumber");
7691
assertNoCompressedInterfaceOrAbstractClassConstant("instanceOfComparable");
92+
assertNoCompressedInterfaceOrAbstractClassConstant("instanceOfIntegerArray");
93+
assertNoCompressedInterfaceOrAbstractClassConstant("instanceOfNumberArray");
94+
assertNoCompressedInterfaceOrAbstractClassConstant("instanceOfComparableArray");
7795
}
7896
}

compiler/src/jdk.graal.compiler.test/src/jdk/graal/compiler/hotspot/test/SecondarySupersLookupTest.java

Lines changed: 25 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -273,4 +273,29 @@ public void testHashCollision() {
273273
test("instanceOfI34", obj60);
274274
test("instanceOfI60", obj08);
275275
}
276+
277+
public static boolean instanceOfI08Array(Object o) {
278+
return o instanceof I08[];
279+
}
280+
281+
public static boolean instanceOfI34Array(Object o) {
282+
return o instanceof I08[];
283+
}
284+
285+
public static boolean instanceOfI60Array(Object o) {
286+
return o instanceof I08[];
287+
}
288+
289+
@Test
290+
public void testInterfaceArray() {
291+
Object i08 = new I08[0];
292+
test("instanceOfI08Array", i08);
293+
test("instanceOfI34Array", i08);
294+
test("instanceOfI60Array", i08);
295+
296+
Object i60 = new I60[0];
297+
test("instanceOfI08Array", i60);
298+
test("instanceOfI34Array", i60);
299+
test("instanceOfI60Array", i60);
300+
}
276301
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/nodes/HotSpotCompressionNode.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ public boolean isCompressible(Constant constant) {
7777
if (JavaVersionUtil.JAVA_SPEC >= 24 && constant instanceof HotSpotMetaspaceConstant mc) {
7878
ResolvedJavaType type = mc.asResolvedJavaType();
7979
// As of JDK-8338526, interface and abstract types are not compressible.
80-
return !type.isAbstract() && !type.isInterface();
80+
return type.isArray() || (!type.isAbstract() && !type.isInterface());
8181
}
8282
return true;
8383
}

compiler/src/jdk.graal.compiler/src/jdk/graal/compiler/hotspot/replacements/InstanceOfSnippets.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -313,7 +313,7 @@ protected Arguments makeArguments(InstanceOfUsageReplacer replacer, LoweringTool
313313
args.add("object", object);
314314
args.addVarargs("hints", KlassPointer.class, KlassPointerStamp.klassNonNull(), hints.hubs);
315315
args.addVarargs("hintIsPositive", boolean.class, StampFactory.forKind(JavaKind.Boolean), hints.isPositive);
316-
args.addConst("isHubAbstract", type.isAbstract() || type.isInterface());
316+
args.addConst("isHubAbstract", !type.isArray() && (type.isAbstract() || type.isInterface()));
317317
}
318318
args.add("trueValue", replacer.trueValue);
319319
args.add("falseValue", replacer.falseValue);

0 commit comments

Comments
 (0)