Skip to content

Commit a191c58

Browse files
robcaslozTobiHartmann
authored andcommitted
8253404: C2: assert(C->live_nodes() <= C->max_node_limit()) failed: Live Node limit exceeded limit
Record nodes as dead in Node::destruct() if their index cannot be directly reclaimed. This prevents the "Live Node limit exceeded limit" assertion failure by improving the accuracy of Compile::live_nodes() when "hook" nodes in ConvI2LNode::Ideal() are created and deleted non-consecutively. This addition might result in multiple calls to compile::record_dead_node() for the same node (e.g. from PhaseIdealLoop::spinup()), but this is safe, as compile::record_dead_node() is idempotent. Reviewed-by: neliasso, thartmann
1 parent 6bc4931 commit a191c58

File tree

2 files changed

+57
-1
lines changed

2 files changed

+57
-1
lines changed

src/hotspot/share/opto/node.cpp

Lines changed: 4 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -583,10 +583,13 @@ void Node::setup_is_top() {
583583
//------------------------------~Node------------------------------------------
584584
// Fancy destructor; eagerly attempt to reclaim Node numberings and storage
585585
void Node::destruct() {
586-
// Eagerly reclaim unique Node numberings
587586
Compile* compile = Compile::current();
587+
// If this is the most recently created node, reclaim its index. Otherwise,
588+
// record the node as dead to keep liveness information accurate.
588589
if ((uint)_idx+1 == compile->unique()) {
589590
compile->set_unique(compile->unique()-1);
591+
} else {
592+
compile->record_dead_node(_idx);
590593
}
591594
// Clear debug info:
592595
Node_Notes* nn = compile->node_notes_at(_idx);
Lines changed: 53 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,53 @@
1+
/*
2+
* Copyright (c) 2020, 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+
package compiler.conversions;
25+
26+
/*
27+
* @test
28+
* @bug 8253404
29+
* @requires vm.compiler2.enabled
30+
* @summary Tests that the optimization of a chain of integer additions followed
31+
* by a long conversion does not lead to an explosion of live nodes.
32+
* @library /test/lib /
33+
* @run main/othervm -Xcomp -XX:-TieredCompilation
34+
* -XX:CompileOnly=compiler.conversions.TestChainOfIntAddsToLongConversion::main
35+
* -XX:MaxNodeLimit=1000 -XX:NodeLimitFudgeFactor=25
36+
* compiler.conversions.TestChainOfIntAddsToLongConversion
37+
*/
38+
39+
public class TestChainOfIntAddsToLongConversion {
40+
public static void main(String[] args) {
41+
long out = 0;
42+
for (int i = 0; i < 2; i++) {
43+
int foo = i;
44+
for (int j = 0; j < 17; j++) {
45+
// Int addition to be turned into a chain by loop unrolling.
46+
foo = foo + foo;
47+
}
48+
// Int to long conversion.
49+
out = foo;
50+
}
51+
System.out.println(out);
52+
}
53+
}

0 commit comments

Comments
 (0)