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 |