src/share/vm/opto/output.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File hotspot Sdiff src/share/vm/opto

src/share/vm/opto/output.cpp

Print this page




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.


src/share/vm/opto/output.cpp
Index Unified diffs Context diffs Sdiffs Patch New Old Previous File Next File