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

src/share/vm/opto/output.cpp

Print this page




2239       // Also, MachIdealNodes do not get scheduled
2240       if( !n->is_Mach() ) continue;     // Skip non-machine nodes
2241       MachNode *mach = n->as_Mach();
2242       int iop = mach->ideal_Opcode();
2243       if( iop == Op_CreateEx ) continue; // CreateEx is pinned
2244       if( iop == Op_Con ) continue;      // Do not schedule Top
2245       if( iop == Op_Node &&     // Do not schedule PhiNodes, ProjNodes
2246           mach->pipeline() == MachNode::pipeline_class() &&
2247           !n->is_SpillCopy() )  // Breakpoints, Prolog, etc
2248         continue;
2249       break;                    // Funny loop structure to be sure...
2250     }
2251     // Compute last "interesting" instruction in block - last instruction we
2252     // might schedule.  _bb_end points just after last schedulable inst.  We
2253     // normally schedule conditional branches (despite them being forced last
2254     // in the block), because they have delay slots we can fill.  Calls all
2255     // have their delay slots filled in the template expansions, so we don't
2256     // bother scheduling them.
2257     Node *last = bb->_nodes[_bb_end];
2258     if( last->is_Catch() ||
2259        (last->is_Mach() && last->as_Mach()->ideal_Opcode() == Op_Halt) ) {

2260       // There must be a prior call.  Skip it.
2261       while( !bb->_nodes[--_bb_end]->is_Call() ) {
2262         assert( bb->_nodes[_bb_end]->is_Proj(), "skipping projections after expected call" );
2263       }
2264     } else if( last->is_MachNullCheck() ) {
2265       // Backup so the last null-checked memory instruction is
2266       // outside the schedulable range. Skip over the nullcheck,
2267       // projection, and the memory nodes.
2268       Node *mem = last->in(1);
2269       do {
2270         _bb_end--;
2271       } while (mem != bb->_nodes[_bb_end]);
2272     } else {
2273       // Set _bb_end to point after last schedulable inst.
2274       _bb_end++;
2275     }
2276 
2277     assert( _bb_start <= _bb_end, "inverted block ends" );
2278 
2279     // Compute the register antidependencies for the basic block




2239       // Also, MachIdealNodes do not get scheduled
2240       if( !n->is_Mach() ) continue;     // Skip non-machine nodes
2241       MachNode *mach = n->as_Mach();
2242       int iop = mach->ideal_Opcode();
2243       if( iop == Op_CreateEx ) continue; // CreateEx is pinned
2244       if( iop == Op_Con ) continue;      // Do not schedule Top
2245       if( iop == Op_Node &&     // Do not schedule PhiNodes, ProjNodes
2246           mach->pipeline() == MachNode::pipeline_class() &&
2247           !n->is_SpillCopy() )  // Breakpoints, Prolog, etc
2248         continue;
2249       break;                    // Funny loop structure to be sure...
2250     }
2251     // Compute last "interesting" instruction in block - last instruction we
2252     // might schedule.  _bb_end points just after last schedulable inst.  We
2253     // normally schedule conditional branches (despite them being forced last
2254     // in the block), because they have delay slots we can fill.  Calls all
2255     // have their delay slots filled in the template expansions, so we don't
2256     // bother scheduling them.
2257     Node *last = bb->_nodes[_bb_end];
2258     if( last->is_Catch() ||
2259        // Exclude unreachable path case when Halt node is in a separate block.
2260        (_bb_end > 1 && last->is_Mach() && last->as_Mach()->ideal_Opcode() == Op_Halt) ) {
2261       // There must be a prior call.  Skip it.
2262       while( !bb->_nodes[--_bb_end]->is_Call() ) {
2263         assert( bb->_nodes[_bb_end]->is_Proj(), "skipping projections after expected call" );
2264       }
2265     } else if( last->is_MachNullCheck() ) {
2266       // Backup so the last null-checked memory instruction is
2267       // outside the schedulable range. Skip over the nullcheck,
2268       // projection, and the memory nodes.
2269       Node *mem = last->in(1);
2270       do {
2271         _bb_end--;
2272       } while (mem != bb->_nodes[_bb_end]);
2273     } else {
2274       // Set _bb_end to point after last schedulable inst.
2275       _bb_end++;
2276     }
2277 
2278     assert( _bb_start <= _bb_end, "inverted block ends" );
2279 
2280     // Compute the register antidependencies for the basic block


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