Commit 4f31c7ec by Roger Sayle Committed by Roger Sayle

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
parent da7fda0a
2006-05-31 Roger Sayle <roger@eyesopen.com>
* 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.
2006-05-31 Jie Zhang <jie.zhang@analog.com> 2006-05-31 Jie Zhang <jie.zhang@analog.com>
* config/bfin/bfin-protos.h (bfin_hardware_loop): Declare. * config/bfin/bfin-protos.h (bfin_hardware_loop): Declare.
......
...@@ -146,7 +146,6 @@ static tree fold_trunc_transparent_mathfn (tree, tree); ...@@ -146,7 +146,6 @@ static tree fold_trunc_transparent_mathfn (tree, tree);
static bool readonly_data_expr (tree); static bool readonly_data_expr (tree);
static rtx expand_builtin_fabs (tree, rtx, rtx); static rtx expand_builtin_fabs (tree, rtx, rtx);
static rtx expand_builtin_signbit (tree, 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_sqrt (tree, tree);
static tree fold_builtin_cbrt (tree, tree); static tree fold_builtin_cbrt (tree, tree);
static tree fold_builtin_pow (tree, tree, tree); static tree fold_builtin_pow (tree, tree, tree);
...@@ -6772,11 +6771,12 @@ fold_fixed_mathfn (tree fndecl, tree arglist) ...@@ -6772,11 +6771,12 @@ fold_fixed_mathfn (tree fndecl, tree arglist)
} }
/* Fold function call to builtin cabs, cabsf or cabsl. ARGLIST /* Fold function call to builtin cabs, cabsf or cabsl. ARGLIST
is the argument list and TYPE is the return type. Return is the argument list, TYPE is the return type and FNDECL is the
NULL_TREE if no if no simplification can be made. */ original function DECL. Return NULL_TREE if no if no simplification
can be made. */
static tree static tree
fold_builtin_cabs (tree arglist, tree type) fold_builtin_cabs (tree arglist, tree type, tree fndecl)
{ {
tree arg; tree arg;
...@@ -6817,6 +6817,14 @@ fold_builtin_cabs (tree arglist, tree type) ...@@ -6817,6 +6817,14 @@ fold_builtin_cabs (tree arglist, tree type)
&& real_zerop (TREE_OPERAND (arg, 1))) && real_zerop (TREE_OPERAND (arg, 1)))
return fold_build1 (ABS_EXPR, type, TREE_OPERAND (arg, 0)); 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. */ /* Don't do this when optimizing for size. */
if (flag_unsafe_math_optimizations if (flag_unsafe_math_optimizations
&& optimize && !optimize_size) && optimize && !optimize_size)
...@@ -8648,7 +8656,7 @@ fold_builtin_1 (tree fndecl, tree arglist, bool ignore) ...@@ -8648,7 +8656,7 @@ fold_builtin_1 (tree fndecl, tree arglist, bool ignore)
break; break;
CASE_FLT_FN (BUILT_IN_CABS): 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): CASE_FLT_FN (BUILT_IN_SQRT):
return fold_builtin_sqrt (arglist, type); return fold_builtin_sqrt (arglist, type);
......
2006-05-31 Roger Sayle <roger@eyesopen.com>
* gcc.dg/builtins-54.c: New test case.
2006-05-30 Mark Mitchell <mark@codesourcery.com> 2006-05-30 Mark Mitchell <mark@codesourcery.com>
PR c++/26433 PR c++/26433
/* { dg-do link } */
/* { dg-options "-O2 -ffast-math" } */
double cabs(__complex__ double);
float cabsf(__complex__ float);
long double cabsl(__complex__ long double);
void link_error (void);
void test(__complex__ double x)
{
if (cabs(x) != cabs(-x))
link_error();
if (cabs(x) != cabs(~x))
link_error();
}
void testf(__complex__ float x)
{
if (cabsf(x) != cabsf(-x))
link_error();
if (cabsf(x) != cabsf(~x))
link_error();
}
void testl(__complex__ long double x)
{
if (cabsl(x) != cabsl(-x))
link_error();
if (cabsl(x) != cabsl(~x))
link_error();
}
int main()
{
test(0.0);
testf(0.0);
testl(0.0);
return 0;
}
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment