Gimplify va_arg ap based on do_deref
authorTom de Vries <tom@codesourcery.com>
Wed, 13 May 2015 09:06:18 +0000 (09:06 +0000)
committerTom de Vries <vries@gcc.gnu.org>
Wed, 13 May 2015 09:06:18 +0000 (09:06 +0000)
2015-05-13  Tom de Vries  <tom@codesourcery.com>

PR tree-optimization/66010
* gimplify.h (gimplify_va_arg_internal): Remove declaration.
* gimplify.c (gimplify_va_arg_internal): Remove and inline into ...
* tree-stdarg.c (expand_ifn_va_arg_1): ... here.  Choose between lval
and rval based on do_deref.

From-SVN: r223120

gcc/ChangeLog
gcc/gimplify.c
gcc/gimplify.h
gcc/tree-stdarg.c

index 2bb07a570233ea219646633440afb31683ce0795..c628832552423bdd38152c252018f45fa66267cf 100644 (file)
@@ -1,3 +1,11 @@
+2015-05-13  Tom de Vries  <tom@codesourcery.com>
+
+       PR tree-optimization/66010
+       * gimplify.h (gimplify_va_arg_internal): Remove declaration.
+       * gimplify.c (gimplify_va_arg_internal): Remove and inline into ...
+       * tree-stdarg.c (expand_ifn_va_arg_1): ... here.  Choose between lval
+       and rval based on do_deref.
+
 2015-05-13  Ilya Enkovich  <ilya.enkovich@intel.com>
 
        PR target/65103
index 322d0ba6ba13b11fec295bacaac84c67c97e708c..484647896e22b174fd38a1f0e410cf4c29c0e110 100644 (file)
@@ -9302,32 +9302,6 @@ dummy_object (tree type)
   return build2 (MEM_REF, type, t, t);
 }
 
-/* Call the target expander for evaluating a va_arg call of VALIST
-   and TYPE.  */
-
-tree
-gimplify_va_arg_internal (tree valist, tree type, gimple_seq *pre_p,
-                         gimple_seq *post_p)
-{
-  tree have_va_type = TREE_TYPE (valist);
-  tree cano_type = targetm.canonical_va_list_type (have_va_type);
-
-  if (cano_type != NULL_TREE)
-    have_va_type = cano_type;
-
-  /* Make it easier for the backends by protecting the valist argument
-     from multiple evaluations.  */
-  if (TREE_CODE (have_va_type) == ARRAY_TYPE)
-    {
-      gcc_assert (TREE_CODE (TREE_TYPE (valist)) != ARRAY_TYPE);
-      gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue);
-    }
-  else
-    gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
-
-  return targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p);
-}
-
 /* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a
    builtin function, but a very special sort of operator.  */
 
index 83bf52572bd42041f1843a73b56218dfcf2dce98..615925c1a78136892b3f2e250b64c4224c1b9e16 100644 (file)
@@ -82,7 +82,6 @@ extern void gimplify_function_tree (tree);
 extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
                                                  gimple_seq *);
 gimple gimplify_assign (tree, tree, gimple_seq *);
-extern tree gimplify_va_arg_internal (tree, tree, gimple_seq *, gimple_seq *);
 
 /* Return true if gimplify_one_sizepos doesn't need to gimplify
    expr (when in TYPE_SIZE{,_UNIT} and similar type/decl size/bitsize
index 3bede7efd6e3f1ce8a587042fded7b65b0790e28..f8ff70ae38feca224ac2c73f9073c41e074b400d 100644 (file)
@@ -1059,7 +1059,14 @@ expand_ifn_va_arg_1 (function *fun)
 
        push_gimplify_context (false);
 
-       expr = gimplify_va_arg_internal (ap, type, &pre, &post);
+       /* Make it easier for the backends by protecting the valist argument
+          from multiple evaluations.  */
+       if (do_deref == integer_one_node)
+         gimplify_expr (&ap, &pre, &post, is_gimple_min_lval, fb_lvalue);
+       else
+         gimplify_expr (&ap, &pre, &post, is_gimple_val, fb_rvalue);
+
+       expr = targetm.gimplify_va_arg_expr (ap, type, &pre, &post);
 
        lhs = gimple_call_lhs (stmt);
        if (lhs != NULL_TREE)