Kill a Node with no uses , by setting all of its defs to null. This may recursively kill more Nodes, and is basically dead code elimination.
( )
| 240 | * code elimination. |
| 241 | */ |
| 242 | public void kill( ) { |
| 243 | unlock(); |
| 244 | moveDepsToWorklist(); |
| 245 | assert isUnused(); // Has no uses, so it is dead |
| 246 | _type=null; // Flag as dead |
| 247 | while( nIns()>0 ) { // Set all inputs to null, recursively killing unused Nodes |
| 248 | Node old_def = _inputs.removeLast(); |
| 249 | if( old_def != null ) { |
| 250 | IterPeeps.add(old_def);// Revisit neighbor because removed use |
| 251 | if( old_def.delUse(this) ) // If we removed the last use, the old def is now dead |
| 252 | old_def.kill(); // Kill old def |
| 253 | } |
| 254 | } |
| 255 | assert isDead(); // Really dead now |
| 256 | } |
| 257 | |
| 258 | // Mostly used for asserts and printing. |
| 259 | public boolean isDead() { return isUnused() && nIns()==0 && _type==null; } |
no test coverage detected