diff --git a/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h b/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h --- a/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h +++ b/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h @@ -226,8 +226,8 @@ /// Emit a call to the puts function. This assumes that Str is some pointer. Value *emitPutS(Value *Str, IRBuilderBase &B, const TargetLibraryInfo *TLI); - /// Emit a call to the fputc function. This assumes that Char can be casted to - /// int (currently assuming int is i32), and File is a pointer to FILE. + /// Emit a call to the fputc function. This assumes that Char is an 'int', and + /// File is a pointer to FILE. Value *emitFPutC(Value *Char, Value *File, IRBuilderBase &B, const TargetLibraryInfo *TLI); diff --git a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -1841,8 +1841,6 @@ IntTy, File->getType()); if (File->getType()->isPointerTy()) inferNonMandatoryLibFuncAttrs(M, FPutcName, *TLI); - Char = B.CreateIntCast(Char, IntTy, /*isSigned*/true, - "chari"); CallInst *CI = B.CreateCall(F, {Char, File}, FPutcName); if (const Function *Fn = diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -3218,11 +3218,13 @@ // Decode the second character of the format string. if (FormatStr[1] == 'c') { - // fprintf(F, "%c", chr) --> fputc(chr, F) + // fprintf(F, "%c", chr) --> fputc((int)chr, F) if (!CI->getArgOperand(2)->getType()->isIntegerTy()) return nullptr; - return copyFlags( - *CI, emitFPutC(CI->getArgOperand(2), CI->getArgOperand(0), B, TLI)); + Type *IntTy = B.getIntNTy(TLI->getIntSize()); + Value *V = B.CreateIntCast(CI->getArgOperand(2), IntTy, /*isSigned*/ true, + "chari"); + return copyFlags(*CI, emitFPutC(V, CI->getArgOperand(0), B, TLI)); } if (FormatStr[1] == 's') { @@ -3289,7 +3291,9 @@ if (Bytes == 1 && CI->use_empty()) { // fwrite(S,1,1,F) -> fputc(S[0],F) Value *Char = B.CreateLoad(B.getInt8Ty(), castToCStr(CI->getArgOperand(0), B), "char"); - Value *NewCI = emitFPutC(Char, CI->getArgOperand(3), B, TLI); + Type *IntTy = B.getIntNTy(TLI->getIntSize()); + Value *Cast = B.CreateIntCast(Char, IntTy, /*isSigned*/ true, "chari"); + Value *NewCI = emitFPutC(Cast, CI->getArgOperand(3), B, TLI); return NewCI ? ConstantInt::get(CI->getType(), 1) : nullptr; } }