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