This is the mail archive of the
gcc-patches@gcc.gnu.org
mailing list for the GCC project.
[PATCH] Fix PR79908
- From: Bill Schmidt <wschmidt at linux dot vnet dot ibm dot com>
- To: GCC Patches <gcc-patches at gcc dot gnu dot org>
- Cc: Richard Biener <richard dot guenther at gmail dot com>
- Date: Mon, 13 Mar 2017 19:04:45 -0500
- Subject: [PATCH] Fix PR79908
- Authentication-results: sourceware.org; auth=none
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. The expression is not addressable, so the
gimplification fails. This patch says, hey, don't do that!
The resulting GIMPLE looks fine afterward. Bootstrapped and tested
on powerpc64le-unknown-linux-gnu with no regressions. Is this ok
for trunk?
Thanks,
Bill
[gcc]
2017-03-13 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/79908
* tree-stdarg.c (expand_ifn_va_arg_1): Don't force something to be
an lvalue that isn't addressable.
[gcc/testsuite]
2017-03-13 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR tree-optimization/79908
* gcc.dg/torture/pr79908.c: New file.
Index: gcc/testsuite/gcc.dg/torture/pr79908.c
===================================================================
--- gcc/testsuite/gcc.dg/torture/pr79908.c (nonexistent)
+++ 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 246109)
+++ gcc/tree-stdarg.c (working copy)
@@ -1057,7 +1057,7 @@ expand_ifn_va_arg_1 (function *fun)
types. */
gimplify_assign (lhs, expr, &pre);
}
- else
+ else if (is_gimple_addressable (expr))
gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
input_location = saved_location;