Commit 49d1af89 by Kazu Hirata Committed by Kazu Hirata

builtins.c (fold_builtin): Take decomposed arguments of CALL_EXPR.

	* builtins.c (fold_builtin): Take decomposed arguments of
	CALL_EXPR.
	* fold-const.c (fold_ternary): Update a call to fold_builtin.
	* gimplify.c (gimplify_call_expr): Likewise.
	* tree-ssa-ccp.c (ccp_fold, ccp_fold_builtin): Likewise.
	* tree.h: Update the prototype of fold_builtin.

From-SVN: r96800
parent 9ce921ab
2005-03-21 Kazu Hirata <kazu@cs.umass.edu>
* builtins.c (fold_builtin): Take decomposed arguments of
CALL_EXPR.
* fold-const.c (fold_ternary): Update a call to fold_builtin.
* gimplify.c (gimplify_call_expr): Likewise.
* tree-ssa-ccp.c (ccp_fold, ccp_fold_builtin): Likewise.
* tree.h: Update the prototype of fold_builtin.
2005-03-21 Paolo Bonzini <bonzini@gnu.org> 2005-03-21 Paolo Bonzini <bonzini@gnu.org>
* rtl.h (struct rtx_hooks): Add gen_lowpart_no_emit. * rtl.h (struct rtx_hooks): Add gen_lowpart_no_emit.
......
...@@ -8296,12 +8296,9 @@ fold_builtin_1 (tree fndecl, tree arglist, bool ignore) ...@@ -8296,12 +8296,9 @@ fold_builtin_1 (tree fndecl, tree arglist, bool ignore)
call node earlier than the warning is generated. */ call node earlier than the warning is generated. */
tree tree
fold_builtin (tree exp, bool ignore) fold_builtin (tree fndecl, tree arglist, bool ignore)
{ {
tree fndecl = get_callee_fndecl (exp); tree exp = fold_builtin_1 (fndecl, arglist, ignore);
tree arglist = TREE_OPERAND (exp, 1);
exp = fold_builtin_1 (fndecl, arglist, ignore);
if (exp) if (exp)
{ {
/* ??? Don't clobber shared nodes such as integer_zero_node. */ /* ??? Don't clobber shared nodes such as integer_zero_node. */
......
...@@ -9909,7 +9909,9 @@ fold_ternary (tree expr) ...@@ -9909,7 +9909,9 @@ fold_ternary (tree expr)
&& TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL && TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL
&& DECL_BUILT_IN (TREE_OPERAND (op0, 0))) && DECL_BUILT_IN (TREE_OPERAND (op0, 0)))
{ {
tree tmp = fold_builtin (t, false); tree fndecl = get_callee_fndecl (t);
tree arglist = TREE_OPERAND (t, 1);
tree tmp = fold_builtin (fndecl, arglist, false);
if (tmp) if (tmp)
return tmp; return tmp;
} }
......
...@@ -1744,7 +1744,9 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value) ...@@ -1744,7 +1744,9 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
decl = get_callee_fndecl (*expr_p); decl = get_callee_fndecl (*expr_p);
if (decl && DECL_BUILT_IN (decl)) if (decl && DECL_BUILT_IN (decl))
{ {
tree new = fold_builtin (*expr_p, !want_value); tree fndecl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1);
tree new = fold_builtin (fndecl, arglist, !want_value);
if (new && new != *expr_p) if (new && new != *expr_p)
{ {
...@@ -1758,8 +1760,6 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value) ...@@ -1758,8 +1760,6 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL if (DECL_BUILT_IN_CLASS (decl) == BUILT_IN_NORMAL
&& DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START) && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
{ {
tree arglist = TREE_OPERAND (*expr_p, 1);
if (!arglist || !TREE_CHAIN (arglist)) if (!arglist || !TREE_CHAIN (arglist))
{ {
error ("too few arguments to function %<va_start%>"); error ("too few arguments to function %<va_start%>");
...@@ -1802,7 +1802,9 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value) ...@@ -1802,7 +1802,9 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
/* Try this again in case gimplification exposed something. */ /* Try this again in case gimplification exposed something. */
if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl)) if (ret != GS_ERROR && decl && DECL_BUILT_IN (decl))
{ {
tree new = fold_builtin (*expr_p, !want_value); tree fndecl = get_callee_fndecl (*expr_p);
tree arglist = TREE_OPERAND (*expr_p, 1);
tree new = fold_builtin (fndecl, arglist, !want_value);
if (new && new != *expr_p) if (new && new != *expr_p)
{ {
......
...@@ -938,6 +938,7 @@ ccp_fold (tree stmt) ...@@ -938,6 +938,7 @@ ccp_fold (tree stmt)
if (NUM_USES (uses) != 0) if (NUM_USES (uses) != 0)
{ {
tree *orig; tree *orig;
tree fndecl, arglist;
size_t i; size_t i;
/* Preserve the original values of every operand. */ /* Preserve the original values of every operand. */
...@@ -947,7 +948,9 @@ ccp_fold (tree stmt) ...@@ -947,7 +948,9 @@ 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, false); fndecl = get_callee_fndecl (rhs);
arglist = TREE_OPERAND (rhs, 1);
retval = fold_builtin (fndecl, arglist, 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++)
...@@ -1929,7 +1932,9 @@ ccp_fold_builtin (tree stmt, tree fn) ...@@ -1929,7 +1932,9 @@ ccp_fold_builtin (tree stmt, tree fn)
/* 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, ignore); callee = get_callee_fndecl (fn);
arglist = TREE_OPERAND (fn, 1);
result = fold_builtin (callee, arglist, ignore);
if (result) if (result)
{ {
if (ignore) if (ignore)
...@@ -1938,13 +1943,11 @@ ccp_fold_builtin (tree stmt, tree fn) ...@@ -1938,13 +1943,11 @@ ccp_fold_builtin (tree stmt, tree fn)
} }
/* Ignore MD builtins. */ /* Ignore MD builtins. */
callee = get_callee_fndecl (fn);
if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD) if (DECL_BUILT_IN_CLASS (callee) == BUILT_IN_MD)
return NULL_TREE; 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;
......
...@@ -3563,7 +3563,7 @@ extern enum tree_code swap_tree_comparison (enum tree_code); ...@@ -3563,7 +3563,7 @@ extern enum tree_code swap_tree_comparison (enum tree_code);
extern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *); extern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *);
/* In builtins.c */ /* In builtins.c */
extern tree fold_builtin (tree, bool); extern tree fold_builtin (tree, tree, bool);
extern tree fold_builtin_fputs (tree, bool, bool, tree); extern tree fold_builtin_fputs (tree, bool, bool, tree);
extern tree fold_builtin_strcpy (tree, tree, tree); extern tree fold_builtin_strcpy (tree, tree, tree);
extern tree fold_builtin_strncpy (tree, tree, tree); extern tree fold_builtin_strncpy (tree, tree, tree);
......
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