hotspot/src/share/vm/opto/loopPredicate.cpp
changeset 9446 748a37b25d10
parent 9437 9981851b4b8c
child 10253 35b975b1e8f3
equal deleted inserted replaced
9445:af37395bda58 9446:748a37b25d10
   339   Node* old_entry = iff->in(0);
   339   Node* old_entry = iff->in(0);
   340 
   340 
   341   // Cut predicate from old place.
   341   // Cut predicate from old place.
   342   Node* old = predicate_proj;
   342   Node* old = predicate_proj;
   343   igvn->_worklist.push(old);
   343   igvn->_worklist.push(old);
   344   for (DUIterator_Last imin, i = old->last_outs(imin); i >= imin; ) {
   344   for (DUIterator_Last imin, i = old->last_outs(imin); i >= imin;) {
   345     Node* use = old->last_out(i);  // for each use...
   345     Node* use = old->last_out(i);  // for each use...
   346     igvn->hash_delete(use);
   346     igvn->hash_delete(use);
   347     igvn->_worklist.push(use);
   347     igvn->_worklist.push(use);
   348     // Update use-def info
   348     // Update use-def info
   349     uint uses_found = 0;
   349     uint uses_found = 0;
   382   return predicate_proj;
   382   return predicate_proj;
   383 }
   383 }
   384 
   384 
   385 //--------------------------clone_loop_predicates-----------------------
   385 //--------------------------clone_loop_predicates-----------------------
   386 // Interface from IGVN
   386 // Interface from IGVN
   387 Node* PhaseIterGVN::clone_loop_predicates(Node* old_entry, Node* new_entry) {
   387 Node* PhaseIterGVN::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) {
   388   return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, false, NULL, this);
   388   return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, false, clone_limit_check, NULL, this);
   389 }
   389 }
   390 Node* PhaseIterGVN::move_loop_predicates(Node* old_entry, Node* new_entry) {
   390 Node* PhaseIterGVN::move_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) {
   391   return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, true, NULL, this);
   391   return PhaseIdealLoop::clone_loop_predicates(old_entry, new_entry, true, clone_limit_check, NULL, this);
   392 }
   392 }
   393 
   393 
   394 // Interface from PhaseIdealLoop
   394 // Interface from PhaseIdealLoop
   395 Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry) {
   395 Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) {
   396   return clone_loop_predicates(old_entry, new_entry, false, this, &this->_igvn);
   396   return clone_loop_predicates(old_entry, new_entry, false, clone_limit_check, this, &this->_igvn);
   397 }
   397 }
   398 Node* PhaseIdealLoop::move_loop_predicates(Node* old_entry, Node* new_entry) {
   398 Node* PhaseIdealLoop::move_loop_predicates(Node* old_entry, Node* new_entry, bool clone_limit_check) {
   399   return clone_loop_predicates(old_entry, new_entry, true, this, &this->_igvn);
   399   return clone_loop_predicates(old_entry, new_entry, true, clone_limit_check, this, &this->_igvn);
   400 }
   400 }
   401 
   401 
   402 // Clone loop predicates to cloned loops (peeled, unswitched, split_if).
   402 // Clone loop predicates to cloned loops (peeled, unswitched, split_if).
   403 Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry,
   403 Node* PhaseIdealLoop::clone_loop_predicates(Node* old_entry, Node* new_entry,
   404                                                 bool move_predicates,
   404                                                 bool move_predicates,
       
   405                                                 bool clone_limit_check,
   405                                                 PhaseIdealLoop* loop_phase,
   406                                                 PhaseIdealLoop* loop_phase,
   406                                                 PhaseIterGVN* igvn) {
   407                                                 PhaseIterGVN* igvn) {
   407 #ifdef ASSERT
   408 #ifdef ASSERT
   408   if (new_entry == NULL || !(new_entry->is_Proj() || new_entry->is_Region() || new_entry->is_SafePoint())) {
   409   if (new_entry == NULL || !(new_entry->is_Proj() || new_entry->is_Region() || new_entry->is_SafePoint())) {
   409     if (new_entry != NULL)
   410     if (new_entry != NULL)
   411     assert(false, "not IfTrue, IfFalse, Region or SafePoint");
   412     assert(false, "not IfTrue, IfFalse, Region or SafePoint");
   412   }
   413   }
   413 #endif
   414 #endif
   414   // Search original predicates
   415   // Search original predicates
   415   Node* entry = old_entry;
   416   Node* entry = old_entry;
       
   417   ProjNode* limit_check_proj = NULL;
       
   418   if (LoopLimitCheck) {
       
   419     limit_check_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check);
       
   420     if (limit_check_proj != NULL) {
       
   421       entry = entry->in(0)->in(0);
       
   422     }
       
   423   }
   416   if (UseLoopPredicate) {
   424   if (UseLoopPredicate) {
   417     ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   425     ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   418     if (predicate_proj != NULL) { // right pattern that can be used by loop predication
   426     if (predicate_proj != NULL) { // right pattern that can be used by loop predication
   419       assert(entry->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be");
       
   420       if (move_predicates) {
   427       if (move_predicates) {
   421         new_entry =  move_predicate(predicate_proj, new_entry,
   428         new_entry =  move_predicate(predicate_proj, new_entry,
   422                                     Deoptimization::Reason_predicate,
   429                                     Deoptimization::Reason_predicate,
   423                                     loop_phase, igvn);
   430                                     loop_phase, igvn);
   424         assert(new_entry == predicate_proj, "old predicate fall through projection");
   431         assert(new_entry == predicate_proj, "old predicate fall through projection");
   433         tty->print_cr("Loop Predicate %s: ", move_predicates ? "moved" : "cloned");
   440         tty->print_cr("Loop Predicate %s: ", move_predicates ? "moved" : "cloned");
   434         debug_only( new_entry->in(0)->dump(); )
   441         debug_only( new_entry->in(0)->dump(); )
   435       }
   442       }
   436     }
   443     }
   437   }
   444   }
       
   445   if (limit_check_proj != NULL && clone_limit_check) {
       
   446     // Clone loop limit check last to insert it before loop.
       
   447     // Don't clone a limit check which was already finalized
       
   448     // for this counted loop (only one limit check is needed).
       
   449     if (move_predicates) {
       
   450       new_entry =  move_predicate(limit_check_proj, new_entry,
       
   451                                   Deoptimization::Reason_loop_limit_check,
       
   452                                   loop_phase, igvn);
       
   453       assert(new_entry == limit_check_proj, "old limit check fall through projection");
       
   454     } else {
       
   455       new_entry = clone_predicate(limit_check_proj, new_entry,
       
   456                                   Deoptimization::Reason_loop_limit_check,
       
   457                                   loop_phase, igvn);
       
   458       assert(new_entry != NULL && new_entry->is_Proj(), "IfTrue or IfFalse after clone limit check");
       
   459     }
       
   460     if (TraceLoopLimitCheck) {
       
   461       tty->print_cr("Loop Limit Check %s: ", move_predicates ? "moved" : "cloned");
       
   462       debug_only( new_entry->in(0)->dump(); )
       
   463     }
       
   464   }
   438   return new_entry;
   465   return new_entry;
   439 }
   466 }
   440 
   467 
   441 //--------------------------eliminate_loop_predicates-----------------------
   468 //--------------------------eliminate_loop_predicates-----------------------
   442 void PhaseIdealLoop::eliminate_loop_predicates(Node* entry) {
   469 void PhaseIdealLoop::eliminate_loop_predicates(Node* entry) {
       
   470   if (LoopLimitCheck) {
       
   471     Node* predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check);
       
   472     if (predicate != NULL) {
       
   473       entry = entry->in(0)->in(0);
       
   474     }
       
   475   }
   443   if (UseLoopPredicate) {
   476   if (UseLoopPredicate) {
   444     ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   477     ProjNode* predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   445     if (predicate_proj != NULL) { // right pattern that can be used by loop predication
   478     if (predicate_proj != NULL) { // right pattern that can be used by loop predication
   446       Node* n = entry->in(0)->in(1)->in(1);
   479       Node* n = entry->in(0)->in(1)->in(1);
   447       assert(n->Opcode()==Op_Opaque1, "must be");
   480       assert(n->Opcode()==Op_Opaque1, "must be");
   454 
   487 
   455 //--------------------------skip_loop_predicates------------------------------
   488 //--------------------------skip_loop_predicates------------------------------
   456 // Skip related predicates.
   489 // Skip related predicates.
   457 Node* PhaseIdealLoop::skip_loop_predicates(Node* entry) {
   490 Node* PhaseIdealLoop::skip_loop_predicates(Node* entry) {
   458   Node* predicate = NULL;
   491   Node* predicate = NULL;
       
   492   if (LoopLimitCheck) {
       
   493     predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check);
       
   494     if (predicate != NULL) {
       
   495       entry = entry->in(0)->in(0);
       
   496     }
       
   497   }
   459   if (UseLoopPredicate) {
   498   if (UseLoopPredicate) {
   460     predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   499     predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   461     if (predicate != NULL) { // right pattern that can be used by loop predication
   500     if (predicate != NULL) { // right pattern that can be used by loop predication
   462       assert(entry->is_Proj() && entry->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be");
       
   463       IfNode* iff = entry->in(0)->as_If();
   501       IfNode* iff = entry->in(0)->as_If();
   464       ProjNode* uncommon_proj = iff->proj_out(1 - entry->as_Proj()->_con);
   502       ProjNode* uncommon_proj = iff->proj_out(1 - entry->as_Proj()->_con);
   465       Node* rgn = uncommon_proj->unique_ctrl_out();
   503       Node* rgn = uncommon_proj->unique_ctrl_out();
   466       assert(rgn->is_Region() || rgn->is_Call(), "must be a region or call uct");
   504       assert(rgn->is_Region() || rgn->is_Call(), "must be a region or call uct");
   467       entry = entry->in(0)->in(0);
   505       entry = entry->in(0)->in(0);
   489 
   527 
   490 //--------------------------find_predicate------------------------------------
   528 //--------------------------find_predicate------------------------------------
   491 // Find a predicate
   529 // Find a predicate
   492 Node* PhaseIdealLoop::find_predicate(Node* entry) {
   530 Node* PhaseIdealLoop::find_predicate(Node* entry) {
   493   Node* predicate = NULL;
   531   Node* predicate = NULL;
       
   532   if (LoopLimitCheck) {
       
   533     predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check);
       
   534     if (predicate != NULL) { // right pattern that can be used by loop predication
       
   535       return entry;
       
   536     }
       
   537   }
   494   if (UseLoopPredicate) {
   538   if (UseLoopPredicate) {
   495     predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   539     predicate = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   496     if (predicate != NULL) { // right pattern that can be used by loop predication
   540     if (predicate != NULL) { // right pattern that can be used by loop predication
   497       assert(entry->in(0)->in(1)->in(1)->Opcode()==Op_Opaque1, "must be");
       
   498       return entry;
   541       return entry;
   499     }
   542     }
   500   }
   543   }
   501   return NULL;
   544   return NULL;
   502 }
   545 }
   656     return false;
   699     return false;
   657   }
   700   }
   658   Node* range = cmp->in(2);
   701   Node* range = cmp->in(2);
   659   if (range->Opcode() != Op_LoadRange) {
   702   if (range->Opcode() != Op_LoadRange) {
   660     const TypeInt* tint = phase->_igvn.type(range)->isa_int();
   703     const TypeInt* tint = phase->_igvn.type(range)->isa_int();
   661     if (!OptimizeFill || tint == NULL || tint->empty() || tint->_lo < 0) {
   704     if (tint == NULL || tint->empty() || tint->_lo < 0) {
   662       // Allow predication on positive values that aren't LoadRanges.
   705       // Allow predication on positive values that aren't LoadRanges.
   663       // This allows optimization of loops where the length of the
   706       // This allows optimization of loops where the length of the
   664       // array is a known value and doesn't need to be loaded back
   707       // array is a known value and doesn't need to be loaded back
   665       // from the array.
   708       // from the array.
   666       return false;
   709       return false;
   694 // There are two cases for max(scale*i + offset):
   737 // There are two cases for max(scale*i + offset):
   695 // (1) stride*scale > 0
   738 // (1) stride*scale > 0
   696 //   max(scale*i + offset) = scale*(limit-stride) + offset
   739 //   max(scale*i + offset) = scale*(limit-stride) + offset
   697 // (2) stride*scale < 0
   740 // (2) stride*scale < 0
   698 //   max(scale*i + offset) = scale*init + offset
   741 //   max(scale*i + offset) = scale*init + offset
   699 BoolNode* PhaseIdealLoop::rc_predicate(Node* ctrl,
   742 BoolNode* PhaseIdealLoop::rc_predicate(IdealLoopTree *loop, Node* ctrl,
   700                                        int scale, Node* offset,
   743                                        int scale, Node* offset,
   701                                        Node* init, Node* limit, Node* stride,
   744                                        Node* init, Node* limit, Node* stride,
   702                                        Node* range, bool upper) {
   745                                        Node* range, bool upper) {
   703   stringStream* predString = NULL;
   746   stringStream* predString = NULL;
   704   if (TraceLoopPredicate) {
   747   if (TraceLoopPredicate) {
   707   }
   750   }
   708 
   751 
   709   Node* max_idx_expr  = init;
   752   Node* max_idx_expr  = init;
   710   int stride_con = stride->get_int();
   753   int stride_con = stride->get_int();
   711   if ((stride_con > 0) == (scale > 0) == upper) {
   754   if ((stride_con > 0) == (scale > 0) == upper) {
   712     max_idx_expr = new (C, 3) SubINode(limit, stride);
   755     if (LoopLimitCheck) {
   713     register_new_node(max_idx_expr, ctrl);
   756       // With LoopLimitCheck limit is not exact.
   714     if (TraceLoopPredicate) predString->print("(limit - stride) ");
   757       // Calculate exact limit here.
       
   758       // Note, counted loop's test is '<' or '>'.
       
   759       limit = exact_limit(loop);
       
   760       max_idx_expr = new (C, 3) SubINode(limit, stride);
       
   761       register_new_node(max_idx_expr, ctrl);
       
   762       if (TraceLoopPredicate) predString->print("(limit - stride) ");
       
   763     } else {
       
   764       max_idx_expr = new (C, 3) SubINode(limit, stride);
       
   765       register_new_node(max_idx_expr, ctrl);
       
   766       if (TraceLoopPredicate) predString->print("(limit - stride) ");
       
   767     }
   715   } else {
   768   } else {
   716     if (TraceLoopPredicate) predString->print("init ");
   769     if (TraceLoopPredicate) predString->print("init ");
   717   }
   770   }
   718 
   771 
   719   if (scale != 1) {
   772   if (scale != 1) {
   750 
   803 
   751   if (!loop->_head->is_Loop()) {
   804   if (!loop->_head->is_Loop()) {
   752     // Could be a simple region when irreducible loops are present.
   805     // Could be a simple region when irreducible loops are present.
   753     return false;
   806     return false;
   754   }
   807   }
   755 
   808   LoopNode* head = loop->_head->as_Loop();
   756   if (loop->_head->unique_ctrl_out()->Opcode() == Op_NeverBranch) {
   809 
       
   810   if (head->unique_ctrl_out()->Opcode() == Op_NeverBranch) {
   757     // do nothing for infinite loops
   811     // do nothing for infinite loops
   758     return false;
   812     return false;
   759   }
   813   }
   760 
   814 
   761   CountedLoopNode *cl = NULL;
   815   CountedLoopNode *cl = NULL;
   762   if (loop->_head->is_CountedLoop()) {
   816   if (head->is_CountedLoop()) {
   763     cl = loop->_head->as_CountedLoop();
   817     cl = head->as_CountedLoop();
   764     // do nothing for iteration-splitted loops
   818     // do nothing for iteration-splitted loops
   765     if (!cl->is_normal_loop()) return false;
   819     if (!cl->is_normal_loop()) return false;
   766   }
   820   }
   767 
   821 
   768   LoopNode *lpn  = loop->_head->as_Loop();
   822   Node* entry = head->in(LoopNode::EntryControl);
   769   Node* entry = lpn->in(LoopNode::EntryControl);
   823   ProjNode *predicate_proj = NULL;
   770 
   824   // Loop limit check predicate should be near the loop.
   771   ProjNode *predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   825   if (LoopLimitCheck) {
       
   826     predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_loop_limit_check);
       
   827     if (predicate_proj != NULL)
       
   828       entry = predicate_proj->in(0)->in(0);
       
   829   }
       
   830 
       
   831   predicate_proj = find_predicate_insertion_point(entry, Deoptimization::Reason_predicate);
   772   if (!predicate_proj) {
   832   if (!predicate_proj) {
   773 #ifndef PRODUCT
   833 #ifndef PRODUCT
   774     if (TraceLoopPredicate) {
   834     if (TraceLoopPredicate) {
   775       tty->print("missing predicate:");
   835       tty->print("missing predicate:");
   776       loop->dump_head();
   836       loop->dump_head();
   777       lpn->dump(1);
   837       head->dump(1);
   778     }
   838     }
   779 #endif
   839 #endif
   780     return false;
   840     return false;
   781   }
   841   }
   782   ConNode* zero = _igvn.intcon(0);
   842   ConNode* zero = _igvn.intcon(0);
   786   Invariance invar(area, loop);
   846   Invariance invar(area, loop);
   787 
   847 
   788   // Create list of if-projs such that a newer proj dominates all older
   848   // Create list of if-projs such that a newer proj dominates all older
   789   // projs in the list, and they all dominate loop->tail()
   849   // projs in the list, and they all dominate loop->tail()
   790   Node_List if_proj_list(area);
   850   Node_List if_proj_list(area);
   791   LoopNode *head  = loop->_head->as_Loop();
       
   792   Node *current_proj = loop->tail(); //start from tail
   851   Node *current_proj = loop->tail(); //start from tail
   793   while (current_proj != head) {
   852   while (current_proj != head) {
   794     if (loop == get_loop(current_proj) && // still in the loop ?
   853     if (loop == get_loop(current_proj) && // still in the loop ?
   795         current_proj->is_Proj()        && // is a projection  ?
   854         current_proj->is_Proj()        && // is a projection  ?
   796         current_proj->in(0)->Opcode() == Op_If) { // is a if projection ?
   855         current_proj->in(0)->Opcode() == Op_If) { // is a if projection ?
   860 
   919 
   861       // Range check for counted loops
   920       // Range check for counted loops
   862       const Node*    cmp    = bol->in(1)->as_Cmp();
   921       const Node*    cmp    = bol->in(1)->as_Cmp();
   863       Node*          idx    = cmp->in(1);
   922       Node*          idx    = cmp->in(1);
   864       assert(!invar.is_invariant(idx), "index is variant");
   923       assert(!invar.is_invariant(idx), "index is variant");
   865       assert(cmp->in(2)->Opcode() == Op_LoadRange || OptimizeFill, "must be");
       
   866       Node* rng = cmp->in(2);
   924       Node* rng = cmp->in(2);
       
   925       assert(rng->Opcode() == Op_LoadRange || _igvn.type(rng)->is_int() >= 0, "must be");
   867       assert(invar.is_invariant(rng), "range must be invariant");
   926       assert(invar.is_invariant(rng), "range must be invariant");
   868       int scale    = 1;
   927       int scale    = 1;
   869       Node* offset = zero;
   928       Node* offset = zero;
   870       bool ok = is_scaled_iv_plus_offset(idx, cl->phi(), &scale, &offset);
   929       bool ok = is_scaled_iv_plus_offset(idx, cl->phi(), &scale, &offset);
   871       assert(ok, "must be index expression");
   930       assert(ok, "must be index expression");
   890         assert(invar.is_invariant(offset), "offset must be loop invariant");
   949         assert(invar.is_invariant(offset), "offset must be loop invariant");
   891         offset = invar.clone(offset, ctrl);
   950         offset = invar.clone(offset, ctrl);
   892       }
   951       }
   893 
   952 
   894       // Test the lower bound
   953       // Test the lower bound
   895       Node*  lower_bound_bol = rc_predicate(ctrl, scale, offset, init, limit, stride, rng, false);
   954       Node*  lower_bound_bol = rc_predicate(loop, ctrl, scale, offset, init, limit, stride, rng, false);
   896       IfNode* lower_bound_iff = lower_bound_proj->in(0)->as_If();
   955       IfNode* lower_bound_iff = lower_bound_proj->in(0)->as_If();
   897       _igvn.hash_delete(lower_bound_iff);
   956       _igvn.hash_delete(lower_bound_iff);
   898       lower_bound_iff->set_req(1, lower_bound_bol);
   957       lower_bound_iff->set_req(1, lower_bound_bol);
   899       if (TraceLoopPredicate) tty->print_cr("lower bound check if: %d", lower_bound_iff->_idx);
   958       if (TraceLoopPredicate) tty->print_cr("lower bound check if: %d", lower_bound_iff->_idx);
   900 
   959 
   901       // Test the upper bound
   960       // Test the upper bound
   902       Node* upper_bound_bol = rc_predicate(ctrl, scale, offset, init, limit, stride, rng, true);
   961       Node* upper_bound_bol = rc_predicate(loop, ctrl, scale, offset, init, limit, stride, rng, true);
   903       IfNode* upper_bound_iff = upper_bound_proj->in(0)->as_If();
   962       IfNode* upper_bound_iff = upper_bound_proj->in(0)->as_If();
   904       _igvn.hash_delete(upper_bound_iff);
   963       _igvn.hash_delete(upper_bound_iff);
   905       upper_bound_iff->set_req(1, upper_bound_bol);
   964       upper_bound_iff->set_req(1, upper_bound_bol);
   906       if (TraceLoopPredicate) tty->print_cr("upper bound check if: %d", lower_bound_iff->_idx);
   965       if (TraceLoopPredicate) tty->print_cr("upper bound check if: %d", lower_bound_iff->_idx);
   907 
   966