aboutsummaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r--gcc/builtins.c82
1 files changed, 5 insertions, 77 deletions
diff --git a/gcc/builtins.c b/gcc/builtins.c
index fa02d26..2318b28 100644
--- a/gcc/builtins.c
+++ b/gcc/builtins.c
@@ -7538,82 +7538,6 @@ fold_fixed_mathfn (location_t loc, tree fndecl, tree arg)
return NULL_TREE;
}
-/* Fold call to builtin cabs, cabsf or cabsl with argument ARG. TYPE is the
- return type. Return NULL_TREE if no simplification can be made. */
-
-static tree
-fold_builtin_cabs (location_t loc, tree arg, tree type, tree fndecl)
-{
- tree res;
-
- if (!validate_arg (arg, COMPLEX_TYPE)
- || TREE_CODE (TREE_TYPE (TREE_TYPE (arg))) != REAL_TYPE)
- return NULL_TREE;
-
- /* Calculate the result when the argument is a constant. */
- if (TREE_CODE (arg) == COMPLEX_CST
- && (res = do_mpfr_arg2 (TREE_REALPART (arg), TREE_IMAGPART (arg),
- type, mpfr_hypot)))
- return res;
-
- if (TREE_CODE (arg) == COMPLEX_EXPR)
- {
- tree real = TREE_OPERAND (arg, 0);
- tree imag = TREE_OPERAND (arg, 1);
-
- /* If either part is zero, cabs is fabs of the other. */
- if (real_zerop (real))
- return fold_build1_loc (loc, ABS_EXPR, type, imag);
- if (real_zerop (imag))
- return fold_build1_loc (loc, ABS_EXPR, type, real);
-
- /* cabs(x+xi) -> fabs(x)*sqrt(2). */
- if (flag_unsafe_math_optimizations
- && operand_equal_p (real, imag, OEP_PURE_SAME))
- {
- STRIP_NOPS (real);
- return fold_build2_loc (loc, MULT_EXPR, type,
- fold_build1_loc (loc, ABS_EXPR, type, real),
- build_real_truncate (type, dconst_sqrt2 ()));
- }
- }
-
- /* Optimize cabs(-z) and cabs(conj(z)) as cabs(z). */
- if (TREE_CODE (arg) == NEGATE_EXPR
- || TREE_CODE (arg) == CONJ_EXPR)
- return build_call_expr_loc (loc, fndecl, 1, TREE_OPERAND (arg, 0));
-
- /* Don't do this when optimizing for size. */
- if (flag_unsafe_math_optimizations
- && optimize && optimize_function_for_speed_p (cfun))
- {
- tree sqrtfn = mathfn_built_in (type, BUILT_IN_SQRT);
-
- if (sqrtfn != NULL_TREE)
- {
- tree rpart, ipart, result;
-
- arg = builtin_save_expr (arg);
-
- rpart = fold_build1_loc (loc, REALPART_EXPR, type, arg);
- ipart = fold_build1_loc (loc, IMAGPART_EXPR, type, arg);
-
- rpart = builtin_save_expr (rpart);
- ipart = builtin_save_expr (ipart);
-
- result = fold_build2_loc (loc, PLUS_EXPR, type,
- fold_build2_loc (loc, MULT_EXPR, type,
- rpart, rpart),
- fold_build2_loc (loc, MULT_EXPR, type,
- ipart, ipart));
-
- return build_call_expr_loc (loc, sqrtfn, 1, result);
- }
- }
-
- return NULL_TREE;
-}
-
/* Build a complex (inf +- 0i) for the result of cproj. TYPE is the
complex tree type of the result. If NEG is true, the imaginary
zero is negative. */
@@ -9655,7 +9579,11 @@ fold_builtin_1 (location_t loc, tree fndecl, tree arg0)
break;
CASE_FLT_FN (BUILT_IN_CABS):
- return fold_builtin_cabs (loc, arg0, type, fndecl);
+ if (TREE_CODE (arg0) == COMPLEX_CST
+ && TREE_CODE (TREE_TYPE (TREE_TYPE (arg0))) == REAL_TYPE)
+ return do_mpfr_arg2 (TREE_REALPART (arg0), TREE_IMAGPART (arg0),
+ type, mpfr_hypot);
+ break;
CASE_FLT_FN (BUILT_IN_CARG):
return fold_builtin_carg (loc, arg0, type);