diff --git a/gcc/ChangeLog b/gcc/ChangeLog index f8c94deceef..8ba462b6e74 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2015-04-28 Tom de Vries + + PR tree-optimization/65887 + * gimplify.c (gimplify_modify_expr): Remove ifn_va_arg ap fixup. + 2015-04-28 Sandra Loosemore * doc/extend.texi (Declaring Attributes of Functions): Split into diff --git a/gcc/c-family/ChangeLog b/gcc/c-family/ChangeLog index 161504ba0cc..217aafb2df5 100644 --- a/gcc/c-family/ChangeLog +++ b/gcc/c-family/ChangeLog @@ -1,3 +1,8 @@ +2015-04-28 Tom de Vries + + PR tree-optimization/65887 + * c-common.c (build_va_arg): Mark va_arg ap argument as addressable. + 2015-04-28 Eric Botcazou Pierre-Marie de Rodat diff --git a/gcc/c-family/c-common.c b/gcc/c-family/c-common.c index 9797e1701d3..30456c6a552 100644 --- a/gcc/c-family/c-common.c +++ b/gcc/c-family/c-common.c @@ -5910,6 +5910,10 @@ set_compound_literal_name (tree decl) tree build_va_arg (location_t loc, tree expr, tree type) { + /* In gimplify_va_arg_expr we take the address of the ap argument, mark it + addressable now. */ + mark_addressable (expr); + expr = build1 (VA_ARG_EXPR, type, expr); SET_EXPR_LOCATION (expr, loc); return expr; diff --git a/gcc/gimplify.c b/gcc/gimplify.c index c68bd474756..1d5341eec5b 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4569,7 +4569,6 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, gimple assign; location_t loc = EXPR_LOCATION (*expr_p); gimple_stmt_iterator gsi; - tree ap = NULL_TREE, ap_copy = NULL_TREE; gcc_assert (TREE_CODE (*expr_p) == MODIFY_EXPR || TREE_CODE (*expr_p) == INIT_EXPR); @@ -4730,16 +4729,12 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, enum internal_fn ifn = CALL_EXPR_IFN (*from_p); auto_vec vargs (nargs); - if (ifn == IFN_VA_ARG) - ap = unshare_expr (CALL_EXPR_ARG (*from_p, 0)); for (i = 0; i < nargs; i++) { gimplify_arg (&CALL_EXPR_ARG (*from_p, i), pre_p, EXPR_LOCATION (*from_p)); vargs.quick_push (CALL_EXPR_ARG (*from_p, i)); } - if (ifn == IFN_VA_ARG) - ap_copy = CALL_EXPR_ARG (*from_p, 0); call_stmt = gimple_build_call_internal_vec (ifn, vargs); gimple_set_location (call_stmt, EXPR_LOCATION (*expr_p)); } @@ -4784,17 +4779,6 @@ gimplify_modify_expr (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, gsi = gsi_last (*pre_p); maybe_fold_stmt (&gsi); - /* When gimplifying the &ap argument of va_arg, we might end up with - ap.1 = ap - va_arg (&ap.1, 0B) - We need to assign ap.1 back to ap, otherwise va_arg has no effect on - ap. */ - if (ap != NULL_TREE - && TREE_CODE (ap) == ADDR_EXPR - && TREE_CODE (ap_copy) == ADDR_EXPR - && !operand_equal_p (TREE_OPERAND (ap, 0), TREE_OPERAND (ap_copy, 0), 0)) - gimplify_assign (TREE_OPERAND (ap, 0), TREE_OPERAND (ap_copy, 0), pre_p); - if (want_value) { *expr_p = TREE_THIS_VOLATILE (*to_p) ? *from_p : unshare_expr (*to_p);