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. Richard. 2015-05-04 Richard Biener <rguent...@suse.de> PR tree-optimization/66002 * passes.def: Schedule pass_merge_phi after VRP, right before ifcombine and phiopt. * gcc.dg/vect/vect-125.c: New testcase. Index: gcc/passes.def =================================================================== *** gcc/passes.def (revision 222760) --- gcc/passes.def (working copy) *************** along with GCC; see the file COPYING3. *** 168,174 **** NEXT_PASS (pass_build_alias); NEXT_PASS (pass_return_slot); NEXT_PASS (pass_fre); - NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_vrp); NEXT_PASS (pass_chkp_opt); NEXT_PASS (pass_dce); --- 168,173 ---- *************** along with GCC; see the file COPYING3. *** 176,181 **** --- 175,181 ---- NEXT_PASS (pass_call_cdce); NEXT_PASS (pass_cselim); NEXT_PASS (pass_copy_prop); + NEXT_PASS (pass_merge_phi); NEXT_PASS (pass_tree_ifcombine); NEXT_PASS (pass_phiopt); NEXT_PASS (pass_tail_recursion); 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" } } */