From 8eac49b1b601fd9eba47c14f9ebea5779446be46 Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Tue, 12 Jan 2016 11:41:16 +0000 Subject: [PATCH] re PR target/69053 (ICE in build_vector_from_val) 2016-01-12 Richard Biener PR tree-optimization/69053 * tree-vect-loop.c (get_initial_def_for_reduction): Properly convert initial value for cond reductions. * g++.dg/torture/pr69053.C: New testcase. From-SVN: r232263 --- gcc/ChangeLog | 6 ++++++ gcc/testsuite/ChangeLog | 5 +++++ gcc/testsuite/g++.dg/torture/pr69053.C | 17 +++++++++++++++++ gcc/tree-vect-loop.c | 17 +++++------------ 4 files changed, 33 insertions(+), 12 deletions(-) create mode 100644 gcc/testsuite/g++.dg/torture/pr69053.C diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 708fab405e5..afc1b277cc9 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2016-01-12 Richard Biener + + PR tree-optimization/69053 + * tree-vect-loop.c (get_initial_def_for_reduction): Properly + convert initial value for cond reductions. + 2016-01-12 Richard Biener PR tree-optimization/69007 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7829a4e45fc..d827695a3da 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2016-01-12 Richard Biener + + PR tree-optimization/69053 + * g++.dg/torture/pr69053.C: New testcase. + 2016-01-12 Richard Biener PR tree-optimization/69168 diff --git a/gcc/testsuite/g++.dg/torture/pr69053.C b/gcc/testsuite/g++.dg/torture/pr69053.C new file mode 100644 index 00000000000..4ca986c5fce --- /dev/null +++ b/gcc/testsuite/g++.dg/torture/pr69053.C @@ -0,0 +1,17 @@ +// { dg-do compile } +// { dg-additional-options "-march=core-avx2" { target x86_64-*-* i?86-*-* } } +struct A { + int *elem[1]; +}; +int a, d, e; +A *b; +int *c; +int main() +{ + int *f = 0; + for (; e; e++) + if (b->elem[e]) + f = c; + if (f) + a = d; +} diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 706a25d2d0d..0933e7eb770 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -4075,10 +4075,10 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val, tree *elts; int i; bool nested_in_vect_loop = false; - tree init_value; REAL_VALUE_TYPE real_init_val = dconst0; int int_init_val = 0; gimple *def_stmt = NULL; + gimple_seq stmts = NULL; gcc_assert (vectype); nunits = TYPE_VECTOR_SUBPARTS (vectype); @@ -4107,16 +4107,6 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val, return vect_create_destination_var (init_val, vectype); } - if (TREE_CONSTANT (init_val)) - { - if (SCALAR_FLOAT_TYPE_P (scalar_type)) - init_value = build_real (scalar_type, TREE_REAL_CST (init_val)); - else - init_value = build_int_cst (scalar_type, TREE_INT_CST_LOW (init_val)); - } - else - init_value = init_val; - switch (code) { case WIDEN_SUM_EXPR: @@ -4193,7 +4183,10 @@ get_initial_def_for_reduction (gimple *stmt, tree init_val, break; } } - init_def = build_vector_from_val (vectype, init_value); + init_val = gimple_convert (&stmts, TREE_TYPE (vectype), init_val); + if (! gimple_seq_empty_p (stmts)) + gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts); + init_def = build_vector_from_val (vectype, init_val); break; default: