2594 // wrong DEF. This doesn't verify live-ranges that span blocks.
2595
2596 // Check for edge existence. Used to avoid adding redundant precedence edges.
2597 static bool edge_from_to( Node *from, Node *to ) {
2598 for( uint i=0; i<from->len(); i++ )
2599 if( from->in(i) == to )
2600 return true;
2601 return false;
2602 }
2603
2604 #ifdef ASSERT
2605 void Scheduling::verify_do_def( Node *n, OptoReg::Name def, const char *msg ) {
2606 // Check for bad kills
2607 if( OptoReg::is_valid(def) ) { // Ignore stores & control flow
2608 Node *prior_use = _reg_node[def];
2609 if( prior_use && !edge_from_to(prior_use,n) ) {
2610 tty->print("%s = ",OptoReg::as_VMReg(def)->name());
2611 n->dump();
2612 tty->print_cr("...");
2613 prior_use->dump();
2614 assert(edge_from_to(prior_use,n),msg);
2615 }
2616 _reg_node.map(def,NULL); // Kill live USEs
2617 }
2618 }
2619
2620 void Scheduling::verify_good_schedule( Block *b, const char *msg ) {
2621
2622 // Zap to something reasonable for the verify code
2623 _reg_node.clear();
2624
2625 // Walk over the block backwards. Check to make sure each DEF doesn't
2626 // kill a live value (other than the one it's supposed to). Add each
2627 // USE to the live set.
2628 for( uint i = b->number_of_nodes()-1; i >= _bb_start; i-- ) {
2629 Node *n = b->get_node(i);
2630 int n_op = n->Opcode();
2631 if( n_op == Op_MachProj && n->ideal_reg() == MachProjNode::fat_proj ) {
2632 // Fat-proj kills a slew of registers
2633 RegMask rm = n->out_RegMask();// Make local copy
2634 while( rm.is_NotEmpty() ) {
2635 OptoReg::Name kill = rm.find_first_elem();
2636 rm.Remove(kill);
2637 verify_do_def( n, kill, msg );
2638 }
2639 } else if( n_op != Op_Node ) { // Avoid brand new antidependence nodes
2640 // Get DEF'd registers the normal way
2641 verify_do_def( n, _regalloc->get_reg_first(n), msg );
2642 verify_do_def( n, _regalloc->get_reg_second(n), msg );
2643 }
2644
2645 // Now make all USEs live
2646 for( uint i=1; i<n->req(); i++ ) {
2647 Node *def = n->in(i);
2648 assert(def != 0, "input edge required");
2649 OptoReg::Name reg_lo = _regalloc->get_reg_first(def);
2650 OptoReg::Name reg_hi = _regalloc->get_reg_second(def);
2651 if( OptoReg::is_valid(reg_lo) ) {
2652 assert(!_reg_node[reg_lo] || edge_from_to(_reg_node[reg_lo],def), msg);
2653 _reg_node.map(reg_lo,n);
2654 }
2655 if( OptoReg::is_valid(reg_hi) ) {
2656 assert(!_reg_node[reg_hi] || edge_from_to(_reg_node[reg_hi],def), msg);
2657 _reg_node.map(reg_hi,n);
2658 }
2659 }
2660
2661 }
2662
2663 // Zap to something reasonable for the Antidependence code
2664 _reg_node.clear();
2665 }
2666 #endif
2667
2668 // Conditionally add precedence edges. Avoid putting edges on Projs.
2669 static void add_prec_edge_from_to( Node *from, Node *to ) {
2670 if( from->is_Proj() ) { // Put precedence edge on Proj's input
2671 assert( from->req() == 1 && (from->len() == 1 || from->in(1)==0), "no precedence edges on projections" );
2672 from = from->in(0);
2673 }
2674 if( from != to && // No cycles (for things like LD L0,[L0+4] )
2675 !edge_from_to( from, to ) ) // Avoid duplicate edge
2676 from->add_prec(to);
|
2594 // wrong DEF. This doesn't verify live-ranges that span blocks.
2595
2596 // Check for edge existence. Used to avoid adding redundant precedence edges.
2597 static bool edge_from_to( Node *from, Node *to ) {
2598 for( uint i=0; i<from->len(); i++ )
2599 if( from->in(i) == to )
2600 return true;
2601 return false;
2602 }
2603
2604 #ifdef ASSERT
2605 void Scheduling::verify_do_def( Node *n, OptoReg::Name def, const char *msg ) {
2606 // Check for bad kills
2607 if( OptoReg::is_valid(def) ) { // Ignore stores & control flow
2608 Node *prior_use = _reg_node[def];
2609 if( prior_use && !edge_from_to(prior_use,n) ) {
2610 tty->print("%s = ",OptoReg::as_VMReg(def)->name());
2611 n->dump();
2612 tty->print_cr("...");
2613 prior_use->dump();
2614 assert(edge_from_to(prior_use,n), "%s", msg);
2615 }
2616 _reg_node.map(def,NULL); // Kill live USEs
2617 }
2618 }
2619
2620 void Scheduling::verify_good_schedule( Block *b, const char *msg ) {
2621
2622 // Zap to something reasonable for the verify code
2623 _reg_node.clear();
2624
2625 // Walk over the block backwards. Check to make sure each DEF doesn't
2626 // kill a live value (other than the one it's supposed to). Add each
2627 // USE to the live set.
2628 for( uint i = b->number_of_nodes()-1; i >= _bb_start; i-- ) {
2629 Node *n = b->get_node(i);
2630 int n_op = n->Opcode();
2631 if( n_op == Op_MachProj && n->ideal_reg() == MachProjNode::fat_proj ) {
2632 // Fat-proj kills a slew of registers
2633 RegMask rm = n->out_RegMask();// Make local copy
2634 while( rm.is_NotEmpty() ) {
2635 OptoReg::Name kill = rm.find_first_elem();
2636 rm.Remove(kill);
2637 verify_do_def( n, kill, msg );
2638 }
2639 } else if( n_op != Op_Node ) { // Avoid brand new antidependence nodes
2640 // Get DEF'd registers the normal way
2641 verify_do_def( n, _regalloc->get_reg_first(n), msg );
2642 verify_do_def( n, _regalloc->get_reg_second(n), msg );
2643 }
2644
2645 // Now make all USEs live
2646 for( uint i=1; i<n->req(); i++ ) {
2647 Node *def = n->in(i);
2648 assert(def != 0, "input edge required");
2649 OptoReg::Name reg_lo = _regalloc->get_reg_first(def);
2650 OptoReg::Name reg_hi = _regalloc->get_reg_second(def);
2651 if( OptoReg::is_valid(reg_lo) ) {
2652 assert(!_reg_node[reg_lo] || edge_from_to(_reg_node[reg_lo],def), "%s", msg);
2653 _reg_node.map(reg_lo,n);
2654 }
2655 if( OptoReg::is_valid(reg_hi) ) {
2656 assert(!_reg_node[reg_hi] || edge_from_to(_reg_node[reg_hi],def), "%s", msg);
2657 _reg_node.map(reg_hi,n);
2658 }
2659 }
2660
2661 }
2662
2663 // Zap to something reasonable for the Antidependence code
2664 _reg_node.clear();
2665 }
2666 #endif
2667
2668 // Conditionally add precedence edges. Avoid putting edges on Projs.
2669 static void add_prec_edge_from_to( Node *from, Node *to ) {
2670 if( from->is_Proj() ) { // Put precedence edge on Proj's input
2671 assert( from->req() == 1 && (from->len() == 1 || from->in(1)==0), "no precedence edges on projections" );
2672 from = from->in(0);
2673 }
2674 if( from != to && // No cycles (for things like LD L0,[L0+4] )
2675 !edge_from_to( from, to ) ) // Avoid duplicate edge
2676 from->add_prec(to);
|