JDK-6682236 : C2 hits ideal nodes limit during IGVN optimization with EA
  • Type: Bug
  • Component: hotspot
  • Sub-Component: compiler
  • Affected Version: hs12
  • Priority: P4
  • Status: Closed
  • Resolution: Fixed
  • OS: solaris_10
  • CPU: x86
  • Submitted: 2008-03-31
  • Updated: 2011-04-20
  • Resolved: 2011-04-20
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 6 Other
6u14Fixed hs12Fixed
C2 can reach ideal nodes limit during IGVN optimization with Escape Analysis
since new nodes are added in LoadNode::Ideal() and PhiNode::Ideal() methods
without removing old nodes.

# An unexpected error has been detected by Java Runtime Environment: 
#  Internal Error (/net/jaberwocky/export/home2/work/6259129/src/share/vm/opto/node.cpp:60), pid=25960, tid=23 
#  Error: assert(Compile::current()->unique() < (uint)MaxNodeLimit,"Node limit exceeded") 
# Java VM: Java HotSpot(TM) Server VM (12.0-b01-internal-jvmg compiled mode solaris-x86) 
# If you would like to submit a bug report, please visit: 
#   http://java.sun.com/webapps/bugreport/crash.jsp 
# The crash happened outside the Java Virtual Machine in native code. 
# See problematic frame for where to report the bug. 
---------------  T H R E A D  --------------- 
Current thread (0x0827d800):  JavaThread "CompilerThread1" daemon [_thread_in_native, id=23, stack(0xb5a65000,0xb5aa5000)] 
Stack: [0xb5a65000,0xb5aa5000],  sp=0xb5aa2130,  free space=244k 
Native frames: (J=compiled Java code, j=interpreted, Vv=VM code, C=native code) 
V  [libjvm.so+0x9bb124] void VMError::report(outputStream*) + 0xa64
V  [libjvm.so+0x9bc16b] void VMError::report_and_die() + 0x62b
V  [libjvm.so+0x4c5899] void report_assertion_failure(const char*,int,const char*) + 0x79
V  [libjvm.so+0x7ec28c] void Node::verify_construction() + 0xfc
V  [libjvm.so+0x7ee36a] Node*Node::clone()const + 0x16a
V  [libjvm.so+0x7aa8dd] Node*LoadNode::Ideal(PhaseGVN*,bool) + 0x56d
V  [libjvm.so+0x8606a9] Node*PhaseIterGVN::transform_old(Node*) + 0x299
V  [libjvm.so+0x85fea1] void PhaseIterGVN::optimize() + 0x171
V  [libjvm.so+0x473d11] void Compile::Optimize() + 0x101
V  [libjvm.so+0x4703da] Compile::Compile(ciEnv*,C2Compiler*,ciMethod*,int,bool,bool) + 0xd6a
V  [libjvm.so+0x3ac1bf] void C2Compiler::compile_method(ciEnv*,ciMethod*,int) + 0xaf

EVALUATION I thought I could relay on LoadNode::Identity() call during IGVN optimization to avoid infinite generation of value Phi for an instance field load. But in the failed case it does not happen since the new Load node (from spit through phi) is replaced with a new value Phi again during next invocation of LoadNode::Ideal().