Request for reviews (S): 6791852: assert(b->_nodes[insidx] == n,"got insidx set incorrectly")

Tom Rodriguez Thomas.Rodriguez at Sun.COM
Fri Feb 6 11:31:56 PST 2009


ifg.cpp:

I think I would have preferred if this were simply done as part of the  
backwards walk during ifg construction, so that there's no extra  
work.  This adds an extra pass over every block that almost never does  
anything.  I guess it's more clear this way.

The loop bounds are a little strange.  I think it should either be

+     for( uint insidx = last_phi + 1; insidx < last_inst; insidx++ ) {
+       Node *ex = b->_nodes[insidx];
+       if( ex->is_Mach() &&
+           ex->as_Mach()->ideal_Opcode() == Op_CreateEx ) {
+         b->_nodes.remove(insidx);
+         b->_nodes.insert(last_phi, ex);
+         break;
+       }
+     }

or

+     for( uint insidx = last_phi; insidx < last_inst; insidx++ ) {
+       Node *ex = b->_nodes[insidx];
+       if (ex->is_Mach() &&
+           ex->as_Mach()->ideal_Opcode() == Op_CreateEx ) {
+         if( insidx > last_phi) {
+           b->_nodes.remove(insidx);
+           b->_nodes.insert(last_phi, ex);
+         }
+         break;
+       }
+     }

Actually what about this:

      for( uint insidx = last_phi; insidx < last_inst; insidx++ ) {
        Node *ex = b->_nodes[insidx];
        if (ex->is_SpillCopy()) continue;
        if (insidx > last_phi && ex->is_Mach() &&
            ex->as_Mach()->ideal_Opcode() == Op_CreateEx) {
          // If the CreateEx isn't above all the MachSpillCopies
	 // then move it to the top
          b->_nodes.remove(insidx);
          b->_nodes.insert(last_phi, ex);
        }
        // Stop once a CreateEx or any other node is found
        break;
      }

This way we only scan as much as needed.

Can you correct the name of last_phi?  It's described as the index of  
that last_phi but it's actually the index of the first node after the  
phis.  Maybe first_inst instead?

Otherwise it looks good.

tom

On Feb 6, 2009, at 10:35 AM, Vladimir Kozlov wrote:

> http://cr.openjdk.java.net/~kvn/6791852/webrev.00
>
> Fixed 6791852: assert(b->_nodes[insidx] == n,"got insidx set  
> incorrectly")
>
> Problem:
> The code in PhaseChaitin::Split() in the part "Handle Crossing HRP  
> Boundry"
> expects that a new MachSpillCopy node is inserted before the current  
> node.
> After 6782232 fix it is not true if the current node is CreateEx.
>
> Solution:
> Remove the original fix for 6782232 in PhaseChaitin::insert_proj().
> Move the CreateEx up before each round of IFG construction to produce
> correct interference graph.
> Move verification checks in chaitin after IFG construction.
> Add additional check into PhaseCFG::verify().
> Fix check in PhaseChaitin::verify_base_ptrs().
>
> Reviewed by:
>
> Fix verified (y/n): y, bug's test case
>
> Other testing:
> JPRT, CTW (with -XX:+VerifyRegisterAllocator)
>




More information about the hotspot-compiler-dev mailing list