diff options
author | Richard Biener <rguenther@suse.de> | 2014-04-17 08:12:58 +0000 |
---|---|---|
committer | Richard Biener <rguenth@gcc.gnu.org> | 2014-04-17 08:12:58 +0000 |
commit | 730e78b04506e157c2b0f309f8250d2d9d46a77d (patch) | |
tree | da4f534b6dca152e478245167157a1643b16b130 /gcc | |
parent | 1428105c0d7ca7846cb1e1ad8929f4a4dff6ea08 (diff) | |
download | gcc-730e78b04506e157c2b0f309f8250d2d9d46a77d.zip gcc-730e78b04506e157c2b0f309f8250d2d9d46a77d.tar.gz gcc-730e78b04506e157c2b0f309f8250d2d9d46a77d.tar.bz2 |
re PR c++/60836 (invalid PHI argument and ICE in verify_gimple)
2014-04-17 Richard Biener <rguenther@suse.de>
PR tree-optimization/60836
* tree-vect-loop.c (vect_create_epilog_for_reduction): Force
initial PHI args to be gimple values.
* g++.dg/vect/pr60836.cc: New testcase.
From-SVN: r209468
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 6 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 5 | ||||
-rw-r--r-- | gcc/testsuite/g++.dg/vect/pr60836.cc | 39 | ||||
-rw-r--r-- | gcc/tree-vect-loop.c | 8 |
4 files changed, 56 insertions, 2 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a8664ea..abfe318 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-04-17 Richard Biener <rguenther@suse.de> + + PR tree-optimization/60836 + * tree-vect-loop.c (vect_create_epilog_for_reduction): Force + initial PHI args to be gimple values. + 2014-04-17 Richard Biener <rguenther@suse.de> PR tree-optimization/60841 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e9b599..f180aef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-17 Richard Biener <rguenther@suse.de> + + PR tree-optimization/60836 + * g++.dg/vect/pr60836.cc: New testcase. + 2014-04-17 Richard Biener <rguenther@suse.de> PR tree-optimization/60841 diff --git a/gcc/testsuite/g++.dg/vect/pr60836.cc b/gcc/testsuite/g++.dg/vect/pr60836.cc new file mode 100644 index 0000000..83bb183 --- /dev/null +++ b/gcc/testsuite/g++.dg/vect/pr60836.cc @@ -0,0 +1,39 @@ +// { dg-do compile } + +int a, b; +typedef double (*NormFunc) (const int &); +int & +max (int &p1, int &p2) +{ + if (p1 < p2) + return p2; + return p1; +} + +struct A +{ + int operator () (int p1, int p2) + { + return max (p1, p2); + } +}; +template < class, class > double +norm_ (const int &) +{ + char c, d; + A e; + for (; a; a++) + { + b = e (b, d); + b = e (b, c); + } +} + +void +norm () +{ + static NormFunc f = norm_ < int, A >; + f = 0; +} + +// { dg-final { cleanup-tree-dump "vect" } } diff --git a/gcc/tree-vect-loop.c b/gcc/tree-vect-loop.c index 7ec079a..7f42093 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -3952,8 +3952,12 @@ vect_create_epilog_for_reduction (vec<tree> vect_defs, gimple stmt, /* Set phi nodes arguments. */ FOR_EACH_VEC_ELT (reduction_phis, i, phi) { - tree vec_init_def = vec_initial_defs[i]; - tree def = vect_defs[i]; + tree vec_init_def, def; + gimple_seq stmts; + vec_init_def = force_gimple_operand (vec_initial_defs[i], &stmts, + true, NULL_TREE); + gsi_insert_seq_on_edge_immediate (loop_preheader_edge (loop), stmts); + def = vect_defs[i]; for (j = 0; j < ncopies; j++) { /* Set the loop-entry arg of the reduction-phi. */ |