Program: 78215
Project: 78215
Buggy source:
private LinkedList<BasicBlock> processInsts(BasicBlock block){
  LinkedList<BasicBlock> newBlocks=new LinkedList<>();
  newBlocks.add(block);
  Function function=block.parentFunction();
  for (Instruction inst=block.front(); inst != null; inst=inst.next) {
    if (inst instanceof FunctionCallInst) {
      FunctionCallInst functionCallInst=(FunctionCallInst)inst;
      Operand arg=functionCallInst.args().get(0);
      if (arg instanceof IntLiteral && ((IntLiteral)arg).val() > options.MEMORIZE_SEARCH_LEVEL)       continue;
      BasicBlock getRes=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock callSetBlock=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock setRes=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock callBlock=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock nextBlock=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      newBlocks.addAll(Arrays.asList(callBlock,getRes,callSetBlock,setRes));
      nextBlock.setFront(inst.next);
      nextBlock.setEnd(block.back());
      block.setEnd(inst.prev);
      inst.prev.next=null;
      Var cmpRes=Var.tmpBuilder("String_Node_Str",true);
      BinaryExprInst cmp=new BinaryExprInst(cmpRes,arg,ExprOps.LT,new IntLiteral(options.MEMORIZE_SEARCH_LEVEL));
      block.pushBack(new CondJumpInst(cmpRes,cmp,getRes,callBlock));
      Var res=Var.tmpBuilder("String_Node_Str");
      getRes.pushBack(new MoveInst(res,new Memory(function.memorizeSearchMemBase(),arg,1,0)));
      Var validCmpRes=Var.tmpBuilder("String_Node_Str",true);
      BinaryExprInst validCmp=new BinaryExprInst(validCmpRes,res,ExprOps.NEQ,IntLiteral.ZERO_LITERAL);
      getRes.pushBack(new CondJumpInst(validCmpRes,validCmp,setRes,callSetBlock));
      callSetBlock.pushBack(new FunctionCallInst(function,functionCallInst.args(),(Register)functionCallInst.dst()));
      callBlock.pushBack(new MoveInst(new Memory(function.memorizeSearchMemBase(),arg,1,0),functionCallInst.dst()));
      callSetBlock.pushBack(new DirectJumpInst(nextBlock));
      setRes.pushBack(new MoveInst(functionCallInst.dst(),res));
      setRes.pushBack(new DirectJumpInst(nextBlock));
      callBlock.pushBack(functionCallInst);
      callBlock.pushBack(new DirectJumpInst(nextBlock));
      newBlocks.addAll(processInsts(nextBlock));
    }
  }
  return newBlocks;
}

Fixed version (ground truth):
private LinkedList<BasicBlock> processInsts(BasicBlock block){
  LinkedList<BasicBlock> newBlocks=new LinkedList<>();
  newBlocks.add(block);
  Function function=block.parentFunction();
  for (Instruction inst=block.front(); inst != null; inst=inst.next) {
    if (inst instanceof FunctionCallInst) {
      FunctionCallInst functionCallInst=(FunctionCallInst)inst;
      Operand arg=functionCallInst.args().get(0);
      if (arg instanceof IntLiteral && ((IntLiteral)arg).val() > options.MEMORIZE_SEARCH_LEVEL)       continue;
      BasicBlock getRes=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock callSetBlock=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock setRes=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock callBlock=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      BasicBlock nextBlock=new BasicBlock(function,block.getCurrentSymbolTable(),function.name() + "String_Node_Str",block.valTag());
      newBlocks.addAll(Arrays.asList(callBlock,getRes,callSetBlock,setRes));
      nextBlock.setFront(inst.next);
      nextBlock.setEnd(block.back());
      block.setEnd(inst.prev);
      inst.prev.next=null;
      Var cmpRes=Var.tmpBuilder("String_Node_Str",true);
      BinaryExprInst cmp=new BinaryExprInst(cmpRes,arg,ExprOps.LT,new IntLiteral(options.MEMORIZE_SEARCH_LEVEL));
      block.pushBack(new CondJumpInst(cmpRes,cmp,getRes,callBlock));
      Var res=Var.tmpBuilder("String_Node_Str");
      getRes.pushBack(new MoveInst(res,new Memory(function.memorizeSearchMemBase(),arg,options.PTR_SIZE,0)));
      Var validCmpRes=Var.tmpBuilder("String_Node_Str",true);
      BinaryExprInst validCmp=new BinaryExprInst(validCmpRes,res,ExprOps.NEQ,IntLiteral.ZERO_LITERAL);
      getRes.pushBack(new CondJumpInst(validCmpRes,validCmp,setRes,callSetBlock));
      callSetBlock.pushBack(new FunctionCallInst(function,functionCallInst.args(),(Register)functionCallInst.dst()));
      callSetBlock.pushBack(new MoveInst(new Memory(function.memorizeSearchMemBase(),arg,options.PTR_SIZE,0),functionCallInst.dst()));
      callSetBlock.pushBack(new DirectJumpInst(nextBlock));
      setRes.pushBack(new MoveInst(functionCallInst.dst(),res));
      setRes.pushBack(new DirectJumpInst(nextBlock));
      callBlock.pushBack(new FunctionCallInst(function,functionCallInst.args(),(Register)functionCallInst.dst()));
      callBlock.pushBack(new DirectJumpInst(nextBlock));
      newBlocks.addAll(processInsts(nextBlock));
    }
  }
  return newBlocks;
}