From: Uros Bizjak Date: Fri, 18 Jan 2019 16:46:47 +0000 (+0100) Subject: alpha.c (alpha_gimplify_va_arg): Handle split indirect COMPLEX_TYPE arguments. X-Git-Tag: releases/gcc-7.5.0~652 X-Git-Url: http://git.ipfire.org/cgi-bin/gitweb.cgi?a=commitdiff_plain;h=0b7420cc6ccfc5597d03709365ed1ae6037b1006;p=thirdparty%2Fgcc.git alpha.c (alpha_gimplify_va_arg): Handle split indirect COMPLEX_TYPE arguments. * config/alpha/alpha.c (alpha_gimplify_va_arg): Handle split indirect COMPLEX_TYPE arguments. From-SVN: r268081 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 8dd7731098e1..9dc3762f8b57 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2019-01-18 Uroš Bizjak + + * config/alpha/alpha.c (alpha_gimplify_va_arg): + Handle split indirect COMPLEX_TYPE arguments. + 2019-01-16 Martin Jambor Backported from mainline @@ -8,7 +13,7 @@ we check pointers against pointers. 2019-01-09 Eric Botcazou - James Clarke + James Clarke PR target/84010 * config/sparc/sparc.c (sparc_legitimize_tls_address): Only use Pmode diff --git a/gcc/config/alpha/alpha.c b/gcc/config/alpha/alpha.c index 75a2af1e3de3..8355031bff14 100644 --- a/gcc/config/alpha/alpha.c +++ b/gcc/config/alpha/alpha.c @@ -6357,8 +6357,40 @@ alpha_gimplify_va_arg (tree valist, tree type, gimple_seq *pre_p, offset = get_initialized_tmp_var (t, pre_p, NULL); indirect = pass_by_reference (NULL, TYPE_MODE (type), type, false); + if (indirect) - type = build_pointer_type_for_mode (type, ptr_mode, true); + { + if (TREE_CODE (type) == COMPLEX_TYPE + && targetm.calls.split_complex_arg (type)) + { + tree real_part, imag_part, real_temp; + + tree ptr_type = build_pointer_type_for_mode (TREE_TYPE (type), + ptr_mode, true); + + real_part = alpha_gimplify_va_arg_1 (ptr_type, base, + offset, pre_p); + real_part = build_va_arg_indirect_ref (real_part); + + /* Copy the value into a new temporary, lest the formal temporary + be reused out from under us. */ + real_temp = get_initialized_tmp_var (real_part, pre_p, NULL); + + imag_part = alpha_gimplify_va_arg_1 (ptr_type, base, + offset, pre_p); + imag_part = build_va_arg_indirect_ref (imag_part); + + r = build2 (COMPLEX_EXPR, type, real_temp, imag_part); + + /* Stuff the offset temporary back into its field. */ + gimplify_assign (unshare_expr (offset_field), + fold_convert (TREE_TYPE (offset_field), offset), + pre_p); + return r; + } + else + type = build_pointer_type_for_mode (type, ptr_mode, true); + } /* Find the value. Note that this will be a stable indirection, or a composite of stable indirections in the case of complex. */