diff mbox

[PR66010] Don't take address of ap unless necessary

Message ID 5551E7CF.9060304@mentor.com
State New
Headers show

Commit Message

Tom de Vries May 12, 2015, 11:45 a.m. UTC
On 12-05-15 12:04, Tom de Vries wrote:
> Committed with comments below added.

Hmm, this causes an ice for s390 in gcc.dg/tree-ssa/stdarg-2.c:
...
gimplification failed:
&ap <addr_expr 0x7f132f54fb20
     type <pointer_type 0x7f132f55f1f8
         type <array_type 0x7f132f53fe70 va_list type <record_type 
0x7f132f46b888 __va_list_tag>
             sizes-gimplified BLK
             size <integer_cst 0x7f132f4539f0 constant 128>
             unit size <integer_cst 0x7f132f453a08 constant 16>
             align 32 symtab 0 alias set -1 canonical type 0x7f132f46b9d8 domain 
<integer_type 0x7f132f46b930> context <translation_unit_decl 0x7f1330fa8258 D.1477>
             pointer_to_this <pointer_type 0x7f132f55f1f8>>
         unsigned SI
         size <integer_cst 0x7f132f453690 constant 32>
         unit size <integer_cst 0x7f132f4536a8 constant 4>
         align 32 symtab 0 alias set -1 canonical type 0x7f132f55f2a0>

     arg 0 <var_decl 0x7f132f549630 ap type <array_type 0x7f132f53fe70 va_list>
         addressable used BLK file stdarg-2.c line 32 col 11 size <integer_cst 
0x7f132f4539f0 128> unit size <integer_cst 0x7f132f453a08 16>
         align 32 context <function_decl 0x7f132f5434d8 f2>>
     stdarg-2.c:35:15>
stdarg-2.c: In function ‘f2’:
stdarg-2.c:35:15: internal compiler error: gimplification failed
    res = f2_1 (ap);
                ^
0xad3d02 gimplify_expr(tree_node**, gimple_statement_base**, 
gimple_statement_base**, bool (*)(tree_node*), int)
	/home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:8856
0xad5762 gimplify_va_arg_internal(tree_node*, tree_node*, 
gimple_statement_base**, gimple_statement_base**)
	/home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:9326
0x10a3349 expand_ifn_va_arg_1
	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1062
0x10a3596 expand_ifn_va_arg
	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1122
0x10a36d3 execute
	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1174
Please submit a full bug report,
with preprocessed source if appropriate.
Please include the complete backtrace with any bug report.
See <http://gcc.gnu.org/bugs.html> for instructions.
...

Attached patch is a tentative fix. I'll bootstrap and reg-test on x86_64.

Thanks,
- Tom

Comments

Pat Haugen May 12, 2015, 9:28 p.m. UTC | #1
On 05/12/2015 06:45 AM, Tom de Vries wrote:
> Hmm, this causes an ice for s390 in gcc.dg/tree-ssa/stdarg-2.c:
> ...
> gimplification failed:
> &ap <addr_expr 0x7f132f54fb20
>     type <pointer_type 0x7f132f55f1f8
>         type <array_type 0x7f132f53fe70 va_list type <record_type 
> 0x7f132f46b888 __va_list_tag>
>             sizes-gimplified BLK
>             size <integer_cst 0x7f132f4539f0 constant 128>
>             unit size <integer_cst 0x7f132f453a08 constant 16>
>             align 32 symtab 0 alias set -1 canonical type 
> 0x7f132f46b9d8 domain <integer_type 0x7f132f46b930> context 
> <translation_unit_decl 0x7f1330fa8258 D.1477>
>             pointer_to_this <pointer_type 0x7f132f55f1f8>>
>         unsigned SI
>         size <integer_cst 0x7f132f453690 constant 32>
>         unit size <integer_cst 0x7f132f4536a8 constant 4>
>         align 32 symtab 0 alias set -1 canonical type 0x7f132f55f2a0>
>
>     arg 0 <var_decl 0x7f132f549630 ap type <array_type 0x7f132f53fe70 
> va_list>
>         addressable used BLK file stdarg-2.c line 32 col 11 size 
> <integer_cst 0x7f132f4539f0 128> unit size <integer_cst 0x7f132f453a08 
> 16>
>         align 32 context <function_decl 0x7f132f5434d8 f2>>
>     stdarg-2.c:35:15>
> stdarg-2.c: In function ‘f2’:
> stdarg-2.c:35:15: internal compiler error: gimplification failed
>    res = f2_1 (ap);
>                ^
> 0xad3d02 gimplify_expr(tree_node**, gimple_statement_base**, 
> gimple_statement_base**, bool (*)(tree_node*), int)
>     /home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:8856
> 0xad5762 gimplify_va_arg_internal(tree_node*, tree_node*, 
> gimple_statement_base**, gimple_statement_base**)
>     /home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:9326
> 0x10a3349 expand_ifn_va_arg_1
>     /home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1062
> 0x10a3596 expand_ifn_va_arg
>     /home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1122
> 0x10a36d3 execute
>     /home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1174
The same failure was seen building 32-bit libgcc on powerpc64. I tried 
your patch and it works with that.

