On Wed, Mar 22, 2017 at 4:43 PM, Bill Schmidt
<wschm...@linux.vnet.ibm.com> wrote:
> Hi,
>
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=79908 shows a case where
> pass_stdarg ICEs attempting to gimplify a COMPLEX_EXPR with side
> effects as an lvalue.  This occurs when the LHS of a VA_ARG has been
> cast away.  The previous patch (reverted) used force_gimple_operand
> to instantiate the necessary side effects rather than gimplify_expr
> using is_gimple_lvalue.  This proved to cause problems on some targets
> where the gimple expression produced by targetm.gimplify_va_arg_expr
> contains un-gimplified side effects using raw var_decls (see
> https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80136).  After some
> investigation, the right fix seems to be to just call
> gimplify_and_add on the expression.
>
> I've bootstrapped and tested this on powerpc64le-unknown-linux-gnu
> with no regressions.  I've also built a ppc64le->aarch64 cross and
> verified that Christophe's original report from PR80136 is now
> fixed.  I don't have immediate access to an aarch64 native system
> (compile farm authentication issues), so I would appreciate it if
> James could run a native bootstrap to see if his issues are
> resolved.
>
> Provided there are no issues uncovered with aarch64 native bootstrap,
> is this ok for trunk?

Ok.

Richard.

> Thanks,
> Bill
>
>
> [gcc]
>
> 2017-03-21  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
>             Richard Biener  <rgue...@suse.com>
>
>         PR tree-optimization/79908
>         PR tree-optimization/80136
>         * tree-stdarg.c (expand_ifn_va_arg_1): For a VA_ARG whose LHS has
>         been cast away, gimplify_and_add suffices.
>
> [gcc/testsuite]
>
> 2017-03-21  Bill Schmidt  <wschm...@linux.vnet.ibm.com>
>             Richard Biener  <rguent...@suse.de>
>
>         PR tree-optimization/79908
>         PR tree-optimization/80136
>         * gcc.dg/torture/pr79908.c: New file.
>
>
> Index: gcc/testsuite/gcc.dg/torture/pr79908.c
> ===================================================================
> --- gcc/testsuite/gcc.dg/torture/pr79908.c      (revision 246334)
> +++ gcc/testsuite/gcc.dg/torture/pr79908.c      (working copy)
> @@ -0,0 +1,12 @@
> +/* { dg-do compile } */
> +
> +/* Used to fail in the stdarg pass before fix for PR79908.  */
> +
> +typedef __builtin_va_list __gnuc_va_list;
> +typedef __gnuc_va_list va_list;
> +
> +void testva (int n, ...)
> +{
> +  va_list ap;
> +  _Complex int i = __builtin_va_arg (ap, _Complex int);
> +}
> Index: gcc/tree-stdarg.c
> ===================================================================
> --- gcc/tree-stdarg.c   (revision 246334)
> +++ gcc/tree-stdarg.c   (working copy)
> @@ -1058,7 +1058,7 @@ expand_ifn_va_arg_1 (function *fun)
>             gimplify_assign (lhs, expr, &pre);
>           }
>         else
> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
> +         gimplify_and_add (expr, &pre);
>
>         input_location = saved_location;
>         pop_gimplify_context (NULL);
>

Reply via email to