mirror of
https://github.com/RPCS3/llvm-mirror.git
synced 2024-12-15 15:48:38 +00:00
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 llvm-svn: 200736
This commit is contained in:
parent
73071a25b4
commit
a3477b4ff6
@ -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
|
||||
//
|
||||
|
@ -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
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user