< prev index next >
src/hotspot/share/opto/phaseX.cpp
Print this page
*** 428,451 ****
// Remove all useless nodes from future worklist
worklist->remove_useless_nodes(_useful.member_set());
// Disconnect 'useless' nodes that are adjacent to useful nodes
C->remove_useless_nodes(_useful);
-
- // Remove edges from "root" to each SafePoint at a backward branch.
- // They were inserted during parsing (see add_safepoint()) to make infinite
- // loops without calls or exceptions visible to root, i.e., useful.
- Node *root = C->root();
- if( root != NULL ) {
- for( uint i = root->req(); i < root->len(); ++i ) {
- Node *n = root->in(i);
- if( n != NULL && n->is_SafePoint() ) {
- root->rm_prec(i);
- --i;
- }
- }
- }
}
//=============================================================================
//------------------------------PhaseRenumberLive------------------------------
// First, remove useless nodes (equivalent to identifying live nodes).
--- 428,437 ----
*** 1352,1361 ****
--- 1338,1350 ----
assert(_stack.is_empty(), "not empty");
_stack.push(dead, PROCESS_INPUTS);
while (_stack.is_nonempty()) {
dead = _stack.node();
+ if (dead->Opcode() == Op_SafePoint) {
+ dead->as_SafePoint()->disconnect_from_root(this);
+ }
uint progress_state = _stack.index();
assert(dead != C->root(), "killing root, eh?");
assert(!dead->is_top(), "add check for top when pushing");
NOT_PRODUCT( set_progress(); )
if (progress_state == PROCESS_INPUTS) {
*** 1454,1463 ****
--- 1443,1455 ----
}
//------------------------------subsume_node-----------------------------------
// Remove users from node 'old' and add them to node 'nn'.
void PhaseIterGVN::subsume_node( Node *old, Node *nn ) {
+ if (old->Opcode() == Op_SafePoint) {
+ old->as_SafePoint()->disconnect_from_root(this);
+ }
assert( old != hash_find(old), "should already been removed" );
assert( old != C->top(), "cannot subsume top node");
// Copy debug or profile information to the new version:
C->copy_node_notes_to(nn, old);
// Move users of node 'old' to node 'nn'
< prev index next >