Program: 171596
Project: 171596
Buggy source:
/** 
 * Appends the loop ending that was computed during loop creation It also handles ELSE statements by creating another loop
 * @param ROM
 */
public static void compileLoopStop(ArrayList<Command> ROM){
  tokens.remove(0);
  OpenLoop loop=loops.remove(0);
  ROM.addAll(loop.commands);
  if (loop.type.equals("String_Node_Str")) {
    if (tokens.get(0).equals("String_Node_Str")) {
      tokens.remove(0);
      OpenLoop loop2=new OpenLoop("String_Node_Str");
      loops.add(0,loop2);
      String oBrace=tokens.remove(0);
      while (!oBrace.equals("String_Node_Str")) {
        loop2.name+="String_Node_Str" + oBrace;
        oBrace=tokens.remove(0);
      }
      ROM.add(new Command("String_Node_Str",new Arg(-1),new Arg("String_Node_Str" + loop2,1),new Arg(address.get(ProgramCounter)),"String_Node_Str" + loop2));
      compileDelaySlot(ROM);
    }
  }
  if (loop.type.equals("String_Node_Str")) {
    tokens.remove(0);
    tokens.remove(0);
    Arg arg1=compileRef(ROM,false);
    String op=tokens.remove(0);
    Arg arg2=new Arg(0);
    if (op.equals("String_Node_Str")) {
      op="String_Node_Str";
    }
 else {
      arg2=compileRef(ROM,false);
      tokens.remove(0);
    }
    tokens.remove(0);
    Arg test=null;
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val++;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val--;
      op="String_Node_Str";
    }
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val--;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val++;
      op="String_Node_Str";
    }
    if (op.equals("String_Node_Str") || op.equals("String_Node_Str") || op.equals("String_Node_Str")|| op.equals("String_Node_Str")) {
      if (op.startsWith("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else {
        if (!op.endsWith("String_Node_Str")) {
          freeS(arg1);
        }
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        if (op.endsWith("String_Node_Str")) {
          ROM.add(new Command("String_Node_Str",arg2,new Arg(1),testdest));
        }
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
    }
 else     if (op.equals("String_Node_Str")) {
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else       if (arg1.mode == 0 && arg1.val == 0) {
        test=arg2;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
    }
 else {
      System.err.println("String_Node_Str" + op + "String_Node_Str");
    }
    compileDelaySlot(ROM);
  }
  if (loop.type.equals("String_Node_Str") || loop.type.equals("String_Node_Str") || loop.type.equals("String_Node_Str")|| loop.type.equals("String_Node_Str")) {
    if (prevCall == null || loop.commands.size() > 0) {
      ROM.get(ROM.size() - 1).tags.add("String_Node_Str" + loop);
    }
 else {
      prevCall.tags.add("String_Node_Str" + loop);
    }
  }
  if (loop.type.equals("String_Node_Str")) {
    subs.remove(0);
  }
}

Fixed version (ground truth):
/** 
 * Appends the loop ending that was computed during loop creation It also handles ELSE statements by creating another loop
 * @param ROM
 */
public static void compileLoopStop(ArrayList<Command> ROM){
  tokens.remove(0);
  OpenLoop loop=loops.remove(0);
  int startloc=ROM.size();
  ROM.addAll(loop.commands);
  if (loop.type.equals("String_Node_Str")) {
    if (tokens.get(0).equals("String_Node_Str")) {
      tokens.remove(0);
      OpenLoop loop2=new OpenLoop("String_Node_Str");
      loops.add(0,loop2);
      String oBrace=tokens.remove(0);
      while (!oBrace.equals("String_Node_Str")) {
        loop2.name+="String_Node_Str" + oBrace;
        oBrace=tokens.remove(0);
      }
      ROM.add(new Command("String_Node_Str",new Arg(-1),new Arg("String_Node_Str" + loop2,1),new Arg(address.get(ProgramCounter)),"String_Node_Str" + loop2));
      compileDelaySlot(ROM);
    }
  }
  if (loop.type.equals("String_Node_Str")) {
    tokens.remove(0);
    tokens.remove(0);
    Arg arg1=compileRef(ROM,false);
    String op=tokens.remove(0);
    Arg arg2=new Arg(0);
    if (op.equals("String_Node_Str")) {
      op="String_Node_Str";
    }
 else {
      arg2=compileRef(ROM,false);
      tokens.remove(0);
    }
    tokens.remove(0);
    Arg test=null;
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val++;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val--;
      op="String_Node_Str";
    }
    if (arg2.mode == 0 && op.equals("String_Node_Str")) {
      arg2.val--;
      op="String_Node_Str";
    }
    if (arg1.mode == 0 && op.equals("String_Node_Str")) {
      arg1.val++;
      op="String_Node_Str";
    }
    if (op.equals("String_Node_Str") || op.equals("String_Node_Str") || op.equals("String_Node_Str")|| op.equals("String_Node_Str")) {
      if (op.startsWith("String_Node_Str")) {
        Arg temp=arg1;
        arg1=arg2;
        arg2=temp;
      }
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else {
        if (!op.endsWith("String_Node_Str")) {
          freeS(arg1);
        }
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        if (op.endsWith("String_Node_Str")) {
          ROM.add(new Command("String_Node_Str",arg2,new Arg(1),testdest));
        }
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
    }
 else     if (op.equals("String_Node_Str")) {
      if (arg2.mode == 0 && arg2.val == 0) {
        test=arg1;
      }
 else       if (arg1.mode == 0 && arg1.val == 0) {
        test=arg2;
      }
 else {
        freeS(arg1);
        freeS(arg2);
        Arg testdest=mallocS();
        test=testdest.dup();
        test.mode++;
        ROM.add(new Command("String_Node_Str",arg1,arg2,testdest));
      }
      ROM.add(new Command("String_Node_Str",test,new Arg("String_Node_Str" + loop,1),new Arg(address.get(ProgramCounter))));
    }
 else {
      System.err.println("String_Node_Str" + op + "String_Node_Str");
    }
    compileDelaySlot(ROM);
  }
  if (loop.type.equals("String_Node_Str") || loop.type.equals("String_Node_Str") || loop.type.equals("String_Node_Str")|| loop.type.equals("String_Node_Str")) {
    if (prevCall == null || ROM.size() > startloc) {
      ROM.get(ROM.size() - 1).tags.add("String_Node_Str" + loop);
    }
 else {
      prevCall.tags.add("String_Node_Str" + loop);
    }
  }
  if (loop.type.equals("String_Node_Str")) {
    subs.remove(0);
  }
}