builtins.c (fold_builtin): Take decomposed arguments of CALL_EXPR.
authorKazu Hirata <kazu@cs.umass.edu>
Mon, 21 Mar 2005 14:35:08 +0000 (14:35 +0000)
committerKazu Hirata <kazu@gcc.gnu.org>
Mon, 21 Mar 2005 14:35:08 +0000 (14:35 +0000)
* 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

gcc/ChangeLog
gcc/builtins.c
gcc/fold-const.c
gcc/gimplify.c
gcc/tree-ssa-ccp.c
gcc/tree.h

index 0d36343d2fe4d48ef06e3e9a06ca9901e147d117..7adad7cbcf3c9a2ad97567a347b53d70c29810c6 100644 (file)
@@ -1,3 +1,12 @@
+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>
 
        * rtl.h (struct rtx_hooks): Add gen_lowpart_no_emit.
index e326c15376b5b299fa227a3eb01f11e672bbe063..94fa62755f5b1d22449d9edaf59683f5acfca08b 100644 (file)
@@ -8296,12 +8296,9 @@ fold_builtin_1 (tree fndecl, tree arglist, bool ignore)
    call node earlier than the warning is generated.  */
 
 tree
-fold_builtin (tree exp, bool ignore)
+fold_builtin (tree fndecl, tree arglist, bool ignore)
 {
-  tree fndecl = get_callee_fndecl (exp);
-  tree arglist = TREE_OPERAND (exp, 1);
-
-  exp = fold_builtin_1 (fndecl, arglist, ignore);
+  tree exp = fold_builtin_1 (fndecl, arglist, ignore);
   if (exp)
     {
       /* ??? Don't clobber shared nodes such as integer_zero_node.  */
index 848b167e9b7e48684067852216bd7de127cc8342..2c4404b7676d1fe023f3b4669bcd3bfa88b6e7a9 100644 (file)
@@ -9909,7 +9909,9 @@ fold_ternary (tree expr)
          && TREE_CODE (TREE_OPERAND (op0, 0)) == FUNCTION_DECL
          && 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)
            return tmp;
        }
index f16ff201694b2b942ba6d8c06b2bdccb1fd2db4a..b902ce1c97fb539044cbde7c18a49302f3affc7d 100644 (file)
@@ -1744,7 +1744,9 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
   decl = get_callee_fndecl (*expr_p);
   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)
        {
@@ -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
          && DECL_FUNCTION_CODE (decl) == BUILT_IN_VA_START)
         {
-         tree arglist = TREE_OPERAND (*expr_p, 1);
-         
          if (!arglist || !TREE_CHAIN (arglist))
            {
              error ("too few arguments to function %<va_start%>");
@@ -1802,7 +1802,9 @@ gimplify_call_expr (tree *expr_p, tree *pre_p, bool want_value)
   /* Try this again in case gimplification exposed something.  */
   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)
        {
index a14cf7f366485f4b22c5b117e1e8a39164df27cb..9bae835d7cdde8aba92a63110c6bbf6d0708124b 100644 (file)
@@ -938,6 +938,7 @@ ccp_fold (tree stmt)
       if (NUM_USES (uses) != 0)
        {
          tree *orig;
+         tree fndecl, arglist;
          size_t i;
 
          /* Preserve the original values of every operand.  */
@@ -947,7 +948,9 @@ ccp_fold (tree stmt)
 
          /* Substitute operands with their values and try to fold.  */
          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.  */
          for (i = 0; i < NUM_USES (uses); i++)
@@ -1929,7 +1932,9 @@ ccp_fold_builtin (tree stmt, tree fn)
 
   /* First try the generic builtin folder.  If that succeeds, return the
      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 (ignore)
@@ -1938,13 +1943,11 @@ ccp_fold_builtin (tree stmt, tree fn)
   }
 
   /* 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,
      we're done.  */
-  arglist = TREE_OPERAND (fn, 1);
   if (!arglist)
     return NULL_TREE;
 
index 3ad2a5142b8d070a41a7eb20e9f4a5cca06bbdfa..96d0405603183d01ef29176bed2f84a94fd2934a 100644 (file)
@@ -3563,7 +3563,7 @@ extern enum tree_code swap_tree_comparison (enum tree_code);
 extern bool ptr_difference_const (tree, tree, HOST_WIDE_INT *);
 
 /* 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_strcpy (tree, tree, tree);
 extern tree fold_builtin_strncpy (tree, tree, tree);