re PR tree-optimization/14819 ([tree-ssa] strchr is not folded at tree-level)
authorSteven Bosscher <stevenb@suse.de>
Sun, 30 May 2004 21:05:20 +0000 (21:05 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Sun, 30 May 2004 21:05:20 +0000 (21:05 +0000)
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().

From-SVN: r82464

gcc/ChangeLog
gcc/builtins.c

index 98cd5934ca40df5fb5e6abc8123f719ed18d545d..6fd198e4472fb1d8c3e7eb174b8a2bb877ca650b 100644 (file)
@@ -1,3 +1,10 @@
+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().
+
 2004-05-30  Kazu Hirata  <kazu@cs.umass.edu>
 
        * bb-reorder.c, builtins.c, c-common.c, c-gimplify.c,
index 28eb1296b38fa7c0f914a06233525bb673696c9e..4bac9999703aa39c0b962a7013d9fc3b104fc6c6 100644 (file)
@@ -7085,6 +7085,47 @@ fold_builtin_strncpy (tree exp)
   return 0;
 }
 
+/* Fold function call to builtin 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 (build2 (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 +7837,12 @@ fold_builtin_1 (tree exp)
     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);