diff --git a/src/hotspot/share/opto/cfgnode.cpp b/src/hotspot/share/opto/cfgnode.cpp index ae5c4a682a9..efa0b55e2c2 100644 --- a/src/hotspot/share/opto/cfgnode.cpp +++ b/src/hotspot/share/opto/cfgnode.cpp @@ -2642,7 +2642,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { } Node* phi = mms.memory(); assert(made_new_phi || phi->in(i) == n, "replace the i-th merge by a slice"); - phi->set_req(i, mms.memory2()); + phi->set_req_X(i, mms.memory2(), phase); } } } @@ -2651,7 +2651,9 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { for (MergeMemStream mms(result); mms.next_non_empty(); ) { Node* phi = mms.memory(); for (uint i = 1; i < req(); ++i) { - if (phi->in(i) == this) phi->set_req(i, phi); + if (phi->in(i) == this) { + phi->set_req_X(i, phi, phase); + } } } } @@ -2673,7 +2675,7 @@ Node *PhiNode::Ideal(PhaseGVN *phase, bool can_reshape) { Node *ii = in(i); Node *new_in = MemNode::optimize_memory_chain(ii, at, nullptr, phase); if (ii != new_in ) { - set_req(i, new_in); + set_req_X(i, new_in, phase); progress = this; } } diff --git a/test/hotspot/jtreg/compiler/igvn/TestNodeWithNoUseAfterPhiIdeal.java b/test/hotspot/jtreg/compiler/igvn/TestNodeWithNoUseAfterPhiIdeal.java new file mode 100644 index 00000000000..b8e2dabc553 --- /dev/null +++ b/test/hotspot/jtreg/compiler/igvn/TestNodeWithNoUseAfterPhiIdeal.java @@ -0,0 +1,89 @@ +/* + * Copyright (c) 2025 IBM Corporation. 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 8373524 + * @summary C2: no reachable node should have no use + * @run main/othervm -Xbatch ${test.main.class} + * @run main ${test.main.class} + */ + +package compiler.igvn; + +public class TestNodeWithNoUseAfterPhiIdeal { + volatile boolean _mutatorToggle; + + boolean _mutatorFlip() { + synchronized (TestNodeWithNoUseAfterPhiIdeal.class) { + _mutatorToggle = new MyBoolean(!_mutatorToggle).v; + return _mutatorToggle; + } + } + + class MyBoolean { + boolean v; + MyBoolean(boolean v) { + int N = 32; + for (int i = 0; i < N; i++) { + this.v = v; + } + } + } + + int[] arr; + void test() { + int limit = 2; + boolean flag1 = _mutatorFlip(); + for (; limit < 4; limit *= 2) { + if (flag1) { + break; + } + } + int zero = 34; + for (int peel = 2; peel < limit; peel++) { + synchronized (TestNodeWithNoUseAfterPhiIdeal.class) { + zero = 0; + } + } + if (zero == 0) { + arr = new int[8]; + } else { + int M = 4; + for (int i = 0; i < M; i++) { + boolean flag2 = _mutatorFlip(); + boolean flag3 = _mutatorFlip(); + if (flag2) { + break; + } + } + } + } + + public static void main(String[] args) { + TestNodeWithNoUseAfterPhiIdeal t = new TestNodeWithNoUseAfterPhiIdeal(); + for (int i = 0; i < 10_000; i++) { + t.test(); + } + } +}