]> git.ipfire.org Git - thirdparty/gcc.git/commitdiff
re PR tree-optimization/56125 (-O2 -ffast-math generates bad code when dividing a...
authorJakub Jelinek <jakub@gcc.gnu.org>
Mon, 28 Jan 2013 14:43:03 +0000 (15:43 +0100)
committerJakub Jelinek <jakub@gcc.gnu.org>
Mon, 28 Jan 2013 14:43:03 +0000 (15:43 +0100)
PR tree-optimization/56125
* tree-ssa-math-opts.c (gimple_expand_builtin_pow): Don't optimize
pow(x,c) into sqrt(x) * powi(x, n/2) or
1.0 / (sqrt(x) * powi(x, abs(n/2))) if c is an integer or when
optimizing for size.
Don't optimize pow(x,c) into powi(x, n/3) * powi(cbrt(x), n%3) or
1.0 / (powi(x, abs(n)/3) * powi(cbrt(x), abs(n)%3)) if 2c is an
integer.

* gcc.dg/pr56125.c: New test.

From-SVN: r195507

gcc/ChangeLog
gcc/testsuite/ChangeLog
gcc/testsuite/gcc.dg/pr56125.c [new file with mode: 0644]
gcc/tree-ssa-math-opts.c

index c96ccd26af88f4d735832828576b1a9b8d0739bc..3b3eed82bd8aa937b446bcfa3fd94ee08c28508b 100644 (file)
@@ -1,5 +1,14 @@
 2013-01-28  Jakub Jelinek  <jakub@redhat.com>
 
+       PR tree-optimization/56125
+       * tree-ssa-math-opts.c (gimple_expand_builtin_pow): Don't optimize
+       pow(x,c) into sqrt(x) * powi(x, n/2) or
+       1.0 / (sqrt(x) * powi(x, abs(n/2))) if c is an integer or when
+       optimizing for size.
+       Don't optimize pow(x,c) into powi(x, n/3) * powi(cbrt(x), n%3) or
+       1.0 / (powi(x, abs(n)/3) * powi(cbrt(x), abs(n)%3)) if 2c is an
+       integer.
+
        PR tree-optimization/56094
        * gimplify.c (force_gimple_operand_1): Temporarily set input_location
        to UNKNOWN_LOCATION while gimplifying expr.
        operand 0 in movabs insn template for -masm=intel asm alternative.
        (*movabs<mode>_2): Ditto for operand 1.
 
-2013-01-26  David Holsgrove <david.holsgrove@xilinx.com>
+2013-01-26  David Holsgrove  <david.holsgrove@xilinx.com>
 
        PR target/54663
        * config.gcc (microblaze*-linux*): Add tmake_file to allow building
        of microblaze-c.o
 
-2013-01-26  Edgar E. Iglesias <edgar.iglesias@gmail.com>
+2013-01-26  Edgar E. Iglesias  <edgar.iglesias@gmail.com>
 
        * config.gcc (microblaze*-*-*): Rename microblaze*-*-elf, update
        tm_file.
 
-
-2013-01-25 Naveen H.S <Naveen.Hurugalawadi@caviumnetworks.com>
+2013-01-25  Naveen H.S  <Naveen.Hurugalawadi@caviumnetworks.com>
 
        * config/aarch64/aarch64.c (TARGET_FIXED_CONDITION_CODE_REGS):
        Undef to avoid warning.
 
        * config/aarch64/arm_neon.h: Map scalar types to standard types.
 
-2013-01-18  Alexandre Oliva <aoliva@redhat.com>
+2013-01-18  Alexandre Oliva  <aoliva@redhat.com>
 
        PR debug/54114
        PR debug/54402
        cache, respectively.
        * alias.c (rtx_equal_for_memref_p): Compare operands of ENTRY_VALUEs.
 
-2013-01-18  Alexandre Oliva <aoliva@redhat.com>
+2013-01-18  Alexandre Oliva  <aoliva@redhat.com>
 
        PR libmudflap/53359
        * tree-mudflap.c (mudflap_finish_file): Skip deferred decls
        not found in the symtab.
 
-2013-01-18  Alexandre Oliva <aoliva@redhat.com>
+2013-01-18  Alexandre Oliva  <aoliva@redhat.com>
 
        PR debug/56006
        PR rtl-optimization/55547
        (expand_atomic_load): Ditto.
        (expand_atomic_store): Ditto.
 
-2013-01-16  Alexandre Oliva <aoliva@redhat.com>
+2013-01-16  Alexandre Oliva  <aoliva@redhat.com>
 
        PR rtl-optimization/55547
        PR rtl-optimization/53827
        (asan_finish_file): Test it here instead.
 
 2013-01-07   Nick Clifton  <nickc@redhat.com>
-            Matthias Klose <doko@debian.org>
+            Matthias Klose  <doko@debian.org>
             Doug Kwan  <dougkwan@google.com>
             H.J. Lu  <hongjiu.lu@intel.com>
 
index b35c13282b0003b75194aeb87a9559e2b6d76afc..dc09eef5ce36833b2c042fd1cd03ec93ece3af2c 100644 (file)
@@ -1,3 +1,8 @@
+2013-01-28  Jakub Jelinek  <jakub@redhat.com>
+
+       PR tree-optimization/56125
+       * gcc.dg/pr56125.c: New test.
+
 2013-01-28  Tobias Burnus  <burnus@net-b.de>
            Mikael Morin  <mikael@gcc.gnu.org>
 
 
        * lib/target-supports.exp (check_effective_target_alias): New.
 
-2013-01-20  Jack Howarth <howarth@bromo.med.uc.edu>
+2013-01-20  Jack Howarth  <howarth@bromo.med.uc.edu>
 
        PR debug/53235
        * g++.dg/debug/dwarf2/nested-4.C: XFAIL on darwin.
        PR rtl-optimization/52573
        * gcc.dg/pr52573.c: New test.
 
-2013-01-17  Jack Howarth <howarth@bromo.med.uc.edu>
+2013-01-17  Jack Howarth  <howarth@bromo.med.uc.edu>
 
        PR sanitizer/55679
        * g++.dg/asan/interception-test-1.C: Skip on darwin.
diff --git a/gcc/testsuite/gcc.dg/pr56125.c b/gcc/testsuite/gcc.dg/pr56125.c
new file mode 100644 (file)
index 0000000..d1840a9
--- /dev/null
@@ -0,0 +1,21 @@
+/* PR tree-optimization/56125 */
+/* { dg-do run } */
+/* { dg-options "-O2 -ffast-math" } */
+
+extern void abort (void);
+extern double fabs (double);
+
+__attribute__((cold)) double
+foo (double x, double n)
+{
+  double u = x / (n * n);
+  return u;
+}
+
+int
+main ()
+{
+  if (fabs (foo (29, 2) - 7.25) > 0.001)
+    abort ();
+  return 0;
+}
index fad3529a4d052b43069a31e6f700ab8feaa1fcf9..2140ced495b8cf4f5b2971b31b083c62430070b2 100644 (file)
@@ -1110,7 +1110,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
   HOST_WIDE_INT n;
   tree type, sqrtfn, cbrtfn, sqrt_arg0, sqrt_sqrt, result, cbrt_x, powi_cbrt_x;
   enum machine_mode mode;
-  bool hw_sqrt_exists;
+  bool hw_sqrt_exists, c_is_int, c2_is_int;
 
   /* If the exponent isn't a constant, there's nothing of interest
      to be done.  */
@@ -1122,8 +1122,9 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
   c = TREE_REAL_CST (arg1);
   n = real_to_integer (&c);
   real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
+  c_is_int = real_identical (&c, &cint);
 
-  if (real_identical (&c, &cint)
+  if (c_is_int
       && ((n >= -1 && n <= 2)
          || (flag_unsafe_math_optimizations
              && optimize_insn_for_speed_p ()
@@ -1221,7 +1222,8 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
       return build_and_insert_call (gsi, loc, cbrtfn, sqrt_arg0);
     }
 
-  /* Optimize pow(x,c), where n = 2c for some nonzero integer n, into
+  /* Optimize pow(x,c), where n = 2c for some nonzero integer n
+     and c not an integer, into
 
        sqrt(x) * powi(x, n/2),                n > 0;
        1.0 / (sqrt(x) * powi(x, abs(n/2))),   n < 0.
@@ -1230,10 +1232,13 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
   real_arithmetic (&c2, MULT_EXPR, &c, &dconst2);
   n = real_to_integer (&c2);
   real_from_integer (&cint, VOIDmode, n, n < 0 ? -1 : 0, 0);
+  c2_is_int = real_identical (&c2, &cint);
 
   if (flag_unsafe_math_optimizations
       && sqrtfn
-      && real_identical (&c2, &cint))
+      && c2_is_int
+      && !c_is_int
+      && optimize_function_for_speed_p (cfun))
     {
       tree powi_x_ndiv2 = NULL_TREE;
 
@@ -1286,6 +1291,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *gsi, location_t loc,
       && cbrtfn
       && (gimple_val_nonnegative_real_p (arg0) || !HONOR_NANS (mode))
       && real_identical (&c2, &c)
+      && !c2_is_int
       && optimize_function_for_speed_p (cfun)
       && powi_cost (n / 3) <= POWI_MAX_MULTS)
     {