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
---
 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
+           {
+             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


Reply via email to