diff mbox

[v3] Fix PR79908 (and PR80136)

Message ID 506a9fff-f866-16c5-7440-7637099c9855@linux.vnet.ibm.com
State New
Headers show

Commit Message

Bill Schmidt March 22, 2017, 3:43 p.m. UTC
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?

Thanks,
Bill


[gcc]

2017-03-21  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
            Richard Biener  <rguenth@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  <wschmidt@linux.vnet.ibm.com>
            Richard Biener  <rguenther@suse.de>

	PR tree-optimization/79908
	PR tree-optimization/80136
	* gcc.dg/torture/pr79908.c: New file.

Comments

Richard Biener March 23, 2017, 10:19 a.m. UTC | #1
On Wed, Mar 22, 2017 at 4:43 PM, Bill Schmidt
<wschmidt@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  <wschmidt@linux.vnet.ibm.com>
>             Richard Biener  <rguenth@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  <wschmidt@linux.vnet.ibm.com>
>             Richard Biener  <rguenther@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);
>
diff mbox

Patch

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