public void runDepthFirstPass(Pass p) throws Exception {
        if(localPass == currentPass) {
            return;
        }
        localPass = currentPass;
        ListIterator<Instruction> i = instructions.listIterator(0);
        while(i.hasNext()) {
            p.run(i);
        }
        BasicBlock ch1 = getFallThrough();
        BasicBlock ch2 = getBranchTarget();
        if(ch1 != null) {
            ch1.runDepthFirstPass(p);
        }
        if(ch2 != null) {
            ch2.runDepthFirstPass(p);
        }
    }