1421 // See if this happens to be a base. |
1421 // See if this happens to be a base. |
1422 // NOTE: we use TypePtr instead of TypeOopPtr because we can have |
1422 // NOTE: we use TypePtr instead of TypeOopPtr because we can have |
1423 // pointers derived from NULL! These are always along paths that |
1423 // pointers derived from NULL! These are always along paths that |
1424 // can't happen at run-time but the optimizer cannot deduce it so |
1424 // can't happen at run-time but the optimizer cannot deduce it so |
1425 // we have to handle it gracefully. |
1425 // we have to handle it gracefully. |
|
1426 assert(!derived->bottom_type()->isa_narrowoop() || |
|
1427 derived->bottom_type()->make_ptr()->is_ptr()->_offset == 0, "sanity"); |
1426 const TypePtr *tj = derived->bottom_type()->isa_ptr(); |
1428 const TypePtr *tj = derived->bottom_type()->isa_ptr(); |
1427 // If its an OOP with a non-zero offset, then it is derived. |
1429 // If its an OOP with a non-zero offset, then it is derived. |
1428 if( tj->_offset == 0 ) { |
1430 if( tj == NULL || tj->_offset == 0 ) { |
1429 derived_base_map[derived->_idx] = derived; |
1431 derived_base_map[derived->_idx] = derived; |
1430 return derived; |
1432 return derived; |
1431 } |
1433 } |
1432 // Derived is NULL+offset? Base is NULL! |
1434 // Derived is NULL+offset? Base is NULL! |
1433 if( derived->is_Con() ) { |
1435 if( derived->is_Con() ) { |
1434 Node *base = new (C, 1) ConPNode( TypePtr::NULL_PTR ); |
1436 Node *base = _matcher.mach_null(); |
1435 uint no_lidx = 0; // an unmatched constant in debug info has no LRG |
1437 assert(base != NULL, "sanity"); |
1436 _names.extend(base->_idx, no_lidx); |
1438 if (base->in(0) == NULL) { |
|
1439 // Initialize it once and make it shared: |
|
1440 // set control to _root and place it into Start block |
|
1441 // (where top() node is placed). |
|
1442 base->init_req(0, _cfg._root); |
|
1443 Block *startb = _cfg._bbs[C->top()->_idx]; |
|
1444 startb->_nodes.insert(startb->find_node(C->top()), base ); |
|
1445 _cfg._bbs.map( base->_idx, startb ); |
|
1446 assert (n2lidx(base) == 0, "should not have LRG yet"); |
|
1447 } |
|
1448 if (n2lidx(base) == 0) { |
|
1449 new_lrg(base, maxlrg++); |
|
1450 } |
|
1451 assert(base->in(0) == _cfg._root && |
|
1452 _cfg._bbs[base->_idx] == _cfg._bbs[C->top()->_idx], "base NULL should be shared"); |
1437 derived_base_map[derived->_idx] = base; |
1453 derived_base_map[derived->_idx] = base; |
1438 return base; |
1454 return base; |
1439 } |
1455 } |
1440 |
1456 |
1441 // Check for AddP-related opcodes |
1457 // Check for AddP-related opcodes |
1458 derived_base_map[derived->_idx] = base; |
1474 derived_base_map[derived->_idx] = base; |
1459 return base; |
1475 return base; |
1460 } |
1476 } |
1461 |
1477 |
1462 // Now we see we need a base-Phi here to merge the bases |
1478 // Now we see we need a base-Phi here to merge the bases |
1463 base = new (C, derived->req()) PhiNode( derived->in(0), base->bottom_type() ); |
1479 const Type *t = base->bottom_type(); |
1464 for( i = 1; i < derived->req(); i++ ) |
1480 base = new (C, derived->req()) PhiNode( derived->in(0), t ); |
|
1481 for( i = 1; i < derived->req(); i++ ) { |
1465 base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg)); |
1482 base->init_req(i, find_base_for_derived(derived_base_map, derived->in(i), maxlrg)); |
|
1483 t = t->meet(base->in(i)->bottom_type()); |
|
1484 } |
|
1485 base->as_Phi()->set_type(t); |
1466 |
1486 |
1467 // Search the current block for an existing base-Phi |
1487 // Search the current block for an existing base-Phi |
1468 Block *b = _cfg._bbs[derived->_idx]; |
1488 Block *b = _cfg._bbs[derived->_idx]; |
1469 for( i = 1; i <= b->end_idx(); i++ ) {// Search for matching Phi |
1489 for( i = 1; i <= b->end_idx(); i++ ) {// Search for matching Phi |
1470 Node *phi = b->_nodes[i]; |
1490 Node *phi = b->_nodes[i]; |
1558 while ((neighbor = elements.next()) != 0) { |
1578 while ((neighbor = elements.next()) != 0) { |
1559 // Find reaching DEF for base and derived values |
1579 // Find reaching DEF for base and derived values |
1560 // This works because we are still in SSA during this call. |
1580 // This works because we are still in SSA during this call. |
1561 Node *derived = lrgs(neighbor)._def; |
1581 Node *derived = lrgs(neighbor)._def; |
1562 const TypePtr *tj = derived->bottom_type()->isa_ptr(); |
1582 const TypePtr *tj = derived->bottom_type()->isa_ptr(); |
|
1583 assert(!derived->bottom_type()->isa_narrowoop() || |
|
1584 derived->bottom_type()->make_ptr()->is_ptr()->_offset == 0, "sanity"); |
1563 // If its an OOP with a non-zero offset, then it is derived. |
1585 // If its an OOP with a non-zero offset, then it is derived. |
1564 if( tj && tj->_offset != 0 && tj->isa_oop_ptr() ) { |
1586 if( tj && tj->_offset != 0 && tj->isa_oop_ptr() ) { |
1565 Node *base = find_base_for_derived( derived_base_map, derived, maxlrg ); |
1587 Node *base = find_base_for_derived( derived_base_map, derived, maxlrg ); |
1566 assert( base->_idx < _names.Size(), "" ); |
1588 assert( base->_idx < _names.Size(), "" ); |
1567 // Add reaching DEFs of derived pointer and base pointer as a |
1589 // Add reaching DEFs of derived pointer and base pointer as a |