-Pat
Andreas Krebbel May 13, 2015, 5:52 a.m. UTC | #2
On 05/12/2015 01:45 PM, Tom de Vries wrote:
> On 12-05-15 12:04, Tom de Vries wrote:
>> Committed with comments below added.
> 
> Hmm, this causes an ice for s390 in gcc.dg/tree-ssa/stdarg-2.c:
> ...
> gimplification failed:
> &ap <addr_expr 0x7f132f54fb20
>      type <pointer_type 0x7f132f55f1f8
>          type <array_type 0x7f132f53fe70 va_list type <record_type 
> 0x7f132f46b888 __va_list_tag>
>              sizes-gimplified BLK
>              size <integer_cst 0x7f132f4539f0 constant 128>
>              unit size <integer_cst 0x7f132f453a08 constant 16>
>              align 32 symtab 0 alias set -1 canonical type 0x7f132f46b9d8 domain 
> <integer_type 0x7f132f46b930> context <translation_unit_decl 0x7f1330fa8258 D.1477>
>              pointer_to_this <pointer_type 0x7f132f55f1f8>>
>          unsigned SI
>          size <integer_cst 0x7f132f453690 constant 32>
>          unit size <integer_cst 0x7f132f4536a8 constant 4>
>          align 32 symtab 0 alias set -1 canonical type 0x7f132f55f2a0>
> 
>      arg 0 <var_decl 0x7f132f549630 ap type <array_type 0x7f132f53fe70 va_list>
>          addressable used BLK file stdarg-2.c line 32 col 11 size <integer_cst 
> 0x7f132f4539f0 128> unit size <integer_cst 0x7f132f453a08 16>
>          align 32 context <function_decl 0x7f132f5434d8 f2>>
>      stdarg-2.c:35:15>
> stdarg-2.c: In function ‘f2’:
> stdarg-2.c:35:15: internal compiler error: gimplification failed
>     res = f2_1 (ap);
>                 ^
> 0xad3d02 gimplify_expr(tree_node**, gimple_statement_base**, 
> gimple_statement_base**, bool (*)(tree_node*), int)
> 	/home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:8856
> 0xad5762 gimplify_va_arg_internal(tree_node*, tree_node*, 
> gimple_statement_base**, gimple_statement_base**)
> 	/home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:9326
> 0x10a3349 expand_ifn_va_arg_1
> 	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1062
> 0x10a3596 expand_ifn_va_arg
> 	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1122
> 0x10a36d3 execute
> 	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1174
> Please submit a full bug report,
> with preprocessed source if appropriate.
> Please include the complete backtrace with any bug report.
> See <http://gcc.gnu.org/bugs.html> for instructions.
> ...
> 
> Attached patch is a tentative fix. I'll bootstrap and reg-test on x86_64.

S/390 doesn't bootstrap since r223054. This patch fixes it.

-Andreas-
Richard Biener May 13, 2015, 8:55 a.m. UTC | #3
On Wed, 13 May 2015, Andreas Krebbel wrote:

> On 05/12/2015 01:45 PM, Tom de Vries wrote:
> > On 12-05-15 12:04, Tom de Vries wrote:
> >> Committed with comments below added.
> > 
> > Hmm, this causes an ice for s390 in gcc.dg/tree-ssa/stdarg-2.c:
> > ...
> > gimplification failed:
> > &ap <addr_expr 0x7f132f54fb20
> >      type <pointer_type 0x7f132f55f1f8
> >          type <array_type 0x7f132f53fe70 va_list type <record_type 
> > 0x7f132f46b888 __va_list_tag>
> >              sizes-gimplified BLK
> >              size <integer_cst 0x7f132f4539f0 constant 128>
> >              unit size <integer_cst 0x7f132f453a08 constant 16>
> >              align 32 symtab 0 alias set -1 canonical type 0x7f132f46b9d8 domain 
> > <integer_type 0x7f132f46b930> context <translation_unit_decl 0x7f1330fa8258 D.1477>
> >              pointer_to_this <pointer_type 0x7f132f55f1f8>>
> >          unsigned SI
> >          size <integer_cst 0x7f132f453690 constant 32>
> >          unit size <integer_cst 0x7f132f4536a8 constant 4>
> >          align 32 symtab 0 alias set -1 canonical type 0x7f132f55f2a0>
> > 
> >      arg 0 <var_decl 0x7f132f549630 ap type <array_type 0x7f132f53fe70 va_list>
> >          addressable used BLK file stdarg-2.c line 32 col 11 size <integer_cst 
> > 0x7f132f4539f0 128> unit size <integer_cst 0x7f132f453a08 16>
> >          align 32 context <function_decl 0x7f132f5434d8 f2>>
> >      stdarg-2.c:35:15>
> > stdarg-2.c: In function ‘f2’:
> > stdarg-2.c:35:15: internal compiler error: gimplification failed
> >     res = f2_1 (ap);
> >                 ^
> > 0xad3d02 gimplify_expr(tree_node**, gimple_statement_base**, 
> > gimple_statement_base**, bool (*)(tree_node*), int)
> > 	/home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:8856
> > 0xad5762 gimplify_va_arg_internal(tree_node*, tree_node*, 
> > gimple_statement_base**, gimple_statement_base**)
> > 	/home/vries/gcc_versions/devel/devel3/src/gcc/gimplify.c:9326
> > 0x10a3349 expand_ifn_va_arg_1
> > 	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1062
> > 0x10a3596 expand_ifn_va_arg
> > 	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1122
> > 0x10a36d3 execute
> > 	/home/vries/gcc_versions/devel/devel3/src/gcc/tree-stdarg.c:1174
> > Please submit a full bug report,
> > with preprocessed source if appropriate.
> > Please include the complete backtrace with any bug report.
> > See <http://gcc.gnu.org/bugs.html> for instructions.
> > ...
> > 
> > Attached patch is a tentative fix. I'll bootstrap and reg-test on x86_64.
> 
> S/390 doesn't bootstrap since r223054. This patch fixes it.

