[PATCH] Add strchr(p, 0) -> p + strlen(p) to SimplifyLibCalls

Kai Nacke kai.nacke at redstar.de
Mon Feb 3 22:01:32 PST 2014


Thanks. Committed as R200736 with the style changes applied.

Regards,
Kai

On 02.02.2014 03:26, Duncan P. N. Exon Smith wrote:
> LGTM, with some style fix-ups:
>
>> diff --git a/lib/Transforms/Utils/SimplifyLibCalls.cpp b/lib/Transforms/Utils/SimplifyLibCalls.cpp
>> index 36d2462..7e1abf1 100644
>> --- a/lib/Transforms/Utils/SimplifyLibCalls.cpp
>> +++ b/lib/Transforms/Utils/SimplifyLibCalls.cpp
>> @@ -493,8 +493,12 @@ 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)
>
> Remove the braces on the inner if.
>
>> +        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 +2301,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
>>   //
>> diff --git a/test/Transforms/InstCombine/strchr-1.ll b/test/Transforms/InstCombine/strchr-1.ll
>> index d2c9894..f8860e3 100644
>> --- a/test/Transforms/InstCombine/strchr-1.ll
>> +++ b/test/Transforms/InstCombine/strchr-1.ll
>> @@ -63,3 +63,15 @@ define void @test_simplify5() {
>>     store i8* %dst, i8** @chp
>>     ret void
>>   }
>> +
>> +define void @test_simplify6(i8* %str) {
>
> I think you should add a comment along the lines of:
>
>    ; strchr(p, 0) -> p + strlen(p)
>
>> +; 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
>> +}
>
>
> On 2014 Feb 1, at 15:07, Kai Nacke <kai.nacke at redstar.de> wrote:
>
>> Hi everyone!
>>
>> This patch adds the transformation strchr(p, 0) -> p + strlen(p) to SimplifyLibCalls and removes the ToDo comment.
>>
>> Please review.
>>
>> Regards,
>> Kai
>> <strchr.diff>_______________________________________________
>> llvm-commits mailing list
>> llvm-commits at cs.uiuc.edu
>> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
> _______________________________________________
> llvm-commits mailing list
> llvm-commits at cs.uiuc.edu
> http://lists.cs.uiuc.edu/mailman/listinfo/llvm-commits
>
>





More information about the llvm-commits mailing list