< prev index next >

src/hotspot/share/opto/phaseX.cpp

Print this page

        

*** 1240,1261 **** } //------------------------------transform-------------------------------------- // Non-recursive: idealize Node 'n' with respect to its inputs and its value Node *PhaseIterGVN::transform( Node *n ) { - if (_delay_transform) { - // Register the node but don't optimize for now - register_new_node_with_optimizer(n); - return n; - } - // If brand new node, make space in type array, and give it a type. ensure_type_or_null(n); if (type_or_null(n) == NULL) { set_type_bottom(n); } return transform_old(n); } Node *PhaseIterGVN::transform_old(Node* n) { DEBUG_ONLY(uint loop_count = 0;); --- 1240,1261 ---- } //------------------------------transform-------------------------------------- // Non-recursive: idealize Node 'n' with respect to its inputs and its value Node *PhaseIterGVN::transform( Node *n ) { // If brand new node, make space in type array, and give it a type. ensure_type_or_null(n); if (type_or_null(n) == NULL) { set_type_bottom(n); } + if (_delay_transform) { + // Add the node to the worklist but don't optimize for now + _worklist.push(n); + return n; + } + return transform_old(n); } Node *PhaseIterGVN::transform_old(Node* n) { DEBUG_ONLY(uint loop_count = 0;);
*** 1491,1500 **** --- 1491,1503 ---- C->remove_range_check_cast(cast); } if (dead->Opcode() == Op_Opaque4) { C->remove_opaque4_node(dead); } + if (dead->is_ValueTypeBase()) { + C->remove_value_type(dead); + } BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); bs->unregister_potential_barrier_node(dead); } } // while (_stack.is_nonempty()) }
*** 1555,1564 **** --- 1558,1578 ---- #endif _worklist.remove(temp); // this can be necessary temp->destruct(); // reuse the _idx of this little guy } + void PhaseIterGVN::replace_in_uses(Node* n, Node* m) { + for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { + Node* u = n->fast_out(i); + if (u != n) { + rehash_node_delayed(u); + int nb = u->replace_edge(n, m); + --i, imax -= nb; + } + } + } + //------------------------------add_users_to_worklist-------------------------- void PhaseIterGVN::add_users_to_worklist0( Node *n ) { for (DUIterator_Fast imax, i = n->fast_outs(imax); i < imax; i++) { _worklist.push(n->fast_out(i)); // Push on worklist }
*** 1700,1709 **** --- 1714,1731 ---- } if (use_op == Op_Initialize) { Node* imem = use->as_Initialize()->proj_out_or_null(TypeFunc::Memory); if (imem != NULL) add_users_to_worklist0(imem); } + if (use_op == Op_CastP2X) { + for (DUIterator_Fast i2max, i2 = use->fast_outs(i2max); i2 < i2max; i2++) { + Node* u = use->fast_out(i2); + if (u->Opcode() == Op_AndX) { + _worklist.push(u); + } + } + } // Loading the java mirror from a Klass requires two loads and the type // of the mirror load depends on the type of 'n'. See LoadNode::Value(). // LoadBarrier?(LoadP(LoadP(AddP(foo:Klass, #java_mirror)))) BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); bool has_load_barriers = bs->has_load_barriers();
*** 1861,1870 **** --- 1883,1900 ---- PhiNode* phi = countedloop_phi_from_cmp((CmpINode*)m, n); if (phi != NULL) { worklist.push(phi); } } + if (m_op == Op_CastP2X) { + for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) { + Node* u = m->fast_out(i2); + if (u->Opcode() == Op_AndX) { + worklist.push(u); + } + } + } // Loading the java mirror from a Klass requires two loads and the type // of the mirror load depends on the type of 'n'. See LoadNode::Value(). BarrierSetC2* bs = BarrierSet::barrier_set()->barrier_set_c2(); bool has_load_barriers = bs->has_load_barriers();
< prev index next >