hotspot/src/share/vm/opto/loopTransform.cpp
changeset 1432 44f076e3d2a4
parent 1399 9648dfd4ce09
child 1433 ee60bd139c07
equal deleted inserted replaced
1404:4a969f79e3e6 1432:44f076e3d2a4
   677   clone_loop( loop, old_new, dd_main_exit );
   677   clone_loop( loop, old_new, dd_main_exit );
   678   assert( old_new[main_end ->_idx]->Opcode() == Op_CountedLoopEnd, "" );
   678   assert( old_new[main_end ->_idx]->Opcode() == Op_CountedLoopEnd, "" );
   679   CountedLoopNode *post_head = old_new[main_head->_idx]->as_CountedLoop();
   679   CountedLoopNode *post_head = old_new[main_head->_idx]->as_CountedLoop();
   680   post_head->set_post_loop(main_head);
   680   post_head->set_post_loop(main_head);
   681 
   681 
       
   682   // Reduce the post-loop trip count.
       
   683   CountedLoopEndNode* post_end = old_new[main_end ->_idx]->as_CountedLoopEnd();
       
   684   post_end->_prob = PROB_FAIR;
       
   685 
   682   // Build the main-loop normal exit.
   686   // Build the main-loop normal exit.
   683   IfFalseNode *new_main_exit = new (C, 1) IfFalseNode(main_end);
   687   IfFalseNode *new_main_exit = new (C, 1) IfFalseNode(main_end);
   684   _igvn.register_new_node_with_optimizer( new_main_exit );
   688   _igvn.register_new_node_with_optimizer( new_main_exit );
   685   set_idom(new_main_exit, main_end, dd_main_exit );
   689   set_idom(new_main_exit, main_end, dd_main_exit );
   686   set_loop(new_main_exit, loop->_parent);
   690   set_loop(new_main_exit, loop->_parent);
   746   CountedLoopNode*    pre_head = old_new[main_head->_idx]->as_CountedLoop();
   750   CountedLoopNode*    pre_head = old_new[main_head->_idx]->as_CountedLoop();
   747   CountedLoopEndNode* pre_end  = old_new[main_end ->_idx]->as_CountedLoopEnd();
   751   CountedLoopEndNode* pre_end  = old_new[main_end ->_idx]->as_CountedLoopEnd();
   748   pre_head->set_pre_loop(main_head);
   752   pre_head->set_pre_loop(main_head);
   749   Node *pre_incr = old_new[incr->_idx];
   753   Node *pre_incr = old_new[incr->_idx];
   750 
   754 
       
   755   // Reduce the pre-loop trip count.
       
   756   pre_end->_prob = PROB_FAIR;
       
   757 
   751   // Find the pre-loop normal exit.
   758   // Find the pre-loop normal exit.
   752   Node* pre_exit = pre_end->proj_out(false);
   759   Node* pre_exit = pre_end->proj_out(false);
   753   assert( pre_exit->Opcode() == Op_IfFalse, "" );
   760   assert( pre_exit->Opcode() == Op_IfFalse, "" );
   754   IfFalseNode *new_pre_exit = new (C, 1) IfFalseNode(pre_end);
   761   IfFalseNode *new_pre_exit = new (C, 1) IfFalseNode(pre_end);
   755   _igvn.register_new_node_with_optimizer( new_pre_exit );
   762   _igvn.register_new_node_with_optimizer( new_pre_exit );
   765   Node *min_bol  = new (C, 2) BoolNode( min_cmp, b_test );
   772   Node *min_bol  = new (C, 2) BoolNode( min_cmp, b_test );
   766   register_new_node( min_opaq, new_pre_exit );
   773   register_new_node( min_opaq, new_pre_exit );
   767   register_new_node( min_cmp , new_pre_exit );
   774   register_new_node( min_cmp , new_pre_exit );
   768   register_new_node( min_bol , new_pre_exit );
   775   register_new_node( min_bol , new_pre_exit );
   769 
   776 
   770   // Build the IfNode
   777   // Build the IfNode (assume the main-loop is executed always).
   771   IfNode *min_iff = new (C, 2) IfNode( new_pre_exit, min_bol, PROB_FAIR, COUNT_UNKNOWN );
   778   IfNode *min_iff = new (C, 2) IfNode( new_pre_exit, min_bol, PROB_ALWAYS, COUNT_UNKNOWN );
   772   _igvn.register_new_node_with_optimizer( min_iff );
   779   _igvn.register_new_node_with_optimizer( min_iff );
   773   set_idom(min_iff, new_pre_exit, dd_main_head);
   780   set_idom(min_iff, new_pre_exit, dd_main_head);
   774   set_loop(min_iff, loop->_parent);
   781   set_loop(min_iff, loop->_parent);
   775 
   782 
   776   // Plug in the false-path, taken if we need to skip main-loop
   783   // Plug in the false-path, taken if we need to skip main-loop