< prev index next >

src/hotspot/share/opto/loopTransform.cpp

Print this page




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 ");


< prev index next >