@Override
 public void addNode(ValueNode node) {
   if (node instanceof FloatingNode) {
     effects.addFloatingNode(node, "VirtualizerTool");
   } else {
     effects.addFixedNodeBefore((FixedWithNextNode) node, position);
   }
 }
 @Override
 public void replaceWithVirtual(VirtualObjectNode virtual) {
   state.addAndMarkAlias(virtual, current, usages);
   if (current instanceof FixedWithNextNode) {
     effects.deleteFixedNode((FixedWithNextNode) current);
   }
   deleted = true;
 }
 @Override
 public void createVirtualObject(
     VirtualObjectNode virtualObject, ValueNode[] entryState, int[] locks) {
   VirtualUtil.trace("{{%s}} ", current);
   if (virtualObject.isAlive()) {
     state.addAndMarkAlias(virtualObject, virtualObject, usages);
   } else {
     effects.addFloatingNode(virtualObject, "newVirtualObject");
   }
   for (int i = 0; i < entryState.length; i++) {
     entryState[i] = state.getScalarAlias(entryState[i]);
   }
   state.addObject(
       virtualObject, new ObjectState(virtualObject, entryState, EscapeState.Virtual, locks));
   state.addAndMarkAlias(virtualObject, virtualObject, usages);
   PartialEscapeClosure.METRIC_ALLOCATION_REMOVED.increment();
 }
 @Override
 public void replaceFirstInput(Node oldInput, Node replacement) {
   effects.replaceFirstInput(current, oldInput, replacement);
 }
 @Override
 public void delete() {
   effects.deleteFixedNode((FixedWithNextNode) current);
   deleted = true;
 }
 @Override
 public void replaceWithValue(ValueNode replacement) {
   effects.replaceAtUsages(current, state.getScalarAlias(replacement));
   state.addScalarAlias(current, replacement);
   deleted = true;
 }