< prev index next >

src/hotspot/share/opto/loopopts.cpp

Print this page




1019 #endif
1020       }
1021     }
1022   }
1023   return true;
1024 }
1025 
1026 
1027 //------------------------------place_near_use---------------------------------
1028 // Place some computation next to use but not inside inner loops.
1029 // For inner loop uses move it to the preheader area.
1030 Node *PhaseIdealLoop::place_near_use( Node *useblock ) const {
1031   IdealLoopTree *u_loop = get_loop( useblock );
1032   return (u_loop->_irreducible || u_loop->_child)
1033     ? useblock
1034     : u_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl);
1035 }
1036 
1037 
1038 bool PhaseIdealLoop::identical_backtoback_ifs(Node *n) {
1039   if (!n->is_If()) {
1040     return false;
1041   }
1042   if (!n->in(0)->is_Region()) {
1043     return false;
1044   }
1045   Node* region = n->in(0);
1046   Node* dom = idom(region);
1047   if (!dom->is_If() || dom->in(1) != n->in(1)) {
1048     return false;
1049   }
1050   IfNode* dom_if = dom->as_If();
1051   Node* proj_true = dom_if->proj_out(1);
1052   Node* proj_false = dom_if->proj_out(0);
1053 
1054   for (uint i = 1; i < region->req(); i++) {
1055     if (is_dominator(proj_true, region->in(i))) {
1056       continue;
1057     }
1058     if (is_dominator(proj_false, region->in(i))) {
1059       continue;




1019 #endif
1020       }
1021     }
1022   }
1023   return true;
1024 }
1025 
1026 
1027 //------------------------------place_near_use---------------------------------
1028 // Place some computation next to use but not inside inner loops.
1029 // For inner loop uses move it to the preheader area.
1030 Node *PhaseIdealLoop::place_near_use( Node *useblock ) const {
1031   IdealLoopTree *u_loop = get_loop( useblock );
1032   return (u_loop->_irreducible || u_loop->_child)
1033     ? useblock
1034     : u_loop->_head->as_Loop()->skip_strip_mined()->in(LoopNode::EntryControl);
1035 }
1036 
1037 
1038 bool PhaseIdealLoop::identical_backtoback_ifs(Node *n) {
1039   if (!n->is_If() || n->is_CountedLoopEnd()) {
1040     return false;
1041   }
1042   if (!n->in(0)->is_Region()) {
1043     return false;
1044   }
1045   Node* region = n->in(0);
1046   Node* dom = idom(region);
1047   if (!dom->is_If() || dom->in(1) != n->in(1)) {
1048     return false;
1049   }
1050   IfNode* dom_if = dom->as_If();
1051   Node* proj_true = dom_if->proj_out(1);
1052   Node* proj_false = dom_if->proj_out(0);
1053 
1054   for (uint i = 1; i < region->req(); i++) {
1055     if (is_dominator(proj_true, region->in(i))) {
1056       continue;
1057     }
1058     if (is_dominator(proj_false, region->in(i))) {
1059       continue;


< prev index next >