Potential scheduling problem with compressed Oops.

Lindenmaier, Goetz goetz.lindenmaier at sap.com
Mon May 3 04:49:09 PDT 2010


we are working on a port of HotSpot for ia64.  Currently, we 
enable this port to support compressed Oops.

I ran into an issue where a Decode node was moved above a safepoint
by the scheduler.  A precedence edge was missing to force the node 
behind the safepoint.
This edge can easily be added if ComputeRegisterAntidependencies()
not only considers AddP in this code: 

     2627     if( n->jvms() ) {           // Precedence edge from derived to safept
     2628       // Check if last_safept_node was moved by pinch-point insertion in anti_do_use()
     2629       if( b->_nodes[last_safept] != last_safept_node ) {
     2630         last_safept = b->find_node(last_safept_node);
     2631       }
     2632       for( uint j=last_safept; j > i; j-- ) {
     2633         Node *mach = b->_nodes[j];
     2634         if( mach->is_Mach() && mach->as_Mach()->ideal_Opcode() == Op_AddP )
     2635           mach->add_prec( n );
     2636       }
     2637       last_safept = i;
     2638       last_safept_node = m;
     2639     }

So I changed the code here to test for Op_DecodeN and our problem 
I want to share this information as I think this can happen on other 
platforms, too.  And it was pretty hard to track down.
We extended the scheduler to consider several blocks, increasing the
situations where nodes can be moved past Safepoints.  But I assume,
a suiting dataflow graph can appear on other platforms, too.  Or is 
there a constraint I missed?


More information about the hotspot-compiler-dev mailing list