On Thu, 7 Mar 2013, Jakub Jelinek wrote: > Hi! > > During zero_one_operation I believe we can count in the chain having single > uses if we go through rhs1s, but the change from last year also added > looking through rhs2, and there I don't see anything that would guarantee > a single use, and the following testcase shows where it has two uses. > > If it has more than one use, obviously we can't change the pow call just > because in one of the uses we'd like to remove one multiplication. > > Bootstrapped/regtested on x86_64-linux and i686-linux, ok for trunk?
Ok. Thanks, Richard. > 2013-03-07 Jakub Jelinek <ja...@redhat.com> > > PR tree-optimization/56559 > * tree-ssa-reassoc.c (zero_one_operation): When looking at rhs2, > check that it has only a single use. > > * gcc.dg/tree-ssa/reassoc-26.c: New test. > > --- gcc/tree-ssa-reassoc.c.jj 2013-02-18 16:39:55.000000000 +0100 > +++ gcc/tree-ssa-reassoc.c 2013-03-07 10:09:22.048925800 +0100 > @@ -1107,7 +1107,8 @@ zero_one_operation (tree *def, enum tree > the operand might be hiding in the rightmost one. */ > if (opcode == MULT_EXPR > && gimple_assign_rhs_code (stmt) == opcode > - && TREE_CODE (gimple_assign_rhs2 (stmt)) == SSA_NAME) > + && TREE_CODE (gimple_assign_rhs2 (stmt)) == SSA_NAME > + && has_single_use (gimple_assign_rhs2 (stmt))) > { > gimple stmt2 = SSA_NAME_DEF_STMT (gimple_assign_rhs2 (stmt)); > if (stmt_is_power_of_op (stmt2, op)) > --- gcc/testsuite/gcc.dg/tree-ssa/reassoc-26.c.jj 2013-03-07 > 10:10:49.400749110 +0100 > +++ gcc/testsuite/gcc.dg/tree-ssa/reassoc-26.c 2013-03-07 > 10:10:18.000000000 +0100 > @@ -0,0 +1,12 @@ > +/* PR tree-optimization/56559 */ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -ffast-math" } */ > + > +double a, b, c, d, e; > + > +void > +foo () > +{ > + a = e * e; > + b = d * e + c * e * a; > +} > > Jakub > > -- Richard Biener <rguent...@suse.de> SUSE / SUSE Labs SUSE LINUX Products GmbH - Nuernberg - AG Nuernberg - HRB 16746 GF: Jeff Hawn, Jennifer Guild, Felix Imend