From: Jakub Jelinek Date: Mon, 28 Jan 2013 14:43:03 +0000 (+0100) Subject: re PR tree-optimization/56125 (-O2 -ffast-math generates bad code when dividing a... X-Git-Tag: releases/gcc-4.8.0~753 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=0bfbca5868fae1912db33ae4ab341d6e08bd68b4;p=thirdparty%2Fgcc.git 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 --- diff --git a/gcc/ChangeLog b/gcc/ChangeLog index c96ccd26af88..3b3eed82bd8a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,5 +1,14 @@ 2013-01-28 Jakub Jelinek + 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_2): Ditto for operand 1. -2013-01-26 David Holsgrove +2013-01-26 David Holsgrove PR target/54663 * config.gcc (microblaze*-linux*): Add tmake_file to allow building of microblaze-c.o -2013-01-26 Edgar E. Iglesias +2013-01-26 Edgar E. Iglesias * config.gcc (microblaze*-*-*): Rename microblaze*-*-elf, update tm_file. - -2013-01-25 Naveen H.S +2013-01-25 Naveen H.S * 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 +2013-01-18 Alexandre Oliva 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 +2013-01-18 Alexandre Oliva PR libmudflap/53359 * tree-mudflap.c (mudflap_finish_file): Skip deferred decls not found in the symtab. -2013-01-18 Alexandre Oliva +2013-01-18 Alexandre Oliva PR debug/56006 PR rtl-optimization/55547 @@ -542,7 +550,7 @@ (expand_atomic_load): Ditto. (expand_atomic_store): Ditto. -2013-01-16 Alexandre Oliva +2013-01-16 Alexandre Oliva PR rtl-optimization/55547 PR rtl-optimization/53827 @@ -1101,7 +1109,7 @@ (asan_finish_file): Test it here instead. 2013-01-07 Nick Clifton - Matthias Klose + Matthias Klose Doug Kwan H.J. Lu diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index b35c13282b00..dc09eef5ce36 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-01-28 Jakub Jelinek + + PR tree-optimization/56125 + * gcc.dg/pr56125.c: New test. + 2013-01-28 Tobias Burnus Mikael Morin @@ -157,7 +162,7 @@ * lib/target-supports.exp (check_effective_target_alias): New. -2013-01-20 Jack Howarth +2013-01-20 Jack Howarth 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 +2013-01-17 Jack Howarth 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 000000000000..d1840a9a0599 --- /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 fad3529a4d05..2140ced495b8 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) {