On Tue, Aug 16, 2016 at 3:14 PM, marxin <mli...@suse.cz> wrote: > gcc/ChangeLog: > > 2016-08-16 Martin Liska <mli...@suse.cz> > > * builtins.c (fold_builtin_memchr): Support following > transformations: > memchr (x, y, 0) -> NULL > memchr ("known_string", 'n', 5) -> &"known_string" + 1 > memchr ("known_string", 'n', 1) -> NULL
Aww. Can I convince you to move this and related foldings to gimple-fold.c? Richard. > --- > gcc/builtins.c | 20 ++++++++++++++++---- > 1 file changed, 16 insertions(+), 4 deletions(-) > > diff --git a/gcc/builtins.c b/gcc/builtins.c > index 8f1c752..ac251f8 100644 > --- a/gcc/builtins.c > +++ b/gcc/builtins.c > @@ -7267,8 +7267,12 @@ fold_builtin_memchr (location_t loc, tree arg1, tree > arg2, tree len, tree type) > || !tree_fits_uhwi_p (len)) > return NULL_TREE; > > + /* If the LEN parameter is zero, return zero. */ > + if (integer_zerop (len)) > + return build_int_cst (TREE_TYPE (arg1), 0); > + > p1 = c_getstr (arg1); > - if (p1 && compare_tree_int (len, strlen (p1) + 1) <= 0) > + if (p1) > { > char c; > const char *r; > @@ -7281,9 +7285,17 @@ fold_builtin_memchr (location_t loc, tree arg1, tree > arg2, tree len, tree type) > > if (r == NULL) > return build_int_cst (TREE_TYPE (arg1), 0); > - > - tem = fold_build_pointer_plus_hwi_loc (loc, arg1, r - p1); > - return fold_convert_loc (loc, type, tem); > + else the else seems superfluous and just adds to indentation. > + { > + size_t offset = r - p1; > + if (compare_tree_int (len, offset) <= 0) > + return build_int_cst (TREE_TYPE (arg1), 0); > + else > + { > + tem = fold_build_pointer_plus_hwi_loc (loc, arg1, offset); > + return fold_convert_loc (loc, type, tem); > + } > + } > } > return NULL_TREE; > } > -- > 2.9.2 > >