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).
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" } } */