summaryrefslogtreecommitdiff
path: root/lib
diff options
context:
space:
mode:
authorKai Nacke <kai.nacke@redstar.de>2014-02-04 05:55:16 +0000
committerKai Nacke <kai.nacke@redstar.de>2014-02-04 05:55:16 +0000
commit6840e895c1e77c5862c1d3f46747ae7f654476d4 (patch)
treeff4b5e582ef1ea3ba98415d60ffbc9d1246b80a1 /lib
parenteabe14bd96c35fbb9b11288e9ee1785a64117896 (diff)
downloadllvm-6840e895c1e77c5862c1d3f46747ae7f654476d4.tar.gz
llvm-6840e895c1e77c5862c1d3f46747ae7f654476d4.tar.bz2
llvm-6840e895c1e77c5862c1d3f46747ae7f654476d4.tar.xz
Add strchr(p, 0) -> p + strlen(p) to SimplifyLibCalls
Add the missing transformation strchr(p, 0) -> p + strlen(p) to SimplifyLibCalls and remove the ToDo comment. Reviewer: Duncan P.N. Exan Smith git-svn-id: https://llvm.org/svn/llvm-project/llvm/trunk@200736 91177308-0d34-0410-b5e6-96231b3b80d8
Diffstat (limited to 'lib')
-rw-r--r--lib/Transforms/Utils/SimplifyLibCalls.cpp7
1 files changed, 4 insertions, 3 deletions
diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp
index 36d24624f9..1ef8115945 100644
--- a/lib/Transforms/Utils/SimplifyLibCalls.cpp
+++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp
@@ -493,8 +493,11 @@ struct StrChrOpt : public LibCallOptimization {
// Otherwise, the character is a constant, see if the first argument is
// a string literal. If so, we can constant fold.
StringRef Str;
- if (!getConstantStringInfo(SrcStr, Str))
+ if (!getConstantStringInfo(SrcStr, Str)) {
+ if (TD && CharC->isZero()) // strchr(p, 0) -> p + strlen(p)
+ return B.CreateGEP(SrcStr, EmitStrLen(SrcStr, B, TD, TLI), "strchr");
return 0;
+ }
// Compute the offset, make sure to handle the case when we're searching for
// zero (a weird way to spell strlen).
@@ -2297,8 +2300,6 @@ void LibCallSimplifier::replaceAllUsesWith(Instruction *I, Value *With) const {
// * sqrt(Nroot(x)) -> pow(x,1/(2*N))
// * sqrt(pow(x,y)) -> pow(|x|,y*0.5)
//
-// strchr:
-// * strchr(p, 0) -> strlen(p)
// tan, tanf, tanl:
// * tan(atan(x)) -> x
//