Program: 79503
Project: 79503
Buggy source:
private void processBuiltInFuncCall(FuncCallExprNode node,ExprNode thisExpr,FuncEntity funcEntity,String funcName){
  boolean wantAddrBak=wantAddr;
  wantAddr=false;
  ExprNode arg0, arg1;
  VirtualRegister vreg;
  IRFunction calleeFunc;
  List<RegValue> vArgs=new ArrayList<>();
  if (thisExpr != null) {
    thisExpr.accept(this);
  }
switch (funcName) {
case IRRoot.BUILTIN_PRINT_FUNC_NAME:
case IRRoot.BUILTIN_PRINTLN_FUNC_NAME:
    arg0=node.getArgs().get(0);
  processPrintFuncCall(arg0,funcName);
break;
case IRRoot.BUILTIN_GET_STRING_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_GET_STRING_FUNC_NAME);
vArgs.clear();
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_GET_INT_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_GET_INT_FUNC_NAME);
vArgs.clear();
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_TO_STRING_FUNC_NAME:
arg0=node.getArgs().get(0);
arg0.accept(this);
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_TO_STRING_FUNC_NAME);
vArgs.clear();
vArgs.add(arg0.getRegValue());
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_SUBSTRING_FUNC_NAME:
arg0=node.getArgs().get(0);
arg0.accept(this);
arg1=node.getArgs().get(1);
arg1.accept(this);
vreg=new VirtualRegister("String_Node_Str");
vArgs.clear();
vArgs.add(thisExpr.getRegValue());
vArgs.add(arg0.getRegValue());
vArgs.add(arg1.getRegValue());
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_STRING_SUBSTRING_FUNC_NAME);
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_PARSEINT_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_STRING_PARSEINT_FUNC_NAME);
vArgs.clear();
vArgs.add(thisExpr.getRegValue());
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_ORD_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_STRING_ORD_FUNC_NAME);
vArgs.clear();
vArgs.add(thisExpr.getRegValue());
arg0=node.getArgs().get(0);
arg0.accept(this);
vArgs.add(arg0.getRegValue());
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_LENGTH_FUNC_NAME:
case IRRoot.BUILTIN_ARRAY_SIZE_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
currentBB.addInst(new IRLoad(currentBB,vreg,Configuration.getRegSize(),thisExpr.getRegValue(),0));
node.setRegValue(vreg);
break;
default :
throw new CompilerError("String_Node_Str");
}
wantAddr=wantAddrBak;
}

Fixed version (ground truth):
private void processBuiltInFuncCall(FuncCallExprNode node,ExprNode thisExpr,FuncEntity funcEntity,String funcName){
  boolean wantAddrBak=wantAddr;
  wantAddr=false;
  ExprNode arg0, arg1;
  VirtualRegister vreg;
  IRFunction calleeFunc;
  List<RegValue> vArgs=new ArrayList<>();
switch (funcName) {
case IRRoot.BUILTIN_PRINT_FUNC_NAME:
case IRRoot.BUILTIN_PRINTLN_FUNC_NAME:
    arg0=node.getArgs().get(0);
  processPrintFuncCall(arg0,funcName);
break;
case IRRoot.BUILTIN_GET_STRING_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_GET_STRING_FUNC_NAME);
vArgs.clear();
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_GET_INT_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_GET_INT_FUNC_NAME);
vArgs.clear();
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_TO_STRING_FUNC_NAME:
arg0=node.getArgs().get(0);
arg0.accept(this);
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_TO_STRING_FUNC_NAME);
vArgs.clear();
vArgs.add(arg0.getRegValue());
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_SUBSTRING_FUNC_NAME:
arg0=node.getArgs().get(0);
arg0.accept(this);
arg1=node.getArgs().get(1);
arg1.accept(this);
vreg=new VirtualRegister("String_Node_Str");
vArgs.clear();
vArgs.add(thisExpr.getRegValue());
vArgs.add(arg0.getRegValue());
vArgs.add(arg1.getRegValue());
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_STRING_SUBSTRING_FUNC_NAME);
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_PARSEINT_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_STRING_PARSEINT_FUNC_NAME);
vArgs.clear();
vArgs.add(thisExpr.getRegValue());
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_ORD_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
calleeFunc=ir.getBuiltInFunc(IRRoot.BUILTIN_STRING_ORD_FUNC_NAME);
vArgs.clear();
vArgs.add(thisExpr.getRegValue());
arg0=node.getArgs().get(0);
arg0.accept(this);
vArgs.add(arg0.getRegValue());
currentBB.addInst(new IRFunctionCall(currentBB,calleeFunc,vArgs,vreg));
node.setRegValue(vreg);
break;
case IRRoot.BUILTIN_STRING_LENGTH_FUNC_NAME:
case IRRoot.BUILTIN_ARRAY_SIZE_FUNC_NAME:
vreg=new VirtualRegister("String_Node_Str");
currentBB.addInst(new IRLoad(currentBB,vreg,Configuration.getRegSize(),thisExpr.getRegValue(),0));
node.setRegValue(vreg);
break;
default :
throw new CompilerError("String_Node_Str");
}
wantAddr=wantAddrBak;
}