Skip to content

Commit 2d47319

Browse files
committed
8348631: Crash in PredictedCallGenerator::generate after JDK-8347006
Reviewed-by: chagedorn Backport-of: 55c3e78
1 parent 612ae73 commit 2d47319

File tree

4 files changed

+79
-1
lines changed

4 files changed

+79
-1
lines changed

src/hotspot/share/opto/callGenerator.cpp

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -933,6 +933,9 @@ JVMState* PredictedCallGenerator::generate(JVMState* jvms) {
933933

934934
// Make the hot call:
935935
JVMState* new_jvms = _if_hit->generate(kit.sync_jvms());
936+
if (kit.failing()) {
937+
return nullptr;
938+
}
936939
if (new_jvms == nullptr) {
937940
// Inline failed, so make a direct call.
938941
assert(_if_hit->is_inline(), "must have been a failed inline");
@@ -1260,6 +1263,9 @@ JVMState* PredicatedIntrinsicGenerator::generate(JVMState* jvms) {
12601263
PreserveJVMState pjvms(&kit);
12611264
// Generate intrinsic code:
12621265
JVMState* new_jvms = _intrinsic->generate(kit.sync_jvms());
1266+
if (kit.failing()) {
1267+
return nullptr;
1268+
}
12631269
if (new_jvms == nullptr) {
12641270
// Intrinsic failed, use normal compilation path for this predicate.
12651271
slow_region->add_req(kit.control());

src/hotspot/share/opto/library_call.cpp

Lines changed: 6 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -4309,7 +4309,12 @@ Node* LibraryCallKit::generate_array_guard_common(Node* kls, RegionNode* region,
43094309
if (obj != nullptr && is_array_ctrl != nullptr && is_array_ctrl != top()) {
43104310
// Keep track of the fact that 'obj' is an array to prevent
43114311
// array specific accesses from floating above the guard.
4312-
*obj = _gvn.transform(new CastPPNode(is_array_ctrl, *obj, TypeAryPtr::BOTTOM));
4312+
Node* cast = _gvn.transform(new CastPPNode(is_array_ctrl, *obj, TypeAryPtr::BOTTOM));
4313+
// Check for top because in rare cases, the type system can determine that
4314+
// the object can't be an array but the layout helper check is not folded.
4315+
if (!cast->is_top()) {
4316+
*obj = cast;
4317+
}
43134318
}
43144319
return ctrl;
43154320
}

src/hotspot/share/opto/library_call.hpp

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -106,6 +106,10 @@ class LibraryCallKit : public GraphKit {
106106
void push_result() {
107107
// Push the result onto the stack.
108108
if (!stopped() && result() != nullptr) {
109+
if (result()->is_top()) {
110+
assert(false, "Can't determine return value.");
111+
C->record_method_not_compilable("Can't determine return value.");
112+
}
109113
BasicType bt = result()->bottom_type()->basic_type();
110114
push_node(bt, result());
111115
}
Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,63 @@
1+
/*
2+
* Copyright (c) 2025, Oracle and/or its affiliates. All rights reserved.
3+
* DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER.
4+
*
5+
* This code is free software; you can redistribute it and/or modify it
6+
* under the terms of the GNU General Public License version 2 only, as
7+
* published by the Free Software Foundation.
8+
*
9+
* This code is distributed in the hope that it will be useful, but WITHOUT
10+
* ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or
11+
* FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License
12+
* version 2 for more details (a copy is included in the LICENSE file that
13+
* accompanied this code).
14+
*
15+
* You should have received a copy of the GNU General Public License version
16+
* 2 along with this work; if not, write to the Free Software Foundation,
17+
* Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA.
18+
*
19+
* Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA
20+
* or visit www.oracle.com if you need additional information or have any
21+
* questions.
22+
*/
23+
24+
import java.lang.reflect.Array;
25+
import jdk.test.lib.Asserts;
26+
27+
/**
28+
* @test
29+
* @bug 8348631
30+
* @summary Test folding of array guards used by intrinsics.
31+
* @library /test/lib
32+
* @run main/othervm -Xcomp -XX:-TieredCompilation
33+
* -XX:CompileCommand=compileonly,TestArrayGuardWithInterfaces::test*
34+
* TestArrayGuardWithInterfaces
35+
*/
36+
public class TestArrayGuardWithInterfaces {
37+
38+
public static interface MyInterface { }
39+
40+
public static int test1(Object obj) {
41+
// Should be folded, arrays can never imlement 'MyInterface'
42+
return Array.getLength((MyInterface)obj);
43+
}
44+
45+
public static int test2(Object obj) {
46+
// Should not be folded, arrays implement 'Cloneable'
47+
return Array.getLength((Cloneable)obj);
48+
}
49+
50+
public static void main(String[] args) {
51+
// Warmup
52+
Class c = MyInterface.class;
53+
Array.getLength(args);
54+
55+
try {
56+
test1(null);
57+
throw new RuntimeException("No exception thrown");
58+
} catch (Exception e) {
59+
// Expected
60+
}
61+
Asserts.assertEQ(test2(new int[1]), 1);
62+
}
63+
}

0 commit comments

Comments
 (0)