On Mon, 4 May 2015, Richard Biener wrote: > > This fixes a missed vectorization of a function in paq8p. Without > merged PHI nodes phiopt doesn't recognize adjacent MIN/MAX_EXPRs. > Certainly no other pass I schedule mergephi over cares for merged > PHIs (DCE might even be confused here). > > Bootstrap and regtest running on x86_64-unknown-linux-gnu.
So after looking at the (small) fallout I decided to go with the following instead. Bootstrapped and tested on x86_64-unknown-linux-gnu, applied to trunk. Richard. 2015-05-07 Richard Biener <rguent...@suse.de> PR tree-optimization/66002 * passes.def: Schedule another pass_merge_phi after ifcombine, right before phiopt. * gcc.dg/vect/vect-125.c: New testcase. Index: gcc/testsuite/gcc.dg/vect/vect-125.c =================================================================== *** gcc/testsuite/gcc.dg/vect/vect-125.c (revision 0) --- gcc/testsuite/gcc.dg/vect/vect-125.c (working copy) *************** *** 0 **** --- 1,19 ---- + /* { dg-do compile } */ + /* { dg-require-effective-target vect_int } */ + /* { dg-require-effective-target vect_pack_trunc } */ + /* { dg-require-effective-target vect_unpack } */ + + void train(short *t, short *w, int n, int err) + { + n=(n+7)&-8; + for (int i=0; i<n; ++i) + { + int wt=w[i]+((t[i]*err*2>>16)+1>>1); + if (wt<-32768) wt=-32768; + if (wt>32767) wt=32767; + w[i]=wt; + } + } + + /* { dg-final { scan-tree-dump "vectorized 1 loops" "vect" { xfail vect_no_int_max } } } */ + /* { dg-final { cleanup-tree-dump "vect" } } */ Index: gcc/passes.def =================================================================== *** gcc/passes.def (revision 222872) --- gcc/passes.def (working copy) *************** along with GCC; see the file COPYING3. *** 177,182 **** --- 177,183 ---- NEXT_PASS (pass_cselim); NEXT_PASS (pass_copy_prop); NEXT_PASS (pass_tree_ifcombine); + NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_phiopt); NEXT_PASS (pass_tail_recursion); NEXT_PASS (pass_ch);