On Tue, Feb 14, 2017 at 2:48 PM, Richard Biener <rguent...@suse.de> wrote: > > The following enables final value replacement for floating point > expressions if -funsafe-math-optimizations is set (that's the > flag the reassoc pass controls similar transforms on). Looks to me it's kind of abusing of current implementation of SCEV for floating point values. I believe it's designed only with integral type in mind, for example, we may need to reject float time when tracking scev chain via type conversion.
Thanks, bin > > Bootstrapped / tested on x86_64-unknown-linux-gnu, queued for GCC 8. > > Richard. > > 2017-02-14 Richard Biener <rguent...@suse.de> > > PR tree-optimization/79460 > * tree-scalar-evolution.c (final_value_replacement_loop): Also > allow final value replacement of floating point expressions. > > * gcc.dg/tree-ssa/sccp-3.c: New testcase. > > Index: gcc/tree-scalar-evolution.c > =================================================================== > --- gcc/tree-scalar-evolution.c (revision 245417) > +++ gcc/tree-scalar-evolution.c (working copy) > @@ -3718,8 +3718,10 @@ final_value_replacement_loop (struct loo > continue; > } > > - if (!POINTER_TYPE_P (TREE_TYPE (def)) > - && !INTEGRAL_TYPE_P (TREE_TYPE (def))) > + if (! (POINTER_TYPE_P (TREE_TYPE (def)) > + || INTEGRAL_TYPE_P (TREE_TYPE (def)) > + || (FLOAT_TYPE_P (TREE_TYPE (def)) > + && flag_unsafe_math_optimizations))) > { > gsi_next (&psi); > continue; > Index: gcc/testsuite/gcc.dg/tree-ssa/sccp-3.c > =================================================================== > --- gcc/testsuite/gcc.dg/tree-ssa/sccp-3.c (nonexistent) > +++ gcc/testsuite/gcc.dg/tree-ssa/sccp-3.c (working copy) > @@ -0,0 +1,12 @@ > +/* { dg-do compile } */ > +/* { dg-options "-O2 -funsafe-math-optimizations -fdump-tree-sccp" } */ > + > +float f(float x[]) > +{ > + float p = 1.0; > + for (int i = 0; i < 200; i++) > + p += 1; > + return p; > +} > + > +/* { dg-final { scan-tree-dump "final value replacement.* = 2.01e\\+2;" > "sccp" } } */