194 debug_only(n->enter_hash_lock()); // Lock down the node while in the table. |
194 debug_only(n->enter_hash_lock()); // Lock down the node while in the table. |
195 // if( conflict ) { n->dump(); } |
195 // if( conflict ) { n->dump(); } |
196 } |
196 } |
197 |
197 |
198 //------------------------------hash_delete------------------------------------ |
198 //------------------------------hash_delete------------------------------------ |
199 // Replace in hash table with sentinal |
199 // Replace in hash table with sentinel |
200 bool NodeHash::hash_delete( const Node *n ) { |
200 bool NodeHash::hash_delete( const Node *n ) { |
201 Node *k; |
201 Node *k; |
202 uint hash = n->hash(); |
202 uint hash = n->hash(); |
203 if (hash == Node::NO_HASH) { |
203 if (hash == Node::NO_HASH) { |
204 debug_only( _delete_misses++ ); |
204 debug_only( _delete_misses++ ); |
205 return false; |
205 return false; |
206 } |
206 } |
207 uint key = hash & (_max-1); |
207 uint key = hash & (_max-1); |
208 uint stride = key | 0x01; |
208 uint stride = key | 0x01; |
209 debug_only( uint counter = 0; ); |
209 debug_only( uint counter = 0; ); |
210 for( ; /* (k != NULL) && (k != _sentinal) */; ) { |
210 for( ; /* (k != NULL) && (k != _sentinel) */; ) { |
211 debug_only( counter++ ); |
211 debug_only( counter++ ); |
212 debug_only( _delete_probes++ ); |
212 debug_only( _delete_probes++ ); |
213 k = _table[key]; // Get hashed value |
213 k = _table[key]; // Get hashed value |
214 if( !k ) { // Miss? |
214 if( !k ) { // Miss? |
215 debug_only( _delete_misses++ ); |
215 debug_only( _delete_misses++ ); |
713 return k; |
713 return k; |
714 } |
714 } |
715 |
715 |
716 #ifdef ASSERT |
716 #ifdef ASSERT |
717 //------------------------------dead_loop_check-------------------------------- |
717 //------------------------------dead_loop_check-------------------------------- |
718 // Check for a simple dead loop when a data node references itself direcly |
718 // Check for a simple dead loop when a data node references itself directly |
719 // or through an other data node excluding cons and phis. |
719 // or through an other data node excluding cons and phis. |
720 void PhaseGVN::dead_loop_check( Node *n ) { |
720 void PhaseGVN::dead_loop_check( Node *n ) { |
721 // Phi may reference itself in a loop |
721 // Phi may reference itself in a loop |
722 if (n != NULL && !n->is_dead_loop_safe() && !n->is_CFG()) { |
722 if (n != NULL && !n->is_dead_loop_safe() && !n->is_CFG()) { |
723 // Do 2 levels check and only data inputs. |
723 // Do 2 levels check and only data inputs. |
1357 Node* p = m->fast_out(i2); // Propagate changes to uses |
1357 Node* p = m->fast_out(i2); // Propagate changes to uses |
1358 if( p->bottom_type() != type(p) ) // If not already bottomed out |
1358 if( p->bottom_type() != type(p) ) // If not already bottomed out |
1359 worklist.push(p); // Propagate change to user |
1359 worklist.push(p); // Propagate change to user |
1360 } |
1360 } |
1361 } |
1361 } |
1362 // If we changed the reciever type to a call, we need to revisit |
1362 // If we changed the receiver type to a call, we need to revisit |
1363 // the Catch following the call. It's looking for a non-NULL |
1363 // the Catch following the call. It's looking for a non-NULL |
1364 // receiver to know when to enable the regular fall-through path |
1364 // receiver to know when to enable the regular fall-through path |
1365 // in addition to the NullPtrException path |
1365 // in addition to the NullPtrException path |
1366 if (m->is_Call()) { |
1366 if (m->is_Call()) { |
1367 for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) { |
1367 for (DUIterator_Fast i2max, i2 = m->fast_outs(i2max); i2 < i2max; i2++) { |