diff mbox

[2/3] Smarter folding of __builtin_memchr

Message ID 2f0f974b776ee917d094b78cd9b77b992988499c.1471416736.git.mliska@suse.cz
State New
Headers show

Commit Message

Martin Liška Aug. 16, 2016, 1:14 p.m. UTC
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
---
 gcc/builtins.c | 20 ++++++++++++++++----
 1 file changed, 16 insertions(+), 4 deletions(-)

Comments

Richard Biener Aug. 17, 2016, 8:41 a.m. UTC | #1
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 mbox

Patch

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;
     }