Skip to content

Commit e4314c1

Browse files
committed
8231405: [Shenandoah] guarantee(d != NULL) failed: Null dominator info
Reviewed-by: shade, rkennke
1 parent 0b88138 commit e4314c1

File tree

2 files changed

+79
-0
lines changed

2 files changed

+79
-0
lines changed

src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp

Lines changed: 12 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1272,6 +1272,18 @@ void ShenandoahBarrierC2Support::pin_and_expand(PhaseIdealLoop* phase) {
12721272
}
12731273
if ((ctrl->is_Proj() && ctrl->in(0)->is_CallJava()) || ctrl->is_CallJava()) {
12741274
CallNode* call = ctrl->is_Proj() ? ctrl->in(0)->as_CallJava() : ctrl->as_CallJava();
1275+
if (call->entry_point() == OptoRuntime::rethrow_stub()) {
1276+
// The rethrow call may have too many projections to be
1277+
// properly handled here. Given there's no reason for a
1278+
// barrier to depend on the call, move it above the call
1279+
if (phase->get_ctrl(val) == ctrl) {
1280+
assert(val->Opcode() == Op_DecodeN, "unexpected node");
1281+
assert(phase->is_dominator(phase->get_ctrl(val->in(1)), call->in(0)), "Load is too low");
1282+
phase->set_ctrl(val, call->in(0));
1283+
}
1284+
phase->set_ctrl(lrb, call->in(0));
1285+
continue;
1286+
}
12751287
CallProjections projs;
12761288
call->extract_projections(&projs, false, false);
12771289

Lines changed: 67 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,67 @@
1+
/*
2+
* Copyright (c) 2019, Red Hat, Inc. 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+
/**
25+
* @test
26+
* @bug 8231405
27+
* @summary barrier expansion breaks if barrier is right after call to rethrow stub
28+
* @key gc
29+
* @requires vm.gc.Shenandoah & !vm.graal.enabled
30+
*
31+
* @run main/othervm -XX:CompileOnly=CallMultipleCatchProjs::test -Xcomp -Xverify:none -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC CallMultipleCatchProjs
32+
*
33+
*/
34+
35+
public class CallMultipleCatchProjs {
36+
private static A field = new A();
37+
38+
public static void main(String[] args) throws Exception {
39+
Exception3 exception3 = new Exception3();
40+
test(new Exception2());
41+
}
42+
43+
static int test(Exception exception) throws Exception {
44+
try {
45+
throw exception;
46+
} catch (Exception1 e1) {
47+
return 1;
48+
} catch (Exception2 e2) {
49+
return field.i + 2;
50+
} catch (Exception3 e3) {
51+
return field.i + 3;
52+
}
53+
}
54+
55+
private static class Exception1 extends Exception {
56+
}
57+
58+
private static class Exception2 extends Exception {
59+
}
60+
61+
private static class Exception3 extends Exception {
62+
}
63+
64+
private static class A {
65+
public int i;
66+
}
67+
}

0 commit comments

Comments
 (0)