hotspot/src/share/vm/opto/loopnode.cpp
changeset 190 e9a0a9dcd4f6
parent 1 489c9b5090e2
child 212 cd4963e67949
equal deleted inserted replaced
189:4248c8e21063 190:e9a0a9dcd4f6
   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 {