* [PATCH] Fix PR lto/49302 (corrected)
@ 2011-06-09 17:49 William J. Schmidt
2011-06-10 9:05 ` Richard Guenther
0 siblings, 1 reply; 2+ messages in thread
From: William J. Schmidt @ 2011-06-09 17:49 UTC (permalink / raw)
To: gcc-patches; +Cc: richard.guenther
Richard, thanks for the comments. Here's the revised patch for
expanding cabs in gimple.
Given the direction this pass is taking, should it eventually be renamed
from cse_sincos to something more general?
Thanks,
Bill
2011-06-09 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
PR lto/49302
* tree-ssa-math-opts.c (build_and_insert_ref): New.
(gimple_expand_builtin_pow): Minor cleanup.
(gimple_expand_builtin_cabs): New.
(execute_cse_sincos): Add case for BUILT_IN_CABS.
Index: gcc/tree-ssa-math-opts.c
===================================================================
--- gcc/tree-ssa-math-opts.c (revision 174845)
+++ gcc/tree-ssa-math-opts.c (working copy)
@@ -1070,6 +1070,22 @@ build_and_insert_binop (gimple_stmt_iterator *gsi,
return result;
}
+/* Build a gimple reference operation with the given CODE and argument
+ ARG, assigning the result to a new SSA name for variable TARGET.
+ Insert the statement prior to GSI's current position, and return
+ the fresh SSA name. */
+
+static inline tree
+build_and_insert_ref (gimple_stmt_iterator *gsi, location_t loc, tree type,
+ tree target, enum tree_code code, tree arg0)
+{
+ tree result = make_ssa_name (target, NULL);
+ gimple stmt = gimple_build_assign (result, build1 (code, type, arg0));
+ gimple_set_location (stmt, loc);
+ gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
+ return result;
+}
+
/* ARG0 and ARG1 are the two arguments to a pow builtin call in GSI
with location info LOC. If possible, create an equivalent and
less expensive sequence of statements prior to GSI, and return an
@@ -1124,7 +1140,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *g
if we don't have a hardware sqrt insn. */
dconst1_4 = dconst1;
SET_REAL_EXP (&dconst1_4, REAL_EXP (&dconst1_4) - 2);
- hw_sqrt_exists = optab_handler(sqrt_optab, mode) != CODE_FOR_nothing;
+ hw_sqrt_exists = optab_handler (sqrt_optab, mode) != CODE_FOR_nothing;
if (flag_unsafe_math_optimizations
&& sqrtfn
@@ -1306,6 +1322,42 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *g
return NULL_TREE;
}
+/* ARG is the argument to a cabs builtin call in GSI with location info
+ LOC. Create a sequence of statements prior to GSI that calculates
+ sqrt(R*R + I*I), where R and I are the real and imaginary components
+ of ARG, respectively. Return an expression holding the result. */
+
+static tree
+gimple_expand_builtin_cabs (gimple_stmt_iterator *gsi, location_t loc, tree arg)
+{
+ tree target, real_part, imag_part, addend1, addend2, sum, result;
+ tree type = TREE_TYPE (TREE_TYPE (arg));
+ tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
+ enum machine_mode mode = TYPE_MODE (type);
+
+ if (!flag_unsafe_math_optimizations
+ || !optimize_bb_for_speed_p (gimple_bb (gsi_stmt (*gsi)))
+ || !sqrtfn
+ || optab_handler (sqrt_optab, mode) == CODE_FOR_nothing)
+ return NULL_TREE;
+
+ target = create_tmp_var (type, "cabs");
+ add_referenced_var (target);
+
+ real_part = build_and_insert_ref (gsi, loc, type, target,
+ REALPART_EXPR, arg);
+ addend1 = build_and_insert_binop (gsi, loc, target, MULT_EXPR,
+ real_part, real_part);
+ imag_part = build_and_insert_ref (gsi, loc, type, target,
+ IMAGPART_EXPR, arg);
+ addend2 = build_and_insert_binop (gsi, loc, target, MULT_EXPR,
+ imag_part, imag_part);
+ sum = build_and_insert_binop (gsi, loc, target, PLUS_EXPR, addend1, addend2);
+ result = build_and_insert_call (gsi, loc, &target, sqrtfn, sum);
+
+ return result;
+}
+
/* Go through all calls to sin, cos and cexpi and call execute_cse_sincos_1
on the SSA_NAME argument of each of them. Also expand powi(x,n) into
an optimal number of multiplies, when n is a constant. */
@@ -1388,6 +1440,21 @@ execute_cse_sincos (void)
}
break;
+ CASE_FLT_FN (BUILT_IN_CABS):
+ arg0 = gimple_call_arg (stmt, 0);
+ loc = gimple_location (stmt);
+ result = gimple_expand_builtin_cabs (&gsi, loc, arg0);
+
+ if (result)
+ {
+ tree lhs = gimple_get_lhs (stmt);
+ gimple new_stmt = gimple_build_assign (lhs, result);
+ gimple_set_location (new_stmt, loc);
+ unlink_stmt_vdef (stmt);
+ gsi_replace (&gsi, new_stmt, true);
+ }
+ break;
+
default:;
}
}
^ permalink raw reply [flat|nested] 2+ messages in thread
* Re: [PATCH] Fix PR lto/49302 (corrected)
2011-06-09 17:49 [PATCH] Fix PR lto/49302 (corrected) William J. Schmidt
@ 2011-06-10 9:05 ` Richard Guenther
0 siblings, 0 replies; 2+ messages in thread
From: Richard Guenther @ 2011-06-10 9:05 UTC (permalink / raw)
To: William J. Schmidt; +Cc: gcc-patches
On Thu, Jun 9, 2011 at 7:34 PM, William J. Schmidt
<wschmidt@linux.vnet.ibm.com> wrote:
> Richard, thanks for the comments. Here's the revised patch for
> expanding cabs in gimple.
>
> Given the direction this pass is taking, should it eventually be renamed
> from cse_sincos to something more general?
Eventually yes - but names are just - names ;)
Ok with ...
> Thanks,
> Bill
>
>
> 2011-06-09 Bill Schmidt <wschmidt@linux.vnet.ibm.com>
>
> PR lto/49302
> * tree-ssa-math-opts.c (build_and_insert_ref): New.
> (gimple_expand_builtin_pow): Minor cleanup.
> (gimple_expand_builtin_cabs): New.
> (execute_cse_sincos): Add case for BUILT_IN_CABS.
>
>
> Index: gcc/tree-ssa-math-opts.c
> ===================================================================
> --- gcc/tree-ssa-math-opts.c (revision 174845)
> +++ gcc/tree-ssa-math-opts.c (working copy)
> @@ -1070,6 +1070,22 @@ build_and_insert_binop (gimple_stmt_iterator *gsi,
> return result;
> }
>
> +/* Build a gimple reference operation with the given CODE and argument
> + ARG, assigning the result to a new SSA name for variable TARGET.
> + Insert the statement prior to GSI's current position, and return
> + the fresh SSA name. */
> +
> +static inline tree
> +build_and_insert_ref (gimple_stmt_iterator *gsi, location_t loc, tree type,
> + tree target, enum tree_code code, tree arg0)
> +{
> + tree result = make_ssa_name (target, NULL);
> + gimple stmt = gimple_build_assign (result, build1 (code, type, arg0));
> + gimple_set_location (stmt, loc);
> + gsi_insert_before (gsi, stmt, GSI_SAME_STMT);
> + return result;
> +}
> +
> /* ARG0 and ARG1 are the two arguments to a pow builtin call in GSI
> with location info LOC. If possible, create an equivalent and
> less expensive sequence of statements prior to GSI, and return an
> @@ -1124,7 +1140,7 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *g
> if we don't have a hardware sqrt insn. */
> dconst1_4 = dconst1;
> SET_REAL_EXP (&dconst1_4, REAL_EXP (&dconst1_4) - 2);
> - hw_sqrt_exists = optab_handler(sqrt_optab, mode) != CODE_FOR_nothing;
> + hw_sqrt_exists = optab_handler (sqrt_optab, mode) != CODE_FOR_nothing;
>
> if (flag_unsafe_math_optimizations
> && sqrtfn
> @@ -1306,6 +1322,42 @@ gimple_expand_builtin_pow (gimple_stmt_iterator *g
> return NULL_TREE;
> }
>
> +/* ARG is the argument to a cabs builtin call in GSI with location info
> + LOC. Create a sequence of statements prior to GSI that calculates
> + sqrt(R*R + I*I), where R and I are the real and imaginary components
> + of ARG, respectively. Return an expression holding the result. */
> +
> +static tree
> +gimple_expand_builtin_cabs (gimple_stmt_iterator *gsi, location_t loc, tree arg)
> +{
> + tree target, real_part, imag_part, addend1, addend2, sum, result;
> + tree type = TREE_TYPE (TREE_TYPE (arg));
> + tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
> + enum machine_mode mode = TYPE_MODE (type);
> +
> + if (!flag_unsafe_math_optimizations
> + || !optimize_bb_for_speed_p (gimple_bb (gsi_stmt (*gsi)))
> + || !sqrtfn
> + || optab_handler (sqrt_optab, mode) == CODE_FOR_nothing)
> + return NULL_TREE;
> +
> + target = create_tmp_var (type, "cabs");
use create_tmp_reg instead
Thanks,
Richard.
> + add_referenced_var (target);
> +
> + real_part = build_and_insert_ref (gsi, loc, type, target,
> + REALPART_EXPR, arg);
> + addend1 = build_and_insert_binop (gsi, loc, target, MULT_EXPR,
> + real_part, real_part);
> + imag_part = build_and_insert_ref (gsi, loc, type, target,
> + IMAGPART_EXPR, arg);
> + addend2 = build_and_insert_binop (gsi, loc, target, MULT_EXPR,
> + imag_part, imag_part);
> + sum = build_and_insert_binop (gsi, loc, target, PLUS_EXPR, addend1, addend2);
> + result = build_and_insert_call (gsi, loc, &target, sqrtfn, sum);
> +
> + return result;
> +}
> +
> /* Go through all calls to sin, cos and cexpi and call execute_cse_sincos_1
> on the SSA_NAME argument of each of them. Also expand powi(x,n) into
> an optimal number of multiplies, when n is a constant. */
> @@ -1388,6 +1440,21 @@ execute_cse_sincos (void)
> }
> break;
>
> + CASE_FLT_FN (BUILT_IN_CABS):
> + arg0 = gimple_call_arg (stmt, 0);
> + loc = gimple_location (stmt);
> + result = gimple_expand_builtin_cabs (&gsi, loc, arg0);
> +
> + if (result)
> + {
> + tree lhs = gimple_get_lhs (stmt);
> + gimple new_stmt = gimple_build_assign (lhs, result);
> + gimple_set_location (new_stmt, loc);
> + unlink_stmt_vdef (stmt);
> + gsi_replace (&gsi, new_stmt, true);
> + }
> + break;
> +
> default:;
> }
> }
>
>
>
^ permalink raw reply [flat|nested] 2+ messages in thread
end of thread, other threads:[~2011-06-10 8:56 UTC | newest]
Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2011-06-09 17:49 [PATCH] Fix PR lto/49302 (corrected) William J. Schmidt
2011-06-10 9:05 ` Richard Guenther
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox;
as well as URLs for read-only IMAP folder(s) and NNTP newsgroup(s).