diff options
author | Richard Biener <rguenther@suse.de> | 2016-01-12 11:41:16 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2016-01-12 11:41:16 +0000 |
commit | 8eac49b1b601fd9eba47c14f9ebea5779446be46 (patch) | |
tree | ce7f132db431a5b8414735154118818516dc833e /gcc | |
parent | 5b723b6806dc86853fff5a1b30b9c505f870e800 (diff) | |
download | gcc-8eac49b1b601fd9eba47c14f9ebea5779446be46.zip gcc-8eac49b1b601fd9eba47c14f9ebea5779446be46.tar.gz gcc-8eac49b1b601fd9eba47c14f9ebea5779446be46.tar.bz2 |
re PR target/69053 (ICE in build_vector_from_val)
2016-01-12 Richard Biener <rguenther@suse.de>
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/torture/pr69053.C | 17 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 17 |
4 files changed, 33 insertions, 12 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 708fab4..afc1b27 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,11 @@ 2016-01-12 Richard Biener <rguenther@suse.de> + 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 <rguenther@suse.de> + PR tree-optimization/69007 * tree-vect-patterns.c (vect_vect_recog_func_ptrs): Move widen_sum after dot_prod and sad. diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7829a4e..d827695 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,5 +1,10 @@ 2016-01-12 Richard Biener <rguenther@suse.de> + PR tree-optimization/69053 + * g++.dg/torture/pr69053.C: New testcase. + +2016-01-12 Richard Biener <rguenther@suse.de> + PR tree-optimization/69168 * gcc.dg/torture/pr69168.c: New testcase. diff --git a/gcc/testsuite/g++.dg/torture/pr69053.C b/gcc/testsuite/g++.dg/torture/pr69053.C new file mode 100644 index 0000000..4ca986c --- /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 706a25d..0933e7e 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: |