aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorRoger Sayle <roger@eyesopen.com>2006-05-31 17:44:56 +0000
committerRoger Sayle <sayle@gcc.gnu.org>2006-05-31 17:44:56 +0000
commit4f31c7ec654d1b4523288f8cc6d4e21f43afd845 (patch)
tree70e91d9c7abb8a6796d8f13001637bfc7ae2ffbd /gcc/builtins.c
parentda7fda0a9e5a88a5ad7000eda25ad552f2851392 (diff)
downloadgcc-4f31c7ec654d1b4523288f8cc6d4e21f43afd845.zip
gcc-4f31c7ec654d1b4523288f8cc6d4e21f43afd845.tar.gz
gcc-4f31c7ec654d1b4523288f8cc6d4e21f43afd845.tar.bz2
builtins.c (fold_builtin_cabs): Delete prototype.
* builtins.c (fold_builtin_cabs): Delete prototype. Require an additional FNDECL argument. Optimize cabs(-z) and cabs(~z) as cabs(z). (fold_builtin_decl) <BUILT_IN_CABS>: Update fold_builtin_cabs call. * gcc.dg/builtins-54.c: New test case. From-SVN: r114276
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c18
1 files changed, 13 insertions, 5 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index b9d94eb..7113681 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -146,7 +146,6 @@ static tree fold_trunc_transparent_mathfn (tree, tree);
static bool readonly_data_expr (tree);
static rtx expand_builtin_fabs (tree, rtx, rtx);
static rtx expand_builtin_signbit (tree, rtx);
-static tree fold_builtin_cabs (tree, tree);
static tree fold_builtin_sqrt (tree, tree);
static tree fold_builtin_cbrt (tree, tree);
static tree fold_builtin_pow (tree, tree, tree);
@@ -6772,11 +6771,12 @@ fold_fixed_mathfn (tree fndecl, tree arglist)
}
/* Fold function call to builtin cabs, cabsf or cabsl. ARGLIST
- is the argument list and TYPE is the return type. Return
- NULL_TREE if no if no simplification can be made. */
+ is the argument list, TYPE is the return type and FNDECL is the
+ original function DECL. Return NULL_TREE if no if no simplification
+ can be made. */
static tree
-fold_builtin_cabs (tree arglist, tree type)
+fold_builtin_cabs (tree arglist, tree type, tree fndecl)
{
tree arg;
@@ -6817,6 +6817,14 @@ fold_builtin_cabs (tree arglist, tree type)
&& real_zerop (TREE_OPERAND (arg, 1)))
return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg, 0));
+ /* Optimize cabs(-z) and cabs(conj(z)) as cabs(z). */
+ if (TREE_CODE (arg) == NEGATE_EXPR
+ || TREE_CODE (arg) == CONJ_EXPR)
+ {
+ tree arglist = build_tree_list (NULL_TREE, TREE_OPERAND (arg, 0));
+ return build_function_call_expr (fndecl, arglist);
+ }
+
/* Don't do this when optimizing for size. */
if (flag_unsafe_math_optimizations
&& optimize && !optimize_size)
@@ -8648,7 +8656,7 @@ fold_builtin_1 (tree fndecl, tree arglist, bool ignore)
break;
CASE_FLT_FN (BUILT_IN_CABS):
- return fold_builtin_cabs (arglist, type);
+ return fold_builtin_cabs (arglist, type, fndecl);
CASE_FLT_FN (BUILT_IN_SQRT):
return fold_builtin_sqrt (arglist, type);