src/share/vm/opto/loopopts.cpp

Print this page




2240 //         :  |     v   v       |
2241 //         :  |  false true     |
2242 //         :  |   |     |       |
2243 //         :  |   v    stmt2    |
2244 //         :  | exitB:  |       |
2245 //         :  | stmt4   v       |
2246 //         :  |       ifA orig  |
2247 //         :  |      /  \       |
2248 //         :  |     /    \      |
2249 //         :  |    v     v      |
2250 //         :  |  false  true    |
2251 //         :  |  /        \     |
2252 //         :  v  v         -----+
2253 //          RegionA
2254 //             |
2255 //             v
2256 //           exitA
2257 //
2258 bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
2259 




2260   LoopNode *head  = loop->_head->as_Loop();
2261 
2262   if (head->is_partial_peel_loop() || head->partial_peel_has_failed()) {
2263     return false;
2264   }
2265 
2266   // Check for complex exit control
2267   for(uint ii = 0; ii < loop->_body.size(); ii++ ) {
2268     Node *n = loop->_body.at(ii);
2269     int opc = n->Opcode();
2270     if (n->is_Call()        ||
2271         opc == Op_Catch     ||
2272         opc == Op_CatchProj ||
2273         opc == Op_Jump      ||
2274         opc == Op_JumpProj) {
2275 #if !defined(PRODUCT)
2276       if (TracePartialPeeling) {
2277         tty->print_cr("\nExit control too complex: lp: %d", head->_idx);
2278       }
2279 #endif




2240 //         :  |     v   v       |
2241 //         :  |  false true     |
2242 //         :  |   |     |       |
2243 //         :  |   v    stmt2    |
2244 //         :  | exitB:  |       |
2245 //         :  | stmt4   v       |
2246 //         :  |       ifA orig  |
2247 //         :  |      /  \       |
2248 //         :  |     /    \      |
2249 //         :  |    v     v      |
2250 //         :  |  false  true    |
2251 //         :  |  /        \     |
2252 //         :  v  v         -----+
2253 //          RegionA
2254 //             |
2255 //             v
2256 //           exitA
2257 //
2258 bool PhaseIdealLoop::partial_peel( IdealLoopTree *loop, Node_List &old_new ) {
2259 
2260   if (!loop->_head->is_Loop()) {
2261     return false; 
2262   }
2263 
2264   LoopNode *head  = loop->_head->as_Loop();
2265 
2266   if (head->is_partial_peel_loop() || head->partial_peel_has_failed()) {
2267     return false;
2268   }
2269 
2270   // Check for complex exit control
2271   for(uint ii = 0; ii < loop->_body.size(); ii++ ) {
2272     Node *n = loop->_body.at(ii);
2273     int opc = n->Opcode();
2274     if (n->is_Call()        ||
2275         opc == Op_Catch     ||
2276         opc == Op_CatchProj ||
2277         opc == Op_Jump      ||
2278         opc == Op_JumpProj) {
2279 #if !defined(PRODUCT)
2280       if (TracePartialPeeling) {
2281         tty->print_cr("\nExit control too complex: lp: %d", head->_idx);
2282       }
2283 #endif