hotspot/src/share/vm/opto/cfgnode.cpp
changeset 2154 72a9b7284ccf
parent 2105 347008ce7984
parent 2131 98f9cef66a34
child 3270 0a2825307027
child 3262 30d1c247fc25
equal deleted inserted replaced
2106:ec595a5e793e 2154:72a9b7284ccf
  1348       n->del_req(i);
  1348       n->del_req(i);
  1349     }
  1349     }
  1350   }
  1350   }
  1351 
  1351 
  1352   // Register the new node but do not transform it.  Cannot transform until the
  1352   // Register the new node but do not transform it.  Cannot transform until the
  1353   // entire Region/Phi conglerate has been hacked as a single huge transform.
  1353   // entire Region/Phi conglomerate has been hacked as a single huge transform.
  1354   igvn->register_new_node_with_optimizer( newn );
  1354   igvn->register_new_node_with_optimizer( newn );
  1355   // Now I can point to the new node.
  1355   // Now I can point to the new node.
  1356   n->add_req(newn);
  1356   n->add_req(newn);
  1357   igvn->_worklist.push(n);
  1357   igvn->_worklist.push(n);
  1358 }
  1358 }
  1379     return NULL;
  1379     return NULL;
  1380 
  1380 
  1381   Node *val = phi->in(i);       // Constant to split for
  1381   Node *val = phi->in(i);       // Constant to split for
  1382   uint hit = 0;                 // Number of times it occurs
  1382   uint hit = 0;                 // Number of times it occurs
  1383 
  1383 
  1384   for( ; i < phi->req(); i++ ){ // Count occurances of constant
  1384   for( ; i < phi->req(); i++ ){ // Count occurrences of constant
  1385     Node *n = phi->in(i);
  1385     Node *n = phi->in(i);
  1386     if( !n ) return NULL;
  1386     if( !n ) return NULL;
  1387     if( phase->type(n) == Type::TOP ) return NULL;
  1387     if( phase->type(n) == Type::TOP ) return NULL;
  1388     if( phi->in(i) == val )
  1388     if( phi->in(i) == val )
  1389       hit++;
  1389       hit++;
  1421   return phi;
  1421   return phi;
  1422 }
  1422 }
  1423 
  1423 
  1424 //=============================================================================
  1424 //=============================================================================
  1425 //------------------------------simple_data_loop_check-------------------------
  1425 //------------------------------simple_data_loop_check-------------------------
  1426 //  Try to determing if the phi node in a simple safe/unsafe data loop.
  1426 //  Try to determining if the phi node in a simple safe/unsafe data loop.
  1427 //  Returns:
  1427 //  Returns:
  1428 // enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
  1428 // enum LoopSafety { Safe = 0, Unsafe, UnsafeLoop };
  1429 // Safe       - safe case when the phi and it's inputs reference only safe data
  1429 // Safe       - safe case when the phi and it's inputs reference only safe data
  1430 //              nodes;
  1430 //              nodes;
  1431 // Unsafe     - the phi and it's inputs reference unsafe data nodes but there
  1431 // Unsafe     - the phi and it's inputs reference unsafe data nodes but there
  1685             Node *m  = phase->transform(n);
  1685             Node *m  = phase->transform(n);
  1686             if (outcnt() == 0) {  // Above transform() may kill us!
  1686             if (outcnt() == 0) {  // Above transform() may kill us!
  1687               progress = phase->C->top();
  1687               progress = phase->C->top();
  1688               break;
  1688               break;
  1689             }
  1689             }
  1690             // If tranformed to a MergeMem, get the desired slice
  1690             // If transformed to a MergeMem, get the desired slice
  1691             // Otherwise the returned node represents memory for every slice
  1691             // Otherwise the returned node represents memory for every slice
  1692             Node *new_mem = (m->is_MergeMem()) ?
  1692             Node *new_mem = (m->is_MergeMem()) ?
  1693                              m->as_MergeMem()->memory_at(alias_idx) : m;
  1693                              m->as_MergeMem()->memory_at(alias_idx) : m;
  1694             // Update input if it is progress over what we have now
  1694             // Update input if it is progress over what we have now
  1695             if (new_mem != ii) {
  1695             if (new_mem != ii) {
  1960       // Rethrows always throw exceptions, never return
  1960       // Rethrows always throw exceptions, never return
  1961       if (call->entry_point() == OptoRuntime::rethrow_stub()) {
  1961       if (call->entry_point() == OptoRuntime::rethrow_stub()) {
  1962         f[CatchProjNode::fall_through_index] = Type::TOP;
  1962         f[CatchProjNode::fall_through_index] = Type::TOP;
  1963       } else if( call->req() > TypeFunc::Parms ) {
  1963       } else if( call->req() > TypeFunc::Parms ) {
  1964         const Type *arg0 = phase->type( call->in(TypeFunc::Parms) );
  1964         const Type *arg0 = phase->type( call->in(TypeFunc::Parms) );
  1965         // Check for null reciever to virtual or interface calls
  1965         // Check for null receiver to virtual or interface calls
  1966         if( call->is_CallDynamicJava() &&
  1966         if( call->is_CallDynamicJava() &&
  1967             arg0->higher_equal(TypePtr::NULL_PTR) ) {
  1967             arg0->higher_equal(TypePtr::NULL_PTR) ) {
  1968           f[CatchProjNode::fall_through_index] = Type::TOP;
  1968           f[CatchProjNode::fall_through_index] = Type::TOP;
  1969         }
  1969         }
  1970       } // End of if not a runtime stub
  1970       } // End of if not a runtime stub
  1993   if (t->field_at(_con) != Type::CONTROL)  return this;
  1993   if (t->field_at(_con) != Type::CONTROL)  return this;
  1994   // If we remove the last CatchProj and elide the Catch/CatchProj, then we
  1994   // If we remove the last CatchProj and elide the Catch/CatchProj, then we
  1995   // also remove any exception table entry.  Thus we must know the call
  1995   // also remove any exception table entry.  Thus we must know the call
  1996   // feeding the Catch will not really throw an exception.  This is ok for
  1996   // feeding the Catch will not really throw an exception.  This is ok for
  1997   // the main fall-thru control (happens when we know a call can never throw
  1997   // the main fall-thru control (happens when we know a call can never throw
  1998   // an exception) or for "rethrow", because a further optimnization will
  1998   // an exception) or for "rethrow", because a further optimization will
  1999   // yank the rethrow (happens when we inline a function that can throw an
  1999   // yank the rethrow (happens when we inline a function that can throw an
  2000   // exception and the caller has no handler).  Not legal, e.g., for passing
  2000   // exception and the caller has no handler).  Not legal, e.g., for passing
  2001   // a NULL receiver to a v-call, or passing bad types to a slow-check-cast.
  2001   // a NULL receiver to a v-call, or passing bad types to a slow-check-cast.
  2002   // These cases MUST throw an exception via the runtime system, so the VM
  2002   // These cases MUST throw an exception via the runtime system, so the VM
  2003   // will be looking for a table entry.
  2003   // will be looking for a table entry.