mirror of
git://gcc.gnu.org/git/gcc.git
synced 2025-03-20 19:01:12 +08:00
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
This commit is contained in:
parent
da7fda0a9e
commit
4f31c7ec65
@ -1,3 +1,10 @@
|
||||
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>
|
||||
|
||||
* config/bfin/bfin-protos.h (bfin_hardware_loop): Declare.
|
||||
|
@ -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);
|
||||
|
@ -1,3 +1,7 @@
|
||||
2006-05-31 Roger Sayle <roger@eyesopen.com>
|
||||
|
||||
* gcc.dg/builtins-54.c: New test case.
|
||||
|
||||
2006-05-30 Mark Mitchell <mark@codesourcery.com>
|
||||
|
||||
PR c++/26433
|
||||
|
44
gcc/testsuite/gcc.dg/builtins-54.c
Normal file
44
gcc/testsuite/gcc.dg/builtins-54.c
Normal file
@ -0,0 +1,44 @@
|
||||
/* { 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;
|
||||
}
|
||||
|
Loading…
x
Reference in New Issue
Block a user