This is the mail archive of the gcc-patches@gcc.gnu.org mailing list for the GCC project.


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]
Other format: [Raw text]

[patch] buitlins.c: Fix tree-optimization/14819. (take 2)


Hi,

Attached is an updated patch to fix tree-optimization/14819.

The older version was posted at:

  http://gcc.gnu.org/ml/gcc-patches/2004-05/msg01275.html

Tested on i686-pc-linux-gnu.  OK to apply?

Kazu Hirata

2004-05-30  Steven Bosscher  <stevenb@suse.de>

	PR tree-optimization/14819
	* builtins.c (fold_builtin_strchr): New.
	(fold_builtin_1): Handle BUILT_IN_STRCHR and BUILT_IN_STRRCHR
	with fold_builtin_strchr().

Index: builtins.c
===================================================================
RCS file: /cvs/gcc/gcc/gcc/builtins.c,v
retrieving revision 1.326
diff -u -r1.326 builtins.c
--- builtins.c	24 May 2004 16:37:17 -0000	1.326
+++ builtins.c	30 May 2004 06:07:31 -0000
@@ -7085,6 +7085,46 @@
   return 0;
 }
 
+/* Fold function call to buitlin strchr and strrchr.
+   Return NULL_TREE if no simplification can be made.  */
+static tree
+fold_builtin_strchr (tree exp, bool actually_strrchr)
+{
+  tree arglist = TREE_OPERAND (exp, 1);
+  if (!validate_arglist (arglist, POINTER_TYPE, INTEGER_TYPE, VOID_TYPE))
+    return 0;
+  else
+    {
+      tree s1 = TREE_VALUE (arglist), s2 = TREE_VALUE (TREE_CHAIN (arglist));
+      const char *p1;
+
+      if (TREE_CODE (s2) != INTEGER_CST)
+	return 0;
+
+      p1 = c_getstr (s1);
+      if (p1 != NULL)
+	{
+	  char c;
+	  const char *r;
+
+	  if (target_char_cast (s2, &c))
+	    return 0;
+
+	  r = actually_strrchr ? strrchr (p1, c) : strchr (p1, c);
+
+	  if (r == NULL)
+	    return fold_convert (TREE_TYPE (s1), integer_zero_node);
+
+	  /* Return an offset into the constant string argument.  */
+	  return fold (build (PLUS_EXPR, TREE_TYPE (s1),
+			      s1, fold_convert (TREE_TYPE (s1),
+						ssize_int (r - p1))));
+	}
+
+      return 0;
+    }
+}
+
 /* Fold function call to builtin memcmp.  Return
    NULL_TREE if no simplification can be made.  */
 
@@ -7796,6 +7836,12 @@
     case BUILT_IN_STRNCPY:
       return fold_builtin_strncpy (exp);
 
+    case BUILT_IN_STRCHR:
+      return fold_builtin_strchr (exp, false);
+
+    case BUILT_IN_STRRCHR:
+      return fold_builtin_strchr (exp, true);
+
     case BUILT_IN_MEMCMP:
       return fold_builtin_memcmp (exp);
 


Index Nav: [Date Index] [Subject Index] [Author Index] [Thread Index]
Message Nav: [Date Prev] [Date Next] [Thread Prev] [Thread Next]