On Tue, May 7, 2019 at 4:34 AM JunMa <ju...@linux.alibaba.com> wrote:
>
> 在 2019/5/6 下午7:58, JunMa 写道:
> > 在 2019/5/6 下午6:02, Richard Biener 写道:
> >> On Thu, Mar 21, 2019 at 5:57 AM JunMa <ju...@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.
> >
>
> Although it is safe to use total length, I found that function
> inline_expand_builtin_string_cmp() which used c_getstr() may emit
> redundant rtls for trailing null chars when total length is returned.
>
> Also it is trivial to handle constant string with trailing null chars.
>
> So this updated patch follow richard's suggestion: using string_constant
> directly.
>
> Bootstrapped/regtested on x86_64-linux, ok for trunk?

Doesn't this fold to NULL for the case where seaching for '0' and it
doesn't occur in the string constant but only the zero-padding?
So you'd need to conditionalize on c being not zero (or handle
that case specially by actually finding the first zero in the padding)?
I think there was work to have all string constants zero terminated
but I'm not sure if we can rely on that here.  Bernd?

Richard.

> Regards
> JunMa
>
> gcc/ChangeLog
>
> 2019-05-07  Jun Ma <ju...@linux.alibaba.com>
>
>      PR Tree-optimization/89772
>      * gimple-fold.c (gimple_fold_builtin_memchr): consider trailing nuls in
>      out-of-bound accesses checking.
>
> gcc/testsuite/ChangeLog
>
> 2019-05-07  Jun Ma <ju...@linux.alibaba.com>
>
>      PR Tree-optimization/89772
>      * gcc.dg/builtin-memchr-4.c: New test.
> > Thanks
> > JunMa
> >> Richard.
> >>
> >>> Regards
> >>> JunMa
> >>>
> >>>
> >>> gcc/ChangeLog
> >>>
> >>> 2019-03-21  Jun Ma <ju...@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 <ju...@linux.alibaba.com>
> >>>
> >>>       PR Tree-optimization/89772
> >>>       * gcc.dg/builtin-memchr-4.c: New test.
> >
>

Reply via email to