[v2] Fix PR79908

Message ID 84021880-52c1-38ad-ea08-29448b60b570@linux.vnet.ibm.com
State New
Headers show

Commit Message

Bill Schmidt March 20, 2017, 7:15 p.m.
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.  This patch, credit to Richard Biener, uses
force_gimple_operand to instantiate the necessary side effects rather
than gimplify_expr using is_gimple_lvalue.  The test case is taken
wholesale from the bug report.

Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
regressions.  Is this ok for trunk?

Thanks,
Bill


[gcc]

2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
            Richard Biener  <rguenth@suse.com>

	PR tree-optimization/79908
	* tree-stdarg.c (expand_ifn_va_arg_1): For a VA_ARG whose LHS has
	been cast away, use force_gimple_operand to construct the side
	effects.

[gcc/testsuite]

2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
            Richard Biener  <rguenther@suse.de>

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

Comments

Richard Biener March 21, 2017, 8:03 a.m. | #1
On Mon, Mar 20, 2017 at 8:15 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.  This patch, credit to Richard Biener, uses
> force_gimple_operand to instantiate the necessary side effects rather
> than gimplify_expr using is_gimple_lvalue.  The test case is taken
> wholesale from the bug report.
>
> Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
> regressions.  Is this ok for trunk?

Ok!

Thanks,
Richard.

