649 Node* pred = use_ctrl; |
649 Node* pred = use_ctrl; |
650 uint if_cnt = 0; |
650 uint if_cnt = 0; |
651 while (if_cnt < if_limit) { |
651 while (if_cnt < if_limit) { |
652 if ((pred->Opcode() == Op_IfTrue || pred->Opcode() == Op_IfFalse)) { |
652 if ((pred->Opcode() == Op_IfTrue || pred->Opcode() == Op_IfFalse)) { |
653 if_cnt++; |
653 if_cnt++; |
654 const TypeInt* if_t = filtered_type_at_if(val, pred); |
654 const TypeInt* if_t = IfNode::filtered_int_type(&_igvn, val, pred); |
655 if (if_t != NULL) { |
655 if (if_t != NULL) { |
656 if (rtn_t == NULL) { |
656 if (rtn_t == NULL) { |
657 rtn_t = if_t; |
657 rtn_t = if_t; |
658 } else { |
658 } else { |
659 rtn_t = rtn_t->join(if_t)->is_int(); |
659 rtn_t = rtn_t->join(if_t)->is_int(); |
671 } |
671 } |
672 } |
672 } |
673 return rtn_t; |
673 return rtn_t; |
674 } |
674 } |
675 |
675 |
676 |
|
677 //------------------------------filtered_type_at_if-------------------------------- |
|
678 // Return a possibly more restrictive type for val based on condition control flow for an if |
|
679 const TypeInt* PhaseIdealLoop::filtered_type_at_if( Node* val, Node *if_proj) { |
|
680 assert(if_proj && |
|
681 (if_proj->Opcode() == Op_IfTrue || if_proj->Opcode() == Op_IfFalse), "expecting an if projection"); |
|
682 if (if_proj->in(0) && if_proj->in(0)->is_If()) { |
|
683 IfNode* iff = if_proj->in(0)->as_If(); |
|
684 if (iff->in(1) && iff->in(1)->is_Bool()) { |
|
685 BoolNode* bol = iff->in(1)->as_Bool(); |
|
686 if (bol->in(1) && bol->in(1)->is_Cmp()) { |
|
687 const CmpNode* cmp = bol->in(1)->as_Cmp(); |
|
688 if (cmp->in(1) == val) { |
|
689 const TypeInt* cmp2_t = _igvn.type(cmp->in(2))->isa_int(); |
|
690 if (cmp2_t != NULL) { |
|
691 jint lo = cmp2_t->_lo; |
|
692 jint hi = cmp2_t->_hi; |
|
693 BoolTest::mask msk = if_proj->Opcode() == Op_IfTrue ? bol->_test._test : bol->_test.negate(); |
|
694 switch (msk) { |
|
695 case BoolTest::ne: |
|
696 // Can't refine type |
|
697 return NULL; |
|
698 case BoolTest::eq: |
|
699 return cmp2_t; |
|
700 case BoolTest::lt: |
|
701 lo = TypeInt::INT->_lo; |
|
702 if (hi - 1 < hi) { |
|
703 hi = hi - 1; |
|
704 } |
|
705 break; |
|
706 case BoolTest::le: |
|
707 lo = TypeInt::INT->_lo; |
|
708 break; |
|
709 case BoolTest::gt: |
|
710 if (lo + 1 > lo) { |
|
711 lo = lo + 1; |
|
712 } |
|
713 hi = TypeInt::INT->_hi; |
|
714 break; |
|
715 case BoolTest::ge: |
|
716 // lo unchanged |
|
717 hi = TypeInt::INT->_hi; |
|
718 break; |
|
719 } |
|
720 const TypeInt* rtn_t = TypeInt::make(lo, hi, cmp2_t->_widen); |
|
721 return rtn_t; |
|
722 } |
|
723 } |
|
724 } |
|
725 } |
|
726 } |
|
727 return NULL; |
|
728 } |
|
729 |
676 |
730 //------------------------------dump_spec-------------------------------------- |
677 //------------------------------dump_spec-------------------------------------- |
731 // Dump special per-node info |
678 // Dump special per-node info |
732 #ifndef PRODUCT |
679 #ifndef PRODUCT |
733 void CountedLoopEndNode::dump_spec(outputStream *st) const { |
680 void CountedLoopEndNode::dump_spec(outputStream *st) const { |