2458 _next_node->_idx, _bundle_instr_count);
2459 }
2460 #endif
2461 step_and_clear();
2462 }
2463
2464 // Leave untouched the starting instruction, any Phis, a CreateEx node
2465 // or Top. bb->get_node(_bb_start) is the first schedulable instruction.
2466 _bb_end = bb->number_of_nodes()-1;
2467 for( _bb_start=1; _bb_start <= _bb_end; _bb_start++ ) {
2468 Node *n = bb->get_node(_bb_start);
2469 // Things not matched, like Phinodes and ProjNodes don't get scheduled.
2470 // Also, MachIdealNodes do not get scheduled
2471 if( !n->is_Mach() ) continue; // Skip non-machine nodes
2472 MachNode *mach = n->as_Mach();
2473 int iop = mach->ideal_Opcode();
2474 if( iop == Op_CreateEx ) continue; // CreateEx is pinned
2475 if( iop == Op_Con ) continue; // Do not schedule Top
2476 if( iop == Op_Node && // Do not schedule PhiNodes, ProjNodes
2477 mach->pipeline() == MachNode::pipeline_class() &&
2478 !n->is_SpillCopy() ) // Breakpoints, Prolog, etc
2479 continue;
2480 break; // Funny loop structure to be sure...
2481 }
2482 // Compute last "interesting" instruction in block - last instruction we
2483 // might schedule. _bb_end points just after last schedulable inst. We
2484 // normally schedule conditional branches (despite them being forced last
2485 // in the block), because they have delay slots we can fill. Calls all
2486 // have their delay slots filled in the template expansions, so we don't
2487 // bother scheduling them.
2488 Node *last = bb->get_node(_bb_end);
2489 // Ignore trailing NOPs.
2490 while (_bb_end > 0 && last->is_Mach() &&
2491 last->as_Mach()->ideal_Opcode() == Op_Con) {
2492 last = bb->get_node(--_bb_end);
2493 }
2494 assert(!last->is_Mach() || last->as_Mach()->ideal_Opcode() != Op_Con, "");
2495 if( last->is_Catch() ||
2496 // Exclude unreachable path case when Halt node is in a separate block.
2497 (_bb_end > 1 && last->is_Mach() && last->as_Mach()->ideal_Opcode() == Op_Halt) ) {
2498 // There must be a prior call. Skip it.
|
2458 _next_node->_idx, _bundle_instr_count);
2459 }
2460 #endif
2461 step_and_clear();
2462 }
2463
2464 // Leave untouched the starting instruction, any Phis, a CreateEx node
2465 // or Top. bb->get_node(_bb_start) is the first schedulable instruction.
2466 _bb_end = bb->number_of_nodes()-1;
2467 for( _bb_start=1; _bb_start <= _bb_end; _bb_start++ ) {
2468 Node *n = bb->get_node(_bb_start);
2469 // Things not matched, like Phinodes and ProjNodes don't get scheduled.
2470 // Also, MachIdealNodes do not get scheduled
2471 if( !n->is_Mach() ) continue; // Skip non-machine nodes
2472 MachNode *mach = n->as_Mach();
2473 int iop = mach->ideal_Opcode();
2474 if( iop == Op_CreateEx ) continue; // CreateEx is pinned
2475 if( iop == Op_Con ) continue; // Do not schedule Top
2476 if( iop == Op_Node && // Do not schedule PhiNodes, ProjNodes
2477 mach->pipeline() == MachNode::pipeline_class() &&
2478 !n->is_SpillCopy() && !n->is_MachMerge() ) // Breakpoints, Prolog, etc
2479 continue;
2480 break; // Funny loop structure to be sure...
2481 }
2482 // Compute last "interesting" instruction in block - last instruction we
2483 // might schedule. _bb_end points just after last schedulable inst. We
2484 // normally schedule conditional branches (despite them being forced last
2485 // in the block), because they have delay slots we can fill. Calls all
2486 // have their delay slots filled in the template expansions, so we don't
2487 // bother scheduling them.
2488 Node *last = bb->get_node(_bb_end);
2489 // Ignore trailing NOPs.
2490 while (_bb_end > 0 && last->is_Mach() &&
2491 last->as_Mach()->ideal_Opcode() == Op_Con) {
2492 last = bb->get_node(--_bb_end);
2493 }
2494 assert(!last->is_Mach() || last->as_Mach()->ideal_Opcode() != Op_Con, "");
2495 if( last->is_Catch() ||
2496 // Exclude unreachable path case when Halt node is in a separate block.
2497 (_bb_end > 1 && last->is_Mach() && last->as_Mach()->ideal_Opcode() == Op_Halt) ) {
2498 // There must be a prior call. Skip it.
|