Gimplify va_arg ap based on do_deref

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
This commit is contained in:
Tom de Vries 2015-05-13 09:06:18 +00:00 committed by Tom de Vries
parent 7947dd0bdf
commit fcd424cecb
4 changed files with 16 additions and 28 deletions

View 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

View 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. */

View 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

View 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)