# HG changeset patch # User roland # Date 1569512984 -7200 # Node ID ee34d448e2172e536eaabf76cfc3d55f19ae4419 # Parent 8786c0e9b585592992f330ba6ee011a5347b2405 #8231405: [Shenandoah] guarantee(d != NULL) failed: Null dominator info #Reviewed-by: shade, rkennke diff -r 8786c0e9b585 -r ee34d448e217 src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp --- a/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Fri Aug 02 11:21:41 2019 +0200 +++ b/src/hotspot/share/gc/shenandoah/c2/shenandoahSupport.cpp Thu Sep 26 17:49:44 2019 +0200 @@ -1329,6 +1329,18 @@ } if ((ctrl->is_Proj() && ctrl->in(0)->is_CallJava()) || ctrl->is_CallJava()) { CallNode* call = ctrl->is_Proj() ? ctrl->in(0)->as_CallJava() : ctrl->as_CallJava(); + if (call->entry_point() == OptoRuntime::rethrow_stub()) { + // The rethrow call may have too many projections to be + // properly handled here. Given there's no reason for a + // barrier to depend on the call, move it above the call + if (phase->get_ctrl(val) == ctrl) { + assert(val->Opcode() == Op_DecodeN, "unexpected node"); + assert(phase->is_dominator(phase->get_ctrl(val->in(1)), call->in(0)), "Load is too low"); + phase->set_ctrl(val, call->in(0)); + } + phase->set_ctrl(lrb, call->in(0)); + continue; + } CallProjections projs; call->extract_projections(&projs, false, false); diff -r 8786c0e9b585 -r ee34d448e217 test/hotspot/jtreg/gc/shenandoah/compiler/CallMultipleCatchProjs.java --- /dev/null Thu Jan 01 00:00:00 1970 +0000 +++ b/test/hotspot/jtreg/gc/shenandoah/compiler/CallMultipleCatchProjs.java Thu Sep 26 17:49:44 2019 +0200 @@ -0,0 +1,67 @@ +/* + * Copyright (c) 2019, Red Hat, Inc. All rights reserved. + * DO NOT ALTER OR REMOVE COPYRIGHT NOTICES OR THIS FILE HEADER. + * + * This code is free software; you can redistribute it and/or modify it + * under the terms of the GNU General Public License version 2 only, as + * published by the Free Software Foundation. + * + * This code is distributed in the hope that it will be useful, but WITHOUT + * ANY WARRANTY; without even the implied warranty of MERCHANTABILITY or + * FITNESS FOR A PARTICULAR PURPOSE. See the GNU General Public License + * version 2 for more details (a copy is included in the LICENSE file that + * accompanied this code). + * + * You should have received a copy of the GNU General Public License version + * 2 along with this work; if not, write to the Free Software Foundation, + * Inc., 51 Franklin St, Fifth Floor, Boston, MA 02110-1301 USA. + * + * Please contact Oracle, 500 Oracle Parkway, Redwood Shores, CA 94065 USA + * or visit www.oracle.com if you need additional information or have any + * questions. + */ + +/** + * @test + * @bug 8231405 + * @summary barrier expansion breaks if barrier is right after call to rethrow stub + * @key gc + * @requires vm.gc.Shenandoah & !vm.graal.enabled + * + * @run main/othervm -XX:CompileOnly=CallMultipleCatchProjs::test -Xcomp -Xverify:none -XX:+UnlockExperimentalVMOptions -XX:+UseShenandoahGC CallMultipleCatchProjs + * + */ + +public class CallMultipleCatchProjs { + private static A field = new A(); + + public static void main(String[] args) throws Exception { + Exception3 exception3 = new Exception3(); + test(new Exception2()); + } + + static int test(Exception exception) throws Exception { + try { + throw exception; + } catch (Exception1 e1) { + return 1; + } catch (Exception2 e2) { + return field.i + 2; + } catch (Exception3 e3) { + return field.i + 3; + } + } + + private static class Exception1 extends Exception { + } + + private static class Exception2 extends Exception { + } + + private static class Exception3 extends Exception { + } + + private static class A { + public int i; + } +}