JDK-8253404 : C2: assert(C->live_nodes() <= C->max_node_limit()) failed: Live Node limit exceeded limit
  • Type: Bug
  • Component: hotspot
  • Sub-Component: compiler
  • Affected Version: 8,11,12,13,14,15,16
  • Priority: P3
  • Status: Resolved
  • Resolution: Fixed
  • Submitted: 2020-09-21
  • Updated: 2020-12-02
  • Resolved: 2020-10-08
The Version table provides details related to the release that this issue/RFE will be addressed.

Unresolved : Release in which this issue/RFE will be addressed.
Resolved: Release in which this issue/RFE has been resolved.
Fixed : Release in which this issue/RFE has been fixed. The release containing this fix may be available for download as an Early Access Release or a General Availability Release.

To download the current JDK release, click here.
JDK 11 JDK 16
11.0.11-oracleFixed 16 b20Fixed
Related Reports
Relates :  
Relates :  
Description
The attached fuzzer test fails with the following assertion.

To reproduce:
$ java -Xmx1G -Xcomp -Xbatch -XX:-TieredCompilation -XX:CompileOnly=Test Test.java

# A fatal error has been detected by the Java Runtime Environment:
#
#  Internal Error (/home/christian/jdk/open/src/hotspot/share/opto/node.cpp:89), pid=4863, tid=4904
#  assert(C->live_nodes() <= C->max_node_limit()) failed: Live Node limit exceeded limit
#
# JRE version: Java(TM) SE Runtime Environment (16.0) (slowdebug build 16-internal+0-2020-09-01-1328362.christian...)
# Java VM: Java HotSpot(TM) 64-Bit Server VM (slowdebug 16-internal+0-2020-09-01-1328362.christian..., compiled mode, compressed oops, g1 gc, linux-amd64)
# Problematic frame:
# V  [libjvm.so+0xe68f56]  Node::verify_construction()+0x17c
..........
Command Line: -Xmx1G -Xcomp -Xbatch -XX:-TieredCompilation -XX:CompileOnly=Test --add-modules=ALL-DEFAULT jdk.compiler/com.sun.tools.javac.launcher.Main Test.java
..........
Current thread (0x00007f2b6833f3c0):  JavaThread "C2 CompilerThread0" daemon [_thread_in_native, id=4904, stack(0x00007f2b51cfd000,0x00007f2b51dfe000)]


Current CompileTask:
C2:  12460  122    b        Test::vMeth (243 bytes)

Stack: [0x00007f2b51cfd000,0x00007f2b51dfe000],  sp=0x00007f2b51df58d0,  free space=994k
Native frames: (J=compiled Java code, A=aot compiled Java code, j=interpreted, Vv=VM code, C=native code)
V  [libjvm.so+0xe68f56]  Node::verify_construction()+0x17c
V  [libjvm.so+0xe69d08]  Node::Node(unsigned int)+0xb8
V  [libjvm.so+0x41a754]  TypeNode::TypeNode(Type const*, unsigned int)+0x24
V  [libjvm.so+0x6e4da0]  ConvI2LNode::ConvI2LNode(Node*, TypeLong const*)+0x2c
V  [libjvm.so+0x6dfdbc]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x108
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x7202de]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x826
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf14810]  PhaseIterGVN::transform(Node*)+0x9e
V  [libjvm.so+0x6dfdc9]  Compile::constrained_convI2L(PhaseGVN*, Node*, TypeInt const*, Node*)+0x115
V  [libjvm.so+0x720263]  ConvI2LNode::Ideal(PhaseGVN*, bool)+0x7ab
V  [libjvm.so+0xf131f1]  PhaseGVN::apply_ideal(Node*, bool)+0x6f
V  [libjvm.so+0xf14919]  PhaseIterGVN::transform_old(Node*)+0x105
V  [libjvm.so+0xf146a2]  PhaseIterGVN::optimize()+0x148
V  [libjvm.so+0xd218b7]  PhaseIdealLoop::build_and_optimize(LoopOptsMode)+0x1879
...<more frames>...
Comments
Fix Request (11u) This fixes the regression after the fix already backported to 11u. Plus, it keeps codebases in sync. Patch applies cleanly to 11u, new test fails without the fix, passes with it. Patched JDK passes tier{1,2}.
13-11-2020

Changeset: a191c586 Author: Roberto Casta��eda Lozano <roberto.castaneda.lozano@oracle.com> Committer: Tobias Hartmann <thartmann@openjdk.org> Date: 2020-10-08 12:30:38 +0000 URL: https://git.openjdk.java.net/jdk/commit/a191c586
08-10-2020

The problem seems to be introduced by JDK-8217359, which creates "hook" nodes that are only used temporarily but do not reduce the live node counter when they are destructed.
07-10-2020

The failure seems to be caused by the optimization in ConvI2LNode::Ideal() that rewrites ConvI2L(AddI(x, y)) into AddL(ConvI2L(x), ConvI2L(y)) on LP64 environments. This optimization leads to the creation of a huge (but finite) number of ConvI2L nodes. For example, for TestReduced.java, some 130000 nodes are created, where only 102 nodes are live before the optimization triggers. The default max number of live nodes is set to 80000, leading to the failure.
06-10-2020

Attached a manually reduced version (TestReduced.java) of the original test case. Can be reproduced with: java -Xcomp -XX:-TieredCompilation -XX:CompileOnly=TestReduced TestReduced
05-10-2020

ILW = Same as JDK-8237950 = P3
25-09-2020

Could be related to JDK-8237950.
21-09-2020