The patch is ok.

Richard.

> 
> -Andreas-
> 
>
diff mbox

Patch

diff --git a/gcc/gimplify.c b/gcc/gimplify.c
index 322d0ba..4846478 100644
--- a/gcc/gimplify.c
+++ b/gcc/gimplify.c
@@ -9302,32 +9302,6 @@  dummy_object (tree type)
   return build2 (MEM_REF, type, t, t);
 }
 
-/* Call the target expander for evaluating a va_arg call of VALIST
-   and TYPE.  */
-
-tree
-gimplify_va_arg_internal (tree valist, tree type, gimple_seq *pre_p,
-			  gimple_seq *post_p)
-{
-  tree have_va_type = TREE_TYPE (valist);
-  tree cano_type = targetm.canonical_va_list_type (have_va_type);
-
-  if (cano_type != NULL_TREE)
-    have_va_type = cano_type;
-
-  /* Make it easier for the backends by protecting the valist argument
-     from multiple evaluations.  */
-  if (TREE_CODE (have_va_type) == ARRAY_TYPE)
-    {
-      gcc_assert (TREE_CODE (TREE_TYPE (valist)) != ARRAY_TYPE);
-      gimplify_expr (&valist, pre_p, post_p, is_gimple_val, fb_rvalue);
-    }
-  else
-    gimplify_expr (&valist, pre_p, post_p, is_gimple_min_lval, fb_lvalue);
-
-  return targetm.gimplify_va_arg_expr (valist, type, pre_p, post_p);
-}
-
 /* Gimplify __builtin_va_arg, aka VA_ARG_EXPR, which is not really a
    builtin function, but a very special sort of operator.  */
 
diff --git a/gcc/gimplify.h b/gcc/gimplify.h
index 83bf525..615925c 100644
--- a/gcc/gimplify.h
+++ b/gcc/gimplify.h
@@ -82,7 +82,6 @@  extern void gimplify_function_tree (tree);
 extern enum gimplify_status gimplify_va_arg_expr (tree *, gimple_seq *,
 						  gimple_seq *);
 gimple gimplify_assign (tree, tree, gimple_seq *);
-extern tree gimplify_va_arg_internal (tree, tree, gimple_seq *, gimple_seq *);
 
 /* Return true if gimplify_one_sizepos doesn't need to gimplify
    expr (when in TYPE_SIZE{,_UNIT} and similar type/decl size/bitsize
diff --git a/gcc/tree-stdarg.c b/gcc/tree-stdarg.c
index 3bede7e..f8ff70a 100644
--- a/gcc/tree-stdarg.c
+++ b/gcc/tree-stdarg.c
@@ -1059,7 +1059,14 @@  expand_ifn_va_arg_1 (function *fun)
 
 	push_gimplify_context (false);
 
-	expr = gimplify_va_arg_internal (ap, type, &pre, &post);
+	/* Make it easier for the backends by protecting the valist argument
+	   from multiple evaluations.  */
+	if (do_deref == integer_one_node)
+	  gimplify_expr (&ap, &pre, &post, is_gimple_min_lval, fb_lvalue);
+	else
+	  gimplify_expr (&ap, &pre, &post, is_gimple_val, fb_rvalue);
+
+	expr = targetm.gimplify_va_arg_expr (ap, type, &pre, &post);
 
 	lhs = gimple_call_lhs (stmt);
 	if (lhs != NULL_TREE)