2272 *p_scale *= -1; 2273 *p_offset = exp->in(1); 2274 } 2275 return true; 2276 } 2277 } 2278 return false; 2279 } 2280 2281 // Same as PhaseIdealLoop::duplicate_predicates() but for range checks 2282 // eliminated by iteration splitting. 2283 Node* PhaseIdealLoop::add_range_check_predicate(IdealLoopTree* loop, CountedLoopNode* cl, 2284 Node* predicate_proj, int scale_con, Node* offset, 2285 Node* limit, jint stride_con) { 2286 bool overflow = false; 2287 BoolNode* bol = rc_predicate(loop, predicate_proj, scale_con, offset, cl->init_trip(), NULL, stride_con, limit, (stride_con > 0) != (scale_con > 0), overflow); 2288 Node* opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1)); 2289 register_new_node(opaque_bol, predicate_proj); 2290 IfNode* new_iff = NULL; 2291 if (overflow) { 2292 new_iff = new IfNode(predicate_proj, bol, PROB_MAX, COUNT_UNKNOWN); 2293 } else { 2294 new_iff = new RangeCheckNode(predicate_proj, bol, PROB_MAX, COUNT_UNKNOWN); 2295 } 2296 register_control(new_iff, loop->_parent, predicate_proj); 2297 Node* iffalse = new IfFalseNode(new_iff); 2298 register_control(iffalse, _ltree_root, new_iff); 2299 ProjNode* iftrue = new IfTrueNode(new_iff); 2300 register_control(iftrue, loop->_parent, new_iff); 2301 Node *frame = new ParmNode(C->start(), TypeFunc::FramePtr); 2302 register_new_node(frame, C->start()); 2303 Node* halt = new HaltNode(iffalse, frame); 2304 register_control(halt, _ltree_root, iffalse); 2305 C->root()->add_req(halt); 2306 return iftrue; 2307 } 2308 2309 //------------------------------do_range_check--------------------------------- 2310 // Eliminate range-checks and other trip-counter vs loop-invariant tests. 2311 int PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) { 2312 #ifndef PRODUCT 2313 if (PrintOpto && VerifyLoopOptimizations) { 2314 tty->print("Range Check Elimination "); | 2272 *p_scale *= -1; 2273 *p_offset = exp->in(1); 2274 } 2275 return true; 2276 } 2277 } 2278 return false; 2279 } 2280 2281 // Same as PhaseIdealLoop::duplicate_predicates() but for range checks 2282 // eliminated by iteration splitting. 2283 Node* PhaseIdealLoop::add_range_check_predicate(IdealLoopTree* loop, CountedLoopNode* cl, 2284 Node* predicate_proj, int scale_con, Node* offset, 2285 Node* limit, jint stride_con) { 2286 bool overflow = false; 2287 BoolNode* bol = rc_predicate(loop, predicate_proj, scale_con, offset, cl->init_trip(), NULL, stride_con, limit, (stride_con > 0) != (scale_con > 0), overflow); 2288 Node* opaque_bol = new Opaque4Node(C, bol, _igvn.intcon(1)); 2289 register_new_node(opaque_bol, predicate_proj); 2290 IfNode* new_iff = NULL; 2291 if (overflow) { 2292 new_iff = new IfNode(predicate_proj, opaque_bol, PROB_MAX, COUNT_UNKNOWN); 2293 } else { 2294 new_iff = new RangeCheckNode(predicate_proj, opaque_bol, PROB_MAX, COUNT_UNKNOWN); 2295 } 2296 register_control(new_iff, loop->_parent, predicate_proj); 2297 Node* iffalse = new IfFalseNode(new_iff); 2298 register_control(iffalse, _ltree_root, new_iff); 2299 ProjNode* iftrue = new IfTrueNode(new_iff); 2300 register_control(iftrue, loop->_parent, new_iff); 2301 Node *frame = new ParmNode(C->start(), TypeFunc::FramePtr); 2302 register_new_node(frame, C->start()); 2303 Node* halt = new HaltNode(iffalse, frame); 2304 register_control(halt, _ltree_root, iffalse); 2305 C->root()->add_req(halt); 2306 return iftrue; 2307 } 2308 2309 //------------------------------do_range_check--------------------------------- 2310 // Eliminate range-checks and other trip-counter vs loop-invariant tests. 2311 int PhaseIdealLoop::do_range_check( IdealLoopTree *loop, Node_List &old_new ) { 2312 #ifndef PRODUCT 2313 if (PrintOpto && VerifyLoopOptimizations) { 2314 tty->print("Range Check Elimination "); |