From e4738f47290acec257b6ae1b48a8cac1e75d205a Mon Sep 17 00:00:00 2001 From: Will Schmidt Date: Wed, 2 Nov 2016 14:13:07 +0000 Subject: [PATCH] backport: re PR middle-end/72747 (powerpc: wrong code generated for vec_splats in cascading assignment) [gcc] 2016-11-02 Will Schmidt Backport from trunk 2016-10-26 Will Schmidt PR middle-end/72747 * gimplify.c (gimplify_init_constructor): Move emit of constructor assignment to earlier in the if/else logic. [gcc/testsuite] 2016-11-02 Will Schmidt Backport from trunk 2016-10-26 Will Schmidt PR middle-end/72747 * c-c++-common/pr72747-1.c: New test. * c-c++-common/pr72747-2.c: Likewise. From-SVN: r241793 --- gcc/ChangeLog | 9 +++++++++ gcc/gimplify.c | 23 +++++++++++------------ gcc/testsuite/ChangeLog | 9 +++++++++ gcc/testsuite/c-c++-common/pr72747-1.c | 16 ++++++++++++++++ gcc/testsuite/c-c++-common/pr72747-2.c | 18 ++++++++++++++++++ 5 files changed, 63 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/c-c++-common/pr72747-1.c create mode 100644 gcc/testsuite/c-c++-common/pr72747-2.c diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 7fdec07efde3..ddd152f624f0 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,12 @@ +2016-11-02 Will Schmidt + + Backport from trunk + 2016-10-26 Will Schmidt + + PR middle-end/72747 + * gimplify.c (gimplify_init_constructor): Move emit of constructor + assignment to earlier in the if/else logic. + 2016-10-29 John David Anglin * config/pa/pa.h (BIGGEST_ALIGNMENT): Adjust comment. diff --git a/gcc/gimplify.c b/gcc/gimplify.c index 46528ec8bf78..c571c66775a4 100644 --- a/gcc/gimplify.c +++ b/gcc/gimplify.c @@ -4120,24 +4120,23 @@ gimplify_init_constructor (tree *expr_p, gimple_seq *pre_p, gimple_seq *post_p, if (ret == GS_ERROR) return GS_ERROR; - else if (want_value) + /* If we have gimplified both sides of the initializer but have + not emitted an assignment, do so now. */ + if (*expr_p) + { + tree lhs = TREE_OPERAND (*expr_p, 0); + tree rhs = TREE_OPERAND (*expr_p, 1); + gassign *init = gimple_build_assign (lhs, rhs); + gimplify_seq_add_stmt (pre_p, init); + } + if (want_value) { *expr_p = object; return GS_OK; } else { - /* If we have gimplified both sides of the initializer but have - not emitted an assignment, do so now. */ - if (*expr_p) - { - tree lhs = TREE_OPERAND (*expr_p, 0); - tree rhs = TREE_OPERAND (*expr_p, 1); - gassign *init = gimple_build_assign (lhs, rhs); - gimplify_seq_add_stmt (pre_p, init); - *expr_p = NULL; - } - + *expr_p = NULL; return GS_ALL_DONE; } } diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index a85f04aebc38..c8357e517e72 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,12 @@ +2016-11-02 Will Schmidt + + Backport from trunk + 2016-10-26 Will Schmidt + + PR middle-end/72747 + * c-c++-common/pr72747-1.c: New test. + * c-c++-common/pr72747-2.c: Likewise. + 2016-11-02 Rainer Orth * lib/target-supports.exp (check_gc_sections_available): Use diff --git a/gcc/testsuite/c-c++-common/pr72747-1.c b/gcc/testsuite/c-c++-common/pr72747-1.c new file mode 100644 index 000000000000..e87069df0f66 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr72747-1.c @@ -0,0 +1,16 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-maltivec -fdump-tree-gimple" } */ + +/* PR 72747: Test that cascaded definition is happening for constant vectors. */ + +#include + +int main (int argc, char *argv[]) +{ + __vector int v1,v2; + v1 = v2 = vec_splats ((int) 42); + return 0; +} +/* { dg-final { scan-tree-dump-times " v2 = { 42, 42, 42, 42 }" 1 "gimple" } } */ + diff --git a/gcc/testsuite/c-c++-common/pr72747-2.c b/gcc/testsuite/c-c++-common/pr72747-2.c new file mode 100644 index 000000000000..24a436499079 --- /dev/null +++ b/gcc/testsuite/c-c++-common/pr72747-2.c @@ -0,0 +1,18 @@ +/* { dg-do compile } */ +/* { dg-require-effective-target powerpc_altivec_ok } */ +/* { dg-options "-c -maltivec -fdump-tree-gimple" } */ + +/* PR 72747: test that cascaded definition is happening for non constants. */ + +void foo () +{ + extern int i; + __vector int v,w; + v = w = (vector int) { i }; +} + +int main (int argc, char *argv[]) +{ + return 0; +} +/* { dg-final { scan-tree-dump-times " w = " 1 "gimple" } } */ -- 2.47.2