> Thanks,
> Bill
>
>
> [gcc]
>
> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>             Richard Biener  <rguenth@suse.com>
>
>         PR tree-optimization/79908
>         * tree-stdarg.c (expand_ifn_va_arg_1): For a VA_ARG whose LHS has
>         been cast away, use force_gimple_operand to construct the side
>         effects.
>
> [gcc/testsuite]
>
> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>             Richard Biener  <rguenther@suse.de>
>
>         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 246286)
> +++ gcc/tree-stdarg.c   (working copy)
> @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.  If not see
>  #include "gimple-iterator.h"
>  #include "gimple-walk.h"
>  #include "gimplify.h"
> +#include "gimplify-me.h"
>  #include "tree-into-ssa.h"
>  #include "tree-cfg.h"
>  #include "tree-stdarg.h"
> @@ -1058,12 +1059,16 @@ expand_ifn_va_arg_1 (function *fun)
>             gimplify_assign (lhs, expr, &pre);
>           }
>         else
> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
> +         {
> +           gimple_seq tmp_seq;
> +           force_gimple_operand (expr, &tmp_seq, false, NULL_TREE);
> +           gimple_seq_add_seq_without_update (&pre, tmp_seq);
> +         }
>
>         input_location = saved_location;
>         pop_gimplify_context (NULL);
>
> -       gimple_seq_add_seq (&pre, post);
> +       gimple_seq_add_seq_without_update (&pre, post);
>         update_modified_stmts (pre);
>
>         /* Add the sequence after IFN_VA_ARG.  This splits the bb right
> @@ -1072,11 +1077,10 @@ expand_ifn_va_arg_1 (function *fun)
>         gimple_find_sub_bbs (pre, &i);
>
>         /* Remove the IFN_VA_ARG gimple_call.  It's the last stmt in the
> -          bb.  */
> +          bb if we added any stmts.  */
>         unlink_stmt_vdef (stmt);
>         release_ssa_name_fn (fun, gimple_vdef (stmt));
>         gsi_remove (&i, true);
> -       gcc_assert (gsi_end_p (i));
>
>         /* We're walking here into the bbs which contain the expansion of
>            IFN_VA_ARG, and will not contain another IFN_VA_ARG that needs
>
Christophe Lyon March 21, 2017, 3:18 p.m. | #2
Hi

On 21 March 2017 at 09:03, Richard Biener <richard.guenther@gmail.com> wrote:
> On Mon, Mar 20, 2017 at 8:15 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.  This patch, credit to Richard Biener, uses
>> force_gimple_operand to instantiate the necessary side effects rather
>> than gimplify_expr using is_gimple_lvalue.  The test case is taken
>> wholesale from the bug report.
>>
>> Bootstrapped and tested on powerpc64le-unknown-linux-gnu with no
>> regressions.  Is this ok for trunk?
>
> Ok!
>

Since this was committed (r246319), I've noticed that
GCC cross-compiler fails to build glibc for target aarch64-linux-gnu.

I'm seeing:
In function '_IO_vfscanf_internal':
cc1: internal compiler error: in gimplify_modify_expr, at gimplify.c:5627
0x8ae5bf gimplify_modify_expr
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:5627
0x8902b4 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11198
0x8963c8 gimplify_stmt(tree_node**, gimple**)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
0x89bf55 gimplify_cond_expr
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3971
0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-In function '_IO_vfscanf_internal':
cc1: internal compiler error: in gimplify_modify_expr, at gimplify.c:5627
0x8ae5bf gimplify_modify_expr
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:5627
0x8902b4 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11198
0x8963c8 gimplify_stmt(tree_node**, gimple**)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
0x89bf55 gimplify_cond_expr
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3971
0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
0x8963c8 gimplify_stmt(tree_node**, gimple**)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
0x89b803 gimplify_cond_expr
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3864
0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
0x89328f gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11356
0x8b49f9 force_gimple_operand_1(tree_node*, gimple**, bool
(*)(tree_node*), tree_node*)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify-me.c:78
0xda0f16 expand_ifn_va_arg_1
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1064
0xda0f16 expand_ifn_va_arg
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1105
0xda494b execute
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1158
gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
0x8963c8 gimplify_stmt(tree_node**, gimple**)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
0x89b803 gimplify_cond_expr
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3864
0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
0x89328f gimplify_expr(tree_node**, gimple**, gimple**, bool
(*)(tree_node*), int)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11356
0x8b49f9 force_gimple_operand_1(tree_node*, gimple**, bool
(*)(tree_node*), tree_node*)
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify-me.c:78
0xda0f16 expand_ifn_va_arg_1
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1064
0xda0f16 expand_ifn_va_arg
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1105
0xda494b execute
        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1158


I can start a manual build if you need a .i file.

Thanks,

Christophe

> Thanks,
> Richard.
>
>> Thanks,
>> Bill
>>
>>
>> [gcc]
>>
>> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>>             Richard Biener  <rguenth@suse.com>
>>
>>         PR tree-optimization/79908
>>         * tree-stdarg.c (expand_ifn_va_arg_1): For a VA_ARG whose LHS has
>>         been cast away, use force_gimple_operand to construct the side
>>         effects.
>>
>> [gcc/testsuite]
>>
>> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>>             Richard Biener  <rguenther@suse.de>
>>
>>         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 246286)
>> +++ gcc/tree-stdarg.c   (working copy)
>> @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.  If not see
>>  #include "gimple-iterator.h"
>>  #include "gimple-walk.h"
>>  #include "gimplify.h"
>> +#include "gimplify-me.h"
>>  #include "tree-into-ssa.h"
>>  #include "tree-cfg.h"
>>  #include "tree-stdarg.h"
>> @@ -1058,12 +1059,16 @@ expand_ifn_va_arg_1 (function *fun)
>>             gimplify_assign (lhs, expr, &pre);
>>           }
>>         else
>> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
>> +         {
>> +           gimple_seq tmp_seq;
>> +           force_gimple_operand (expr, &tmp_seq, false, NULL_TREE);
>> +           gimple_seq_add_seq_without_update (&pre, tmp_seq);
>> +         }
>>
>>         input_location = saved_location;
>>         pop_gimplify_context (NULL);
>>
>> -       gimple_seq_add_seq (&pre, post);
>> +       gimple_seq_add_seq_without_update (&pre, post);
>>         update_modified_stmts (pre);
>>
>>         /* Add the sequence after IFN_VA_ARG.  This splits the bb right
>> @@ -1072,11 +1077,10 @@ expand_ifn_va_arg_1 (function *fun)
>>         gimple_find_sub_bbs (pre, &i);
>>
>>         /* Remove the IFN_VA_ARG gimple_call.  It's the last stmt in the
>> -          bb.  */
>> +          bb if we added any stmts.  */
>>         unlink_stmt_vdef (stmt);
>>         release_ssa_name_fn (fun, gimple_vdef (stmt));
>>         gsi_remove (&i, true);
>> -       gcc_assert (gsi_end_p (i));
>>
>>         /* We're walking here into the bbs which contain the expansion of
>>            IFN_VA_ARG, and will not contain another IFN_VA_ARG that needs
>>
Bill Schmidt March 21, 2017, 3:54 p.m. | #3
On Mar 21, 2017, at 10:18 AM, Christophe Lyon <christophe.lyon@linaro.org> wrote:
> 
> Since this was committed (r246319), I've noticed that
> GCC cross-compiler fails to build glibc for target aarch64-linux-gnu.
> 
> I'm seeing:
> In function '_IO_vfscanf_internal':
> cc1: internal compiler error: in gimplify_modify_expr, at gimplify.c:5627
> 0x8ae5bf gimplify_modify_expr
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:5627
> 0x8902b4 gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11198
> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
> 0x89bf55 gimplify_cond_expr
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3971
> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-In function '_IO_vfscanf_internal':
> cc1: internal compiler error: in gimplify_modify_expr, at gimplify.c:5627
> 0x8ae5bf gimplify_modify_expr
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:5627
> 0x8902b4 gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11198
> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
> 0x89bf55 gimplify_cond_expr
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3971
> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
> 0x89b803 gimplify_cond_expr
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3864
> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
> 0x89328f gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11356
> 0x8b49f9 force_gimple_operand_1(tree_node*, gimple**, bool
> (*)(tree_node*), tree_node*)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify-me.c:78
> 0xda0f16 expand_ifn_va_arg_1
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1064
> 0xda0f16 expand_ifn_va_arg
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1105
> 0xda494b execute
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1158
> gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
> 0x89b803 gimplify_cond_expr
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3864
> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
> 0x89328f gimplify_expr(tree_node**, gimple**, gimple**, bool
> (*)(tree_node*), int)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11356
> 0x8b49f9 force_gimple_operand_1(tree_node*, gimple**, bool
> (*)(tree_node*), tree_node*)
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify-me.c:78
> 0xda0f16 expand_ifn_va_arg_1
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1064
> 0xda0f16 expand_ifn_va_arg
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1105
> 0xda494b execute
>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1158
> 
> 
> I can start a manual build if you need a .i file.

Yes, please!  Please open a PR for tracking and CC me (wschmidt@gcc.gnu.org); I'll investigate.

Bill

> 
> Thanks,
> 
> Christophe
> 
>> Thanks,
>> Richard.
>> 
>>> Thanks,
>>> Bill
>>> 
>>> 
>>> [gcc]
>>> 
>>> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>>>            Richard Biener  <rguenth@suse.com>
>>> 
>>>        PR tree-optimization/79908
>>>        * tree-stdarg.c (expand_ifn_va_arg_1): For a VA_ARG whose LHS has
>>>        been cast away, use force_gimple_operand to construct the side
>>>        effects.
>>> 
>>> [gcc/testsuite]
>>> 
>>> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>>>            Richard Biener  <rguenther@suse.de>
>>> 
>>>        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 246286)
>>> +++ gcc/tree-stdarg.c   (working copy)
>>> @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.  If not see
>>> #include "gimple-iterator.h"
>>> #include "gimple-walk.h"
>>> #include "gimplify.h"
>>> +#include "gimplify-me.h"
>>> #include "tree-into-ssa.h"
>>> #include "tree-cfg.h"
>>> #include "tree-stdarg.h"
>>> @@ -1058,12 +1059,16 @@ expand_ifn_va_arg_1 (function *fun)
>>>            gimplify_assign (lhs, expr, &pre);
>>>          }
>>>        else
>>> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
>>> +         {
>>> +           gimple_seq tmp_seq;
>>> +           force_gimple_operand (expr, &tmp_seq, false, NULL_TREE);
>>> +           gimple_seq_add_seq_without_update (&pre, tmp_seq);
>>> +         }
>>> 
>>>        input_location = saved_location;
>>>        pop_gimplify_context (NULL);
>>> 
>>> -       gimple_seq_add_seq (&pre, post);
>>> +       gimple_seq_add_seq_without_update (&pre, post);
>>>        update_modified_stmts (pre);
>>> 
>>>        /* Add the sequence after IFN_VA_ARG.  This splits the bb right
>>> @@ -1072,11 +1077,10 @@ expand_ifn_va_arg_1 (function *fun)
>>>        gimple_find_sub_bbs (pre, &i);
>>> 
>>>        /* Remove the IFN_VA_ARG gimple_call.  It's the last stmt in the
>>> -          bb.  */
>>> +          bb if we added any stmts.  */
>>>        unlink_stmt_vdef (stmt);
>>>        release_ssa_name_fn (fun, gimple_vdef (stmt));
>>>        gsi_remove (&i, true);
>>> -       gcc_assert (gsi_end_p (i));
>>> 
>>>        /* We're walking here into the bbs which contain the expansion of
>>>           IFN_VA_ARG, and will not contain another IFN_VA_ARG that needs
>>> 
>
Christophe Lyon March 21, 2017, 5:28 p.m. | #4
On 21 March 2017 at 16:54, Bill Schmidt <wschmidt@linux.vnet.ibm.com> wrote:
> On Mar 21, 2017, at 10:18 AM, Christophe Lyon <christophe.lyon@linaro.org> wrote:
>>
>> Since this was committed (r246319), I've noticed that
>> GCC cross-compiler fails to build glibc for target aarch64-linux-gnu.
>>
>> I'm seeing:
>> In function '_IO_vfscanf_internal':
>> cc1: internal compiler error: in gimplify_modify_expr, at gimplify.c:5627
>> 0x8ae5bf gimplify_modify_expr
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:5627
>> 0x8902b4 gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11198
>> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
>> 0x89bf55 gimplify_cond_expr
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3971
>> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-In function '_IO_vfscanf_internal':
>> cc1: internal compiler error: in gimplify_modify_expr, at gimplify.c:5627
>> 0x8ae5bf gimplify_modify_expr
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:5627
>> 0x8902b4 gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11198
>> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
>> 0x89bf55 gimplify_cond_expr
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3971
>> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
>> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
>> 0x89b803 gimplify_cond_expr
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3864
>> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
>> 0x89328f gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11356
>> 0x8b49f9 force_gimple_operand_1(tree_node*, gimple**, bool
>> (*)(tree_node*), tree_node*)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify-me.c:78
>> 0xda0f16 expand_ifn_va_arg_1
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1064
>> 0xda0f16 expand_ifn_va_arg
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1105
>> 0xda494b execute
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1158
>> gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
>> 0x8963c8 gimplify_stmt(tree_node**, gimple**)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:6477
>> 0x89b803 gimplify_cond_expr
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:3864
>> 0x890273 gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11154
>> 0x89328f gimplify_expr(tree_node**, gimple**, gimple**, bool
>> (*)(tree_node*), int)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify.c:11356
>> 0x8b49f9 force_gimple_operand_1(tree_node*, gimple**, bool
>> (*)(tree_node*), tree_node*)
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/gimplify-me.c:78
>> 0xda0f16 expand_ifn_va_arg_1
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1064
>> 0xda0f16 expand_ifn_va_arg
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1105
>> 0xda494b execute
>>        /tmp/1882393_6.tmpdir/aci-gcc-fsf/sources/gcc-fsf/gccsrc/gcc/tree-stdarg.c:1158
>>
>>
>> I can start a manual build if you need a .i file.
>
> Yes, please!  Please open a PR for tracking and CC me (wschmidt@gcc.gnu.org); I'll investigate.
>
OK, I've filed PR 80136.

Thanks,

Christophe

> Bill
>
>>
>> Thanks,
>>
>> Christophe
>>
>>> Thanks,
>>> Richard.
>>>
>>>> Thanks,
>>>> Bill
>>>>
>>>>
>>>> [gcc]
>>>>
>>>> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>>>>            Richard Biener  <rguenth@suse.com>
>>>>
>>>>        PR tree-optimization/79908
>>>>        * tree-stdarg.c (expand_ifn_va_arg_1): For a VA_ARG whose LHS has
>>>>        been cast away, use force_gimple_operand to construct the side
>>>>        effects.
>>>>
>>>> [gcc/testsuite]
>>>>
>>>> 2017-03-20  Bill Schmidt  <wschmidt@linux.vnet.ibm.com>
>>>>            Richard Biener  <rguenther@suse.de>
>>>>
>>>>        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 246286)
>>>> +++ gcc/tree-stdarg.c   (working copy)
>>>> @@ -33,6 +33,7 @@ along with GCC; see the file COPYING3.  If not see
>>>> #include "gimple-iterator.h"
>>>> #include "gimple-walk.h"
>>>> #include "gimplify.h"
>>>> +#include "gimplify-me.h"
>>>> #include "tree-into-ssa.h"
>>>> #include "tree-cfg.h"
>>>> #include "tree-stdarg.h"
>>>> @@ -1058,12 +1059,16 @@ expand_ifn_va_arg_1 (function *fun)
>>>>            gimplify_assign (lhs, expr, &pre);
>>>>          }
>>>>        else
>>>> -         gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
>>>> +         {
>>>> +           gimple_seq tmp_seq;
>>>> +           force_gimple_operand (expr, &tmp_seq, false, NULL_TREE);
>>>> +           gimple_seq_add_seq_without_update (&pre, tmp_seq);
>>>> +         }
>>>>
>>>>        input_location = saved_location;
>>>>        pop_gimplify_context (NULL);
>>>>
>>>> -       gimple_seq_add_seq (&pre, post);
>>>> +       gimple_seq_add_seq_without_update (&pre, post);
>>>>        update_modified_stmts (pre);
>>>>
>>>>        /* Add the sequence after IFN_VA_ARG.  This splits the bb right
>>>> @@ -1072,11 +1077,10 @@ expand_ifn_va_arg_1 (function *fun)
>>>>        gimple_find_sub_bbs (pre, &i);
>>>>
>>>>        /* Remove the IFN_VA_ARG gimple_call.  It's the last stmt in the
>>>> -          bb.  */
>>>> +          bb if we added any stmts.  */
>>>>        unlink_stmt_vdef (stmt);
>>>>        release_ssa_name_fn (fun, gimple_vdef (stmt));
>>>>        gsi_remove (&i, true);
>>>> -       gcc_assert (gsi_end_p (i));
>>>>
>>>>        /* We're walking here into the bbs which contain the expansion of
>>>>           IFN_VA_ARG, and will not contain another IFN_VA_ARG that needs
>>>>
>>
>

Patch

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 246286)
+++ gcc/tree-stdarg.c	(working copy)
@@ -33,6 +33,7 @@  along with GCC; see the file COPYING3.  If not see
 #include "gimple-iterator.h"
 #include "gimple-walk.h"
 #include "gimplify.h"
+#include "gimplify-me.h"
 #include "tree-into-ssa.h"
 #include "tree-cfg.h"
 #include "tree-stdarg.h"
@@ -1058,12 +1059,16 @@  expand_ifn_va_arg_1 (function *fun)
 	    gimplify_assign (lhs, expr, &pre);
 	  }
 	else
-	  gimplify_expr (&expr, &pre, &post, is_gimple_lvalue, fb_lvalue);
+	  {
+	    gimple_seq tmp_seq;
+	    force_gimple_operand (expr, &tmp_seq, false, NULL_TREE);
+	    gimple_seq_add_seq_without_update (&pre, tmp_seq);
+	  }
 
 	input_location = saved_location;
 	pop_gimplify_context (NULL);
 
-	gimple_seq_add_seq (&pre, post);
+	gimple_seq_add_seq_without_update (&pre, post);
 	update_modified_stmts (pre);
 
 	/* Add the sequence after IFN_VA_ARG.  This splits the bb right
@@ -1072,11 +1077,10 @@  expand_ifn_va_arg_1 (function *fun)
 	gimple_find_sub_bbs (pre, &i);
 
 	/* Remove the IFN_VA_ARG gimple_call.  It's the last stmt in the
-	   bb.  */
+	   bb if we added any stmts.  */
 	unlink_stmt_vdef (stmt);
 	release_ssa_name_fn (fun, gimple_vdef (stmt));
 	gsi_remove (&i, true);
-	gcc_assert (gsi_end_p (i));
 
 	/* We're walking here into the bbs which contain the expansion of
 	   IFN_VA_ARG, and will not contain another IFN_VA_ARG that needs