tree-ssa-reassoc.c (reassociate_expr): Allow scaler floating point types when flag_un...
authorAndrew Pinski <pinskia@physics.uc.edu>
Mon, 25 Jul 2005 20:23:50 +0000 (20:23 +0000)
committerAndrew Pinski <pinskia@gcc.gnu.org>
Mon, 25 Jul 2005 20:23:50 +0000 (13:23 -0700)
2005-07-25  Andrew Pinski  <pinskia@physics.uc.edu>

        * tree-ssa-reassoc.c (reassociate_expr): Allow scaler floating point
        types when flag_unsafe_math_optimizations is true.

2005-07-25  Andrew Pinski  <pinskia@physics.uc.edu>

        * gcc.dg/tree-ssa/reassoc-3.c: New test.
        * gcc.dg/tree-ssa/reassoc-4.c: New test.

From-SVN: r102368

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/tree-ssa/reassoc-3.c [new file with mode: 0644]
gcc/testsuite/gcc.dg/tree-ssa/reassoc-4.c [new file with mode: 0644]
gcc/tree-ssa-reassoc.c

index 7d8d6f7..2217142 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-25  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       * tree-ssa-reassoc.c (reassociate_expr): Allow scaler floating point
+       types when flag_unsafe_math_optimizations is true.
+
 2005-07-25  Mark Mitchell  <mark@codesourcery.com>
 
        * gcc.c (option_map): Add --sysroot.
index affa4b6..bcdb54c 100644 (file)
@@ -1,3 +1,8 @@
+2005-07-25  Andrew Pinski  <pinskia@physics.uc.edu>
+
+       * gcc.dg/tree-ssa/reassoc-3.c: New test.
+       * gcc.dg/tree-ssa/reassoc-4.c: New test.
+
 2005-07-25  Adam Nemet  <anemet@lnxw.com>
 
         * lib/profopt.exp (profopt-execute): Check for profiling data
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-3.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-3.c
new file mode 100644 (file)
index 0000000..3800497
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */ 
+/* { dg-options "-O2 -fdump-tree-optimized -ffast-math" } */
+float a, b, c, d;
+extern int printf (const char *, ...);
+int main(void)
+{
+  float e;
+  float f;
+  /* We should be able to transform these into the same expression, and only have two additions.  */
+  e = a + b;
+  e = e + c;
+  f = c + a;
+  f = f + b;
+  printf ("%f %f\n", e, f);
+}
+
+/* { dg-final { scan-tree-dump-times "\\\+" 2 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
diff --git a/gcc/testsuite/gcc.dg/tree-ssa/reassoc-4.c b/gcc/testsuite/gcc.dg/tree-ssa/reassoc-4.c
new file mode 100644 (file)
index 0000000..6f46752
--- /dev/null
@@ -0,0 +1,18 @@
+/* { dg-do compile } */ 
+/* { dg-options "-O2 -fdump-tree-optimized" } */
+float a, b, c, d;
+extern int printf (const char *, ...);
+int main(void)
+{
+  float e;
+  float f;
+  /* We should not be able to transform these into the same expression, and only have two additions.  */
+  e = a + b;
+  e = e + c;
+  f = c + a;
+  f = f + b;
+  printf ("%f %f\n", e, f);
+}
+
+/* { dg-final { scan-tree-dump-times "\\\+" 4 "optimized"} } */
+/* { dg-final { cleanup-tree-dump "optimized" } } */
index 395c549..e0d4561 100644 (file)
@@ -435,10 +435,13 @@ reassociate_expr (tree bexpr, block_stmt_iterator *currbsi)
   unsigned int lhsrank = get_rank (lhs);
   unsigned int rhsrank = get_rank (rhs);
 
-  /* I don't want to get into the business of floating point
-     reassociation.  */
-  if (!INTEGRAL_TYPE_P (TREE_TYPE (lhs))
-      || !INTEGRAL_TYPE_P (TREE_TYPE (rhs)))
+  /* If unsafe math optimizations we can do reassociation for non integal
+     types.  */
+  if ((!INTEGRAL_TYPE_P (TREE_TYPE (lhs))
+       || !INTEGRAL_TYPE_P (TREE_TYPE (rhs)))
+      && (!SCALAR_FLOAT_TYPE_P (TREE_TYPE (rhs))
+         || !SCALAR_FLOAT_TYPE_P (TREE_TYPE(lhs))
+         || !flag_unsafe_math_optimizations))
     return false;
     
   /* We want the greater ranked operand to be our "LHS" for simplicity