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

Reply via email to