Commit a32e70c3 by Roger Sayle Committed by Roger Sayle

builtins.c (fold_builtin_strcpy): Merge functionality from simplify_builtin_strcpy.


	* builtins.c (fold_builtin_strcpy): Merge functionality from
	simplify_builtin_strcpy.  Add additional len argument.  No longer
	static.  Remove function prototype.
	(fold_builtin_strncpy): Likewise integrate functionality from
	simplify_builtin_strncpy.  Add additional slen argument.  No
	longer static.  Remove function prototype.
	(simplify_builtin_strcy, simplify_builtin_strncpy): Delete.
	(simplify_builtin_fputs): Rename to fold_builtin_fputs.  Change
	types of "ignore" and "unlocked" parameters to bool.
	(fold_builtin_1):  Add additional ignore argument.  Call renamed
	fold_builtin_fputs to simplify GCC "fputs" and "fputs_unlocked"
	builtins.  Update arguments to fold_builtin_strncpy and
	fold_builtin_strcpy.  Add function prototype.
	(fold_builtin): Add additional Boolean ignore argument to pass
	to fold_builtin_1.
	(simplify_builtin): Call fold_builtin_fputs, fold_builtin_strcpy
	and fold_builtin_strncpy instead of simplify_builtin_fputs,
	simplify_builtin_strcpy and simplify_builtin_strncpy respectively.

	* expr.h (simplify_builtin_fputs, simplify_builtin_strcpy,
	simplify_builtin_strncpy): Delete function prototypes.
	* tree.h (fold_builtin_fputs, fold_builtin_strcpy,
	fold_builtin_strncpy): Add function prototypes here.
	(fold_builtin): Update function prototype with new "bool ignore".

	* tree-ssa-ccp.c (ccp_fold): Update call to fold_builtin.
	(ccp_fold_builtin):  Update call to fold_builtin.  Call
	fold_builtin_fputs, fold_builtin_strcpy and fold_builtin_strncpy
	instead of simplify_builtin_fputs, simplify_builtin_strcpy and
	simplify_builtin_strncpy respectively.
	* fold-const.c (fold): Update call to fold_builtin.

