United StatesChange Country, Oracle Worldwide Web Sites Communities I am a... I want to...
Bug ID: 6805522 Server VM fails with assertion (block1->start() != block2->start(),"successors have unique bcis")
6805522 : Server VM fails with assertion (block1->start() != block2->start(),"successors have unique bcis")

Details
Type:
Bug
Submit Date:
2009-02-13
Status:
Closed
Updated Date:
2011-03-07
Project Name:
JDK
Resolved Date:
2011-03-07
Component:
hotspot
OS:
generic
Sub-Component:
compiler
CPU:
generic
Priority:
P2
Resolution:
Fixed
Affected Versions:
hs14
Fixed Versions:
hs15

Related Reports
Backport:
Backport:
Backport:
Backport:
Relates:

Sub Tasks

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

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)
                                     
2009-03-23
EVALUATION

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



Hardware and Software, Engineered to Work Together