JDK-6805522 : Server VM fails with assertion (block1->start() != block2->start(),"successors have unique bcis")
  • Type: Bug
  • Component: hotspot
  • Sub-Component: compiler
  • Affected Version: hs14
  • Priority: P2
  • Status: Closed
  • Resolution: Fixed
  • OS: generic
  • CPU: generic
  • Submitted: 2009-02-13
  • Updated: 2011-03-07
  • Resolved: 2011-03-07
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 JDK 7 Other
6u14Fixed 7Fixed hs14Fixed
Related Reports
Relates :  
Description
Server VM fails with following assertions when running with fastdebug bits:

#  Internal Error (/BUILD_AREA/jdk7/hotspot/src/share/vm/opto/parse1.cpp:1179), pid=23361, tid=21
#  Error: assert(block1->start() != block2->start(),"successors have unique bcis")

Comments
EVALUATION http://hg.openjdk.java.net/jdk7/hotspot-comp/hotspot/rev/ebebd376f657
23-03-2009

EVALUATION In current codebase (apparently after some refactoring of ciTypeFlow.*), cloning of loop head was implemented in ciTypeFlow::clone_loop_head() method, which does the following transformation: > _______ ______ _______ ______ _______ > | |----->| | | | | |------>| head's| > --->| head | | body | is transformed to: --->| head |---->| body | | clone |----> > |_______|<-----|______| |_______| |______|<------|_______| > (backedge_copy) But current implementation of ciTypeFlow::clone_loop_head() can't correctly transform graphs like this: > _______ ______ > | |----->| | > --->| head |<-----| body | > |_______|<-----|______| Because only _one_ of body's successors is moved to the cloned block: > // tail->head becomes tail->clone > for (SuccIter iter(tail); !iter.done(); iter.next()) { > if (iter.succ() == head) { > iter.set_succ(clone); > break; > } > } Which results in the following graph, where the "body" block breaks the assertion, having two different successors starting at the same bci (see also attached typeflow_run_error.log): > _______ ______ _______ > | |----->| |------>| head | > --->| head | | body | | clone |-----> > |_______|<-----|______|<------|_______| > (backedge_copy)
23-03-2009