aboutsummaryrefslogtreecommitdiff
path: root/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
diff options
context:
space:
mode:
authorDavide Italiano <davide@freebsd.org>2016-03-28 15:54:01 +0000
committerDavide Italiano <davide@freebsd.org>2016-03-28 15:54:01 +0000
commit6db1dcbf6b42d1eedc070585c65e6fe7dab25e54 (patch)
treeb011388fab227ecdb42c6045aa8d1c36ed209a94 /llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
parente44e0be818ae53a6d60e96df1a04827f720847dc (diff)
downloadllvm-6db1dcbf6b42d1eedc070585c65e6fe7dab25e54.zip
llvm-6db1dcbf6b42d1eedc070585c65e6fe7dab25e54.tar.gz
llvm-6db1dcbf6b42d1eedc070585c65e6fe7dab25e54.tar.bz2
[SimplifyLibCalls] Transform printf("%s", "a") -> putchar('a').
llvm-svn: 264588
Diffstat (limited to 'llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp')
-rw-r--r--llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp18
1 files changed, 18 insertions, 0 deletions
diff --git a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 4252cf5..3712575 100644
--- a/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/llvm/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -1839,6 +1839,24 @@ Value *LibCallSimplifier::optimizePrintFString(CallInst *CI, IRBuilder<> &B) {
return B.CreateIntCast(Res, CI->getType(), true);
}
+ // printf("%s", "a") --> putchar('a')
+ if (FormatStr == "%s" && CI->getNumArgOperands() > 1) {
+ StringRef ChrStr;
+ if (!getConstantStringInfo(CI->getOperand(1), ChrStr))
+ return nullptr;
+ if (ChrStr.size() != 1)
+ return nullptr;
+ Value *Res = emitPutChar(B.getInt32(ChrStr[0]), B, TLI);
+
+ // FIXME: Here we check that the return value is not used
+ // but ealier we prevent transformations in case it is.
+ // This should probably be an assert.
+ if (CI->use_empty() || !Res)
+ return Res;
+
+ return B.CreateIntCast(Res, CI->getType(), true);
+ }
+
// printf("foo\n") --> puts("foo")
if (FormatStr[FormatStr.size() - 1] == '\n' &&
FormatStr.find('%') == StringRef::npos) { // No format characters.