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
|