mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-12 01:07:35 +08:00
re PR tree-optimization/14819 ([tree-ssa] strchr is not folded at tree-level)
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
This commit is contained in:
parent
9cf737f89f
commit
b3dd9f3535
@ -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,
|
||||
|
@ -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);
|
||||
|
||||
|
Loading…
Reference in New Issue
Block a user