Message ID | 2f0f974b776ee917d094b78cd9b77b992988499c.1471416736.git.mliska@suse.cz |
---|---|
State | New |
Headers | show |
On Tue, Aug 16, 2016 at 3:14 PM, marxin <mliska@suse.cz> wrote: > gcc/ChangeLog: > > 2016-08-16 Martin Liska <mliska@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 > >
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 + { + 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; }