private void performElimination(Instruction i) throws Exception {
        // if i is dead, but hasn't already been eliminated
        if(i.isDeadCode() && !i.isDeleted()) {
            i.delete(deleteFor);
            for(Value v : i.getArguments()) {
                v.removeUse(i);
                // v may now be dead code
                if(v instanceof Instruction) {
                    performElimination((Instruction)v);
                }
            }
        }
    }