Skip to content

Commit 83f3d42

Browse files
committedNov 6, 2024
8339303: C2: dead node after failing to match cloned address expression
Reviewed-by: vlivanov, kvn
1 parent ead0116 commit 83f3d42

File tree

3 files changed

+70
-6
lines changed

3 files changed

+70
-6
lines changed
 

‎src/hotspot/cpu/x86/x86.ad

+2-1
Original file line numberDiff line numberDiff line change
@@ -2512,11 +2512,12 @@ bool Matcher::pd_clone_address_expressions(AddPNode* m, Matcher::MStack& mstack,
25122512
address_visited.test_set(m->_idx); // Flag as address_visited
25132513
Node *adr = m->in(AddPNode::Address);
25142514

2515-
// Intel can handle 2 adds in addressing mode
2515+
// Intel can handle 2 adds in addressing mode, with one of them using an immediate offset.
25162516
// AtomicAdd is not an addressing expression.
25172517
// Cheap to find it by looking for screwy base.
25182518
if (adr->is_AddP() &&
25192519
!adr->in(AddPNode::Base)->is_top() &&
2520+
!adr->in(AddPNode::Offset)->is_Con() &&
25202521
LP64_ONLY( off->get_long() == (int) (off->get_long()) && ) // immL32
25212522
// Are there other uses besides address expressions?
25222523
!is_visited(adr)) {

‎src/hotspot/share/opto/matcher.cpp

+7-5
Original file line numberDiff line numberDiff line change
@@ -170,17 +170,19 @@ void Matcher::verify_new_nodes_only(Node* xroot) {
170170
worklist.push(xroot);
171171
while (worklist.size() > 0) {
172172
Node* n = worklist.pop();
173-
visited.set(n->_idx);
173+
if (visited.test_set(n->_idx)) {
174+
continue;
175+
}
174176
assert(C->node_arena()->contains(n), "dead node");
175177
for (uint j = 0; j < n->req(); j++) {
176178
Node* in = n->in(j);
177179
if (in != nullptr) {
178-
assert(C->node_arena()->contains(in), "dead node");
179-
if (!visited.test(in->_idx)) {
180-
worklist.push(in);
181-
}
180+
worklist.push(in);
182181
}
183182
}
183+
for (DUIterator_Fast jmax, j = n->fast_outs(jmax); j < jmax; j++) {
184+
worklist.push(n->fast_out(j));
185+
}
184186
}
185187
}
186188
#endif
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,61 @@
1+
/*
2+
* Copyright (c) 2024, 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+
/**
25+
* @test
26+
* @bug 8339303
27+
* @summary Test that the matcher does not create dead nodes when matching
28+
* address expressions with two immediate offsets.
29+
* @requires os.maxMemory > 4G
30+
*
31+
* @run main/othervm -Xmx4g -Xbatch -XX:-TieredCompilation
32+
* -XX:CompileOnly=compiler.c2.TestMatcherTwoImmOffsets::test
33+
* compiler.c2.TestMatcherTwoImmOffsets
34+
*/
35+
36+
package compiler.c2;
37+
38+
public class TestMatcherTwoImmOffsets {
39+
static final int[] a1 = new int[10];
40+
int[] a2;
41+
static TestMatcherTwoImmOffsets o = new TestMatcherTwoImmOffsets();
42+
43+
public static void test() {
44+
for (int i = 0; i < 10; i++) {
45+
for (int j = 0; j < 100; j++) {
46+
int[][] nArray = new int[10][];
47+
for (int k = 0; k < nArray.length; k++) {}
48+
}
49+
for (long j = 1L; j < 3L; j++) {
50+
a1[(int) j]--;
51+
}
52+
o.a2 = a1;
53+
}
54+
}
55+
56+
public static void main(String[] args) {
57+
for (int i = 0; i < 10; i++) {
58+
test();
59+
}
60+
}
61+
}

0 commit comments

Comments
 (0)
Please sign in to comment.