From 730e78b04506e157c2b0f309f8250d2d9d46a77d Mon Sep 17 00:00:00 2001 From: Richard Biener Date: Thu, 17 Apr 2014 08:12:58 +0000 Subject: [PATCH] re PR c++/60836 (invalid PHI argument and ICE in verify_gimple) 2014-04-17 Richard Biener 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 --- gcc/ChangeLog | 6 +++++ gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/g++.dg/vect/pr60836.cc | 39 ++++++++++++++++++++++++++++ gcc/tree-vect-loop.c | 8 ++++-- 4 files changed, 56 insertions(+), 2 deletions(-) create mode 100644 gcc/testsuite/g++.dg/vect/pr60836.cc diff --git a/gcc/ChangeLog b/gcc/ChangeLog index a8664ea9836..abfe3186d2e 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,9 @@ +2014-04-17 Richard Biener + + 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 PR tree-optimization/60841 diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 7e9b599766f..f180aef57a1 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2014-04-17 Richard Biener + + PR tree-optimization/60836 + * g++.dg/vect/pr60836.cc: New testcase. + 2014-04-17 Richard Biener 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 00000000000..83bb1837531 --- /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 7ec079a8374..7f4209346bc 100644 --- a/gcc/tree-vect-loop.c +++ b/gcc/tree-vect-loop.c @@ -3952,8 +3952,12 @@ vect_create_epilog_for_reduction (vec 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. */ -- 2.30.2