[PATCH][Tree-optimization/PR89772]fold memchr builtins for character not in constant nul-padded string

JunMa JunMa@linux.alibaba.com
Mon May 6 11:58:00 GMT 2019


在 2019/5/6 下午6:02, Richard Biener 写道:
> On Thu, Mar 21, 2019 at 5:57 AM JunMa <JunMa@linux.alibaba.com> wrote:
>> Hi
>> For now, gcc can not fold code like:
>>
>> const char a[5] = "123"
>> __builtin_memchr (a, '7', sizeof a)
>>
>> It tries to avoid folding out of string length although length of a is 5.
>> This is a bit conservative, it's safe to folding memchr/bcmp/memcmp
>> builtins when constant string stores in array with some trailing nuls.
>>
>> This patch folds these cases by exposing additional length of
>> trailing nuls in c_getstr().
>> Bootstrapped/regtested on x86_64-linux, ok for trunk?
> It's probably better if gimple_fold_builtin_memchr uses string_constant
> directly instead?
We can use string_constant in gimple_fold_builtin_memchr, however it is a
bit complex to use it in memchr/memcmp constant folding.
> You are changing memcmp constant folding but only have a testcase
> for memchr.
I'll add later.
> If we decide to amend c_getstr I would rather make it return the
> total length instead of the number of trailing zeros.
I think return the total length is safe in other place as well.
I used the argument in patch since I do not want any impact on
other part at all.

Thanks
JunMa
> Richard.
>
>> Regards
>> JunMa
>>
>>
>> gcc/ChangeLog
>>
>> 2019-03-21  Jun Ma <JunMa@linux.alibaba.com>
>>
>>       PR Tree-optimization/89772
>>       * fold-const.c (c_getstr): Add new parameter to get length of
>> additional
>>       trailing nuls after constant string.
>>       * gimple-fold.c (gimple_fold_builtin_memchr): consider trailing nuls in
>>       out-of-bound accesses checking.
>>       * fold-const-call.c (fold_const_call): Likewise.
>>
>>
>> gcc/testsuite/ChangeLog
>>
>> 2019-03-21  Jun Ma <JunMa@linux.alibaba.com>
>>
>>       PR Tree-optimization/89772
>>       * gcc.dg/builtin-memchr-4.c: New test.




More information about the Gcc-patches mailing list