From 0fa6e0eff715294ffe4c681e3779ff4aeb45eec9 Mon Sep 17 00:00:00 2001 From: Tobias Burnus Date: Thu, 30 May 2013 23:32:53 +0200 Subject: [PATCH] re PR middle-end/57073 (__builtin_powif (-1.0, k) should be optimized to "1.0 - 2.0 * (K%2)") 2013-05-30 Tobias Burnus Thomas Koenig PR middle-end/57073 * tree-ssa-math-opts.c (execute_cse_sincos): Optimize powi (-1.0, k) to (k & 1) ? -1.0 : 1.0. 2013-05-30 Tobias Burnus PR middle-end/57073 * gfortran.dg/power_6.f90: New. From-SVN: r199461 --- gcc/ChangeLog | 9 +++++- gcc/testsuite/ChangeLog | 5 ++++ gcc/testsuite/gfortran.dg/power_6.f90 | 15 ++++++++++ gcc/tree-ssa-math-opts.c | 41 +++++++++++++++++++++++---- 4 files changed, 64 insertions(+), 6 deletions(-) create mode 100644 gcc/testsuite/gfortran.dg/power_6.f90 diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 660730a7b10..9086576410a 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,6 +1,13 @@ +2013-05-30 Tobias Burnus + Thomas Koenig + + PR middle-end/57073 + * tree-ssa-math-opts.c (execute_cse_sincos): Optimize + powi (-1.0, k) to (k & 1) ? -1.0 : 1.0. + 2013-05-30 Steven Bosscher - * rtlanal.c (tablejump_p): Expect table and label to be adjacent. + * rtlanal.c (tablejump_p): Expect table and label to be adjacent. 2013-05-30 Vladimir Makarov diff --git a/gcc/testsuite/ChangeLog b/gcc/testsuite/ChangeLog index 65443b9df43..27bf13439d0 100644 --- a/gcc/testsuite/ChangeLog +++ b/gcc/testsuite/ChangeLog @@ -1,3 +1,8 @@ +2013-05-30 Tobias Burnus + + PR middle-end/57073 + * gfortran.dg/power_6.f90: New. + 2013-05-30 Ian Bolton * gcc.target/aarch64/insv_1.c: New test. diff --git a/gcc/testsuite/gfortran.dg/power_6.f90 b/gcc/testsuite/gfortran.dg/power_6.f90 new file mode 100644 index 00000000000..65d1bd02684 --- /dev/null +++ b/gcc/testsuite/gfortran.dg/power_6.f90 @@ -0,0 +1,15 @@ +! { dg-do compile } +! { dg-options "-O1 -fdump-tree-optimized" } +! +! PR middle-end/57073 +! See also PR 57073 +! +real function f(k) + integer, value :: k + f = (-1.0)**k +end + +! { dg-final { scan-tree-dump-not "__builtin_powif" "optimized" } } +! { dg-final { scan-tree-dump "powi_cond_\[0-9\] = k_\[0-9\]\\(D\\) & 1;" "optimized" } } +! { dg-final { scan-tree-dump "powi_\[0-9\] = powi_cond_\[0-9\] \\? -1.0e\\+0 : 1.0e\\+0;" "optimized" } } +! { dg-final { cleanup-tree-dump "optimized" } } diff --git a/gcc/tree-ssa-math-opts.c b/gcc/tree-ssa-math-opts.c index a94172d01cd..a15c4042867 100644 --- a/gcc/tree-ssa-math-opts.c +++ b/gcc/tree-ssa-math-opts.c @@ -1445,12 +1445,43 @@ execute_cse_sincos (void) CASE_FLT_FN (BUILT_IN_POWI): arg0 = gimple_call_arg (stmt, 0); arg1 = gimple_call_arg (stmt, 1); - if (!host_integerp (arg1, 0)) - break; - - n = TREE_INT_CST_LOW (arg1); loc = gimple_location (stmt); - result = gimple_expand_builtin_powi (&gsi, loc, arg0, n); + + if (real_minus_onep (arg0) + && TREE_CODE (TREE_TYPE (arg1)) == INTEGER_TYPE + && !host_integerp (arg1,0)) + { + tree t0, t1, cond, one, minus_one; + gimple stmt; + + t0 = TREE_TYPE (arg0); + t1 = TREE_TYPE (arg1); + one = build_real (t0, dconst1); + minus_one = build_real (t0, dconstm1); + + cond = make_temp_ssa_name (t1, NULL, "powi_cond"); + stmt = gimple_build_assign_with_ops (BIT_AND_EXPR, cond, + arg1, + build_int_cst (t1, + 1)); + gimple_set_location (stmt, loc); + gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); + + result = make_temp_ssa_name (t0, NULL, "powi"); + stmt = gimple_build_assign_with_ops (COND_EXPR, result, + cond, + minus_one, one); + gimple_set_location (stmt, loc); + gsi_insert_before (&gsi, stmt, GSI_SAME_STMT); + } + else + { + if (!host_integerp (arg1, 0)) + break; + + n = TREE_INT_CST_LOW (arg1); + result = gimple_expand_builtin_powi (&gsi, loc, arg0, n); + } if (result) { -- 2.30.2