Skip to content
This repository has been archived by the owner on Jan 1, 2023. It is now read-only.

Commit

Permalink
Add strchr(p, 0) -> p + strlen(p) to SimplifyLibCalls
Browse files Browse the repository at this point in the history
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
  • Loading branch information
redstar committed Feb 4, 2014
1 parent 6a87460 commit 86ce2a0
Show file tree
Hide file tree
Showing 2 changed files with 17 additions and 3 deletions.
7 changes: 4 additions & 3 deletions lib/Transforms/Utils/SimplifyLibCalls.cpp
Original file line number Diff line number Diff line change
Expand Up @@ -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).
Expand Down Expand Up @@ -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
//
Expand Down
13 changes: 13 additions & 0 deletions test/Transforms/InstCombine/strchr-1.ll
Original file line number Diff line number Diff line change
Expand Up @@ -63,3 +63,16 @@ define void @test_simplify5() {
store i8* %dst, i8** @chp
ret void
}

; Check transformation strchr(p, 0) -> p + strlen(p)
define void @test_simplify6(i8* %str) {
; CHECK: %strlen = call i32 @strlen(i8* %str)
; CHECK-NOT: call i8* @strchr
; CHECK: %strchr = getelementptr i8* %str, i32 %strlen
; CHECK: store i8* %strchr, i8** @chp, align 4
; CHECK: ret void

%dst = call i8* @strchr(i8* %str, i32 0)
store i8* %dst, i8** @chp
ret void
}

0 comments on commit 86ce2a0

Please sign in to comment.