diff options
author | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-28 15:43:03 +0100 |
---|---|---|
committer | Jakub Jelinek <jakub@gcc.gnu.org> | 2013-01-28 15:43:03 +0100 |
commit | 0bfbca5868fae1912db33ae4ab341d6e08bd68b4 (patch) | |
tree | 2a2bfc3d290925073d4af913ae01b69cfbf1aa53 /gcc | |
parent | dd8b9ddea2288c96124367bf66ce060eb1049872 (diff) | |
download | gcc-0bfbca5868fae1912db33ae4ab341d6e08bd68b4.zip gcc-0bfbca5868fae1912db33ae4ab341d6e08bd68b4.tar.gz gcc-0bfbca5868fae1912db33ae4ab341d6e08bd68b4.tar.bz2 |
re PR tree-optimization/56125 (-O2 -ffast-math generates bad code when dividing a double by the square of another double.)
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
Diffstat (limited to 'gcc')
-rw-r--r-- | gcc/ChangeLog | 26 | ||||
-rw-r--r-- | gcc/testsuite/ChangeLog | 9 | ||||
-rw-r--r-- | gcc/testsuite/gcc.dg/pr56125.c | 21 | ||||
-rw-r--r-- | gcc/tree-ssa-math-opts.c | 14 |
4 files changed, 55 insertions, 15 deletions
diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c96ccd2..3b3eed8 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -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. @@ -11,19 +20,18 @@ 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. @@ -369,7 +377,7 @@ * 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 @@ -392,13 +400,13 @@ 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 @@ -542,7 +550,7 @@ (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 @@ -1101,7 +1109,7 @@ (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> diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b35c132..dc09eef 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -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> @@ -157,7 +162,7 @@ * 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. @@ -217,7 +222,7 @@ 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 index 0000000..d1840a9 --- /dev/null +++ b/gcc/testsuite/gcc.dg/pr56125.c @@ -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; +} diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index fad3529..2140ced 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -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) { |