From 42ed6cde4bd468d169ac198ef593aa4c686e7117 Mon Sep 17 00:00:00 2001 From: Jakub Jelinek Date: Thu, 16 Jan 2014 20:54:23 +0100 Subject: [PATCH] re PR middle-end/58344 (ICE with segfault at -O1 and above on x86_64-linux-gnu) PR middle-end/58344 * expr.c (expand_expr_real_1): Handle init == NULL_TREE. * gcc.c-torture/compile/pr58344.c: New test. From-SVN: r206685 --- gcc/ChangeLog | 3 +++ gcc/expr.c | 20 ++++++++++++++++++- gcc/testsuite/ChangeLog | 3 +++ gcc/testsuite/gcc.c-torture/compile/pr58344.c | 12 +++++++++++ 4 files changed, 37 insertions(+), 1 deletion(-) create mode 100644 gcc/testsuite/gcc.c-torture/compile/pr58344.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 098e0c109c3..f7a764fc09b 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,8 @@ 2014-01-16 Jakub Jelinek + PR middle-end/58344 + * expr.c (expand_expr_real_1): Handle init == NULL_TREE. + PR target/59839 * config/i386/i386.c (ix86_expand_builtin): If target doesn't satisfy operand 0 predicate for gathers, use a new pseudo as diff --git a/gcc/expr.c b/gcc/expr.c index 400a152ce56..878a51b2510 100644 --- a/gcc/expr.c +++ b/gcc/expr.c @@ -9832,7 +9832,25 @@ expand_expr_real_1 (tree exp, rtx target, enum machine_mode tmode, || TREE_CODE (array) == CONST_DECL) && (init = ctor_for_folding (array)) != error_mark_node) { - if (TREE_CODE (init) == CONSTRUCTOR) + if (init == NULL_TREE) + { + tree value = build_zero_cst (type); + if (TREE_CODE (value) == CONSTRUCTOR) + { + /* If VALUE is a CONSTRUCTOR, this optimization is only + useful if this doesn't store the CONSTRUCTOR into + memory. If it does, it is more efficient to just + load the data from the array directly. */ + rtx ret = expand_constructor (value, target, + modifier, true); + if (ret == NULL_RTX) + value = NULL_TREE; + } + + if (value) + return expand_expr (value, target, tmode, modifier); + } + else if (TREE_CODE (init) == CONSTRUCTOR) { unsigned HOST_WIDE_INT ix; tree field, value; diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 64826502edb..fa17276b77a 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,8 @@ 2014-01-16 Jakub Jelinek + PR middle-end/58344 + * gcc.c-torture/compile/pr58344.c: New test. + PR target/59839 * gcc.target/i386/pr59839.c: New test. diff --git a/gcc/testsuite/gcc.c-torture/compile/pr58344.c b/gcc/testsuite/gcc.c-torture/compile/pr58344.c new file mode 100644 index 00000000000..42b646fed39 --- /dev/null +++ b/gcc/testsuite/gcc.c-torture/compile/pr58344.c @@ -0,0 +1,12 @@ +/* PR middle-end/58344 */ +/* { dg-do compile } */ + +struct U {}; +static struct U a[1]; +extern void bar (struct U); + +void +foo (void) +{ + bar (a[0]); +} -- 2.30.2