From-SVN: r84302
parent ad4319ec
2004-07-08 Roger Sayle <roger@eyesopen.com>
* builtins.c (fold_builtin_strcpy): Merge functionality from
simplify_builtin_strcpy. Add additional len argument. No longer
static. Remove function prototype.
(fold_builtin_strncpy): Likewise integrate functionality from
simplify_builtin_strncpy. Add additional slen argument. No
longer static. Remove function prototype.
(simplify_builtin_strcy, simplify_builtin_strncpy): Delete.
(simplify_builtin_fputs): Rename to fold_builtin_fputs. Change
types of "ignore" and "unlocked" parameters to bool.
(fold_builtin_1): Add additional ignore argument. Call renamed
fold_builtin_fputs to simplify GCC "fputs" and "fputs_unlocked"
builtins. Update arguments to fold_builtin_strncpy and
fold_builtin_strcpy. Add function prototype.
(fold_builtin): Add additional Boolean ignore argument to pass
to fold_builtin_1.
(simplify_builtin): Call fold_builtin_fputs, fold_builtin_strcpy
and fold_builtin_strncpy instead of simplify_builtin_fputs,
simplify_builtin_strcpy and simplify_builtin_strncpy respectively.
* expr.h (simplify_builtin_fputs, simplify_builtin_strcpy,
simplify_builtin_strncpy): Delete function prototypes.
* tree.h (fold_builtin_fputs, fold_builtin_strcpy,
fold_builtin_strncpy): Add function prototypes here.
(fold_builtin): Update function prototype with new "bool ignore".
* tree-ssa-ccp.c (ccp_fold): Update call to fold_builtin.
(ccp_fold_builtin): Update call to fold_builtin. Call
fold_builtin_fputs, fold_builtin_strcpy and fold_builtin_strncpy
instead of simplify_builtin_fputs, simplify_builtin_strcpy and
simplify_builtin_strncpy respectively.
* fold-const.c (fold): Update call to fold_builtin.
2004-07-08 Alexandre Oliva <aoliva@redhat.com> 2004-07-08 Alexandre Oliva <aoliva@redhat.com>
* builtins.c (expand_builtin_stpcpy): Un-simplify decay of stpcpy * builtins.c (expand_builtin_stpcpy): Un-simplify decay of stpcpy
......
...@@ -389,9 +389,6 @@ extern void expand_builtin_setjmp_receiver (rtx); ...@@ -389,9 +389,6 @@ extern void expand_builtin_setjmp_receiver (rtx);
extern void expand_builtin_longjmp (rtx, rtx); extern void expand_builtin_longjmp (rtx, rtx);
extern rtx expand_builtin_saveregs (void); extern rtx expand_builtin_saveregs (void);
extern void expand_builtin_trap (void); extern void expand_builtin_trap (void);
extern tree simplify_builtin_fputs (tree, int, int, tree);
extern tree simplify_builtin_strcpy (tree, tree);
extern tree simplify_builtin_strncpy (tree, tree);
/* Functions from expr.c: */ /* Functions from expr.c: */
......
...@@ -8937,7 +8937,7 @@ fold (tree expr) ...@@ -8937,7 +8937,7 @@ fold (tree expr)
== FUNCTION_DECL) == FUNCTION_DECL)
&& DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (t, 0), 0))) && DECL_BUILT_IN (TREE_OPERAND (TREE_OPERAND (t, 0), 0)))
{ {
tree tmp = fold_builtin (t); tree tmp = fold_builtin (t, false);
if (tmp) if (tmp)
return tmp; return tmp;
} }
......
...@@ -950,7 +950,7 @@ ccp_fold (tree stmt) ...@@ -950,7 +950,7 @@ ccp_fold (tree stmt)
/* Substitute operands with their values and try to fold. */ /* Substitute operands with their values and try to fold. */
replace_uses_in (stmt, NULL); replace_uses_in (stmt, NULL);
retval = fold_builtin (rhs); retval = fold_builtin (rhs, false);
/* Restore operands to their original form. */ /* Restore operands to their original form. */
for (i = 0; i < NUM_USES (uses); i++) for (i = 0; i < NUM_USES (uses); i++)
...@@ -963,13 +963,7 @@ ccp_fold (tree stmt) ...@@ -963,13 +963,7 @@ ccp_fold (tree stmt)
/* If we got a simplified form, see if we need to convert its type. */ /* If we got a simplified form, see if we need to convert its type. */
if (retval) if (retval)
{ return fold_convert (TREE_TYPE (rhs), retval);
if (TREE_TYPE (retval) != TREE_TYPE (rhs))
retval = fold_convert (TREE_TYPE (rhs), retval);
if (TREE_TYPE (retval) == TREE_TYPE (rhs))
return retval;
}
/* No simplification was possible. */ /* No simplification was possible. */
return rhs; return rhs;
...@@ -2307,23 +2301,31 @@ static tree ...@@ -2307,23 +2301,31 @@ static tree
ccp_fold_builtin (tree stmt, tree fn) ccp_fold_builtin (tree stmt, tree fn)
{ {
tree result, strlen_val[2]; tree result, strlen_val[2];
tree arglist = TREE_OPERAND (fn, 1), a; tree callee, arglist, a;
tree callee = get_callee_fndecl (fn);
bitmap visited;
int strlen_arg, i; int strlen_arg, i;
bitmap visited;
bool ignore;
/* Ignore MD builtins. */ ignore = TREE_CODE (stmt) != MODIFY_EXPR;
if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
return NULL_TREE;
/* First try the generic builtin folder. If that succeeds, return the /* First try the generic builtin folder. If that succeeds, return the
result directly. */ result directly. */
result = fold_builtin (fn); result = fold_builtin (fn, ignore);
if (result) if (result)
{
if (ignore)
STRIP_NOPS (result);
return result; return result;
}
/* Ignore MD builtins. */
callee = get_callee_fndecl (fn);
if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
return NULL_TREE;
/* If the builtin could not be folded, and it has no argument list, /* If the builtin could not be folded, and it has no argument list,
we're done. */ we're done. */
arglist = TREE_OPERAND (fn, 1);
if (!arglist) if (!arglist)
return NULL_TREE; return NULL_TREE;
...@@ -2359,16 +2361,13 @@ ccp_fold_builtin (tree stmt, tree fn) ...@@ -2359,16 +2361,13 @@ ccp_fold_builtin (tree stmt, tree fn)
BITMAP_XFREE (visited); BITMAP_XFREE (visited);
/* FIXME. All this code looks dangerous in the sense that it might result = NULL_TREE;
create non-gimple expressions. */
switch (DECL_FUNCTION_CODE (callee)) switch (DECL_FUNCTION_CODE (callee))
{ {
case BUILT_IN_STRLEN: case BUILT_IN_STRLEN:
/* Convert from the internal "sizetype" type to "size_t". */ if (strlen_val[0])
if (strlen_val[0]
&& size_type_node)
{ {
tree new = convert (size_type_node, strlen_val[0]); tree new = fold_convert (TREE_TYPE (fn), strlen_val[0]);
/* If the result is not a valid gimple value, or not a cast /* If the result is not a valid gimple value, or not a cast
of a valid gimple value, then we can not use the result. */ of a valid gimple value, then we can not use the result. */
...@@ -2376,32 +2375,38 @@ ccp_fold_builtin (tree stmt, tree fn) ...@@ -2376,32 +2375,38 @@ ccp_fold_builtin (tree stmt, tree fn)
|| (is_gimple_cast (new) || (is_gimple_cast (new)
&& is_gimple_val (TREE_OPERAND (new, 0)))) && is_gimple_val (TREE_OPERAND (new, 0))))
return new; return new;
else
return NULL_TREE;
} }
return strlen_val[0]; break;
case BUILT_IN_STRCPY: case BUILT_IN_STRCPY:
if (strlen_val[1] if (strlen_val[1] && is_gimple_val (strlen_val[1]))
&& is_gimple_val (strlen_val[1])) result = fold_builtin_strcpy (fn, strlen_val[1]);
return simplify_builtin_strcpy (arglist, strlen_val[1]); break;
case BUILT_IN_STRNCPY: case BUILT_IN_STRNCPY:
if (strlen_val[1] if (strlen_val[1] && is_gimple_val (strlen_val[1]))
&& is_gimple_val (strlen_val[1])) result = fold_builtin_strncpy (fn, strlen_val[1]);
return simplify_builtin_strncpy (arglist, strlen_val[1]); break;
case BUILT_IN_FPUTS: case BUILT_IN_FPUTS:
return simplify_builtin_fputs (arglist, result = fold_builtin_fputs (arglist,
TREE_CODE (stmt) != MODIFY_EXPR, 0, TREE_CODE (stmt) != MODIFY_EXPR, 0,
strlen_val[0]); strlen_val[0]);
break;
case BUILT_IN_FPUTS_UNLOCKED: case BUILT_IN_FPUTS_UNLOCKED:
return simplify_builtin_fputs (arglist, result = fold_builtin_fputs (arglist,
TREE_CODE (stmt) != MODIFY_EXPR, 1, TREE_CODE (stmt) != MODIFY_EXPR, 1,
strlen_val[0]); strlen_val[0]);
break;
default: default:
abort (); abort ();
} }
return NULL_TREE; if (result && ignore)
STRIP_NOPS (result);
return result;
} }
......
...@@ -3423,7 +3423,10 @@ extern bool tree_swap_operands_p (tree, tree, bool); ...@@ -3423,7 +3423,10 @@ extern bool tree_swap_operands_p (tree, tree, bool);
extern enum tree_code swap_tree_comparison (enum tree_code); extern enum tree_code swap_tree_comparison (enum tree_code);
/* In builtins.c */ /* In builtins.c */
extern tree fold_builtin (tree); extern tree fold_builtin (tree, bool);
extern tree fold_builtin_fputs (tree, bool, bool, tree);
extern tree fold_builtin_strcpy (tree, tree);
extern tree fold_builtin_strncpy (tree, tree);
extern enum built_in_function builtin_mathfn_code (tree); extern enum built_in_function builtin_mathfn_code (tree);
extern tree build_function_call_expr (tree, tree); extern tree build_function_call_expr (tree, tree);
extern tree mathfn_built_in (tree, enum built_in_function fn); extern tree mathfn_built_in (tree, enum built_in_function fn);
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment