From 491ac8f3e81c5b6ecd364b560960cd63dccd3df7 Mon Sep 17 00:00:00 2001 From: Bjorn Pettersson Date: Thu, 29 Sep 2022 22:31:33 +0200 Subject: [PATCH] [LibCalls] Cast Char argument to 'int' before calling emitFPutC The helpers in BuildLibCalls normally expect that the Value arguments already have the correct type (matching the lib call signature). And exception has been emitFPutC which casted the Char argument to 'int' using CreateIntCast. This patch moves the cast to the caller instead of doing it inside emitFPutC. I think it makes sense to make the BuildLibCall API:s a bit more consistent this way, despite the need to handle the int cast in two different places now. Differential Revision: https://reviews.llvm.org/D135066 --- llvm/include/llvm/Transforms/Utils/BuildLibCalls.h | 4 ++-- llvm/lib/Transforms/Utils/BuildLibCalls.cpp | 2 -- llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp | 12 ++++++++---- 3 files changed, 10 insertions(+), 8 deletions(-) diff --git a/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h b/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h index 8941ca4..bb1cb07 100644 --- a/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h +++ b/llvm/include/llvm/Transforms/Utils/BuildLibCalls.h @@ -226,8 +226,8 @@ namespace llvm { /// 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 index b55af3b..f1d1d0d 100644 --- a/llvm/lib/Transforms/Utils/BuildLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/BuildLibCalls.cpp @@ -1841,8 +1841,6 @@ Value *llvm::emitFPutC(Value *Char, Value *File, IRBuilderBase &B, 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 index abd5099..0303831 100644 --- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp +++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp @@ -3209,11 +3209,13 @@ Value *LibCallSimplifier::optimizeFPrintFString(CallInst *CI, // 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') { @@ -3280,7 +3282,9 @@ Value *LibCallSimplifier::optimizeFWrite(CallInst *CI, IRBuilderBase &B) { 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; } } -- 2.7.4