Skip to content

Commit

Permalink
PR tree-optimization/14819
Browse files Browse the repository at this point in the history
	* builtins.c (fold_builtin_strchr): New.
	(fold_builtin_1): Handle BUILT_IN_STRCHR and BUILT_IN_STRRCHR
	with fold_builtin_strchr().


git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@82464 138bc75d-0d04-0410-961f-82ee72b054a4
  • Loading branch information
kazu committed May 30, 2004
1 parent 0bed386 commit 57f5fba
Show file tree
Hide file tree
Showing 2 changed files with 54 additions and 0 deletions.
7 changes: 7 additions & 0 deletions gcc/ChangeLog
Original file line number Diff line number Diff line change
@@ -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,
Expand Down
47 changes: 47 additions & 0 deletions gcc/builtins.c
Original file line number Diff line number Diff line change
Expand Up @@ -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. */

Expand Down Expand Up @@ -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);

Expand Down

0 comments on commit 57f5fba

Please sign in to comment.