On Tue, 14 Aug 2012, William J. Schmidt wrote: > Replace the once vacuously true, and now vacuously false, test for > existence of a conditional move instruction for a given mode, with one > that actually checks what it's supposed to. Add a test case so we don't > miss such things in future. > > The test is powerpc-specific. It would be good to have an i386 version > of the test as well, if someone can help with that. > > Bootstrapped and tested on powerpc64-unknown-linux-gnu with no new > regressions. Ok for trunk?
Ok if you also drop in the testcase from Andrew. Thanks, Richard. > Thanks, > Bill > > > gcc: > > 2012-08-13 Bill Schmidt <wschm...@linux.vnet.ibm.com> > > PR tree-optimization/54240 > * tree-ssa-phiopt.c (hoist_adjacent_loads): Correct test for > existence of conditional move with given mode. > > > gcc/testsuite: > > 2012-08-13 Bill Schmidt <wschm...@linux.vnet.ibm.com> > > PR tree-optimization/54240 > * gcc.target/powerpc/pr54240.c: New test. > > > Index: gcc/testsuite/gcc.target/powerpc/pr54240.c > =================================================================== > --- gcc/testsuite/gcc.target/powerpc/pr54240.c (revision 0) > +++ gcc/testsuite/gcc.target/powerpc/pr54240.c (revision 0) > @@ -0,0 +1,27 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -misel -fdump-tree-phiopt-details" } */ > + > +typedef struct s { > + int v; > + int b; > + struct s *l; > + struct s *r; > +} S; > + > + > +int foo(S *s) > +{ > + S *this; > + S *next; > + > + this = s; > + if (this->b) > + next = this->l; > + else > + next = this->r; > + > + return next->v; > +} > + > +/* { dg-final { scan-tree-dump "Hoisting adjacent loads" "phiopt1" } } */ > +/* { dg-final { cleanup-tree-dump "phiopt1" } } */ > Index: gcc/tree-ssa-phiopt.c > =================================================================== > --- gcc/tree-ssa-phiopt.c (revision 190305) > +++ gcc/tree-ssa-phiopt.c (working copy) > @@ -1843,7 +1843,8 @@ hoist_adjacent_loads (basic_block bb0, basic_block > > /* Check the mode of the arguments to be sure a conditional move > can be generated for it. */ > - if (!optab_handler (cmov_optab, TYPE_MODE (TREE_TYPE (arg1)))) > + if (optab_handler (movcc_optab, TYPE_MODE (TREE_TYPE (arg1))) > + == CODE_FOR_nothing) > continue; > > /* Both statements must be assignments whose RHS is a COMPONENT_REF. > */ > > > -- Richard Guenther <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend