From b4c7e60165ffa8a6faf86c5ba2b5415eacfc5e22 Mon Sep 17 00:00:00 2001 From: ghazi Date: Tue, 20 Apr 2010 20:12:47 +0000 Subject: * builtins.c (fold_builtin_cproj): Fold more cases. testsuite: * gcc.dg/torture/builtin-cproj-1.c: Test more cases. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@158574 138bc75d-0d04-0410-961f-82ee72b054a4 --- gcc/builtins.c | 27 +++++++++++++++++++++++++++ 1 file changed, 27 insertions(+) (limited to 'gcc/builtins.c') diff --git a/gcc/builtins.c b/gcc/builtins.c index 8c3c8e0f4be..997c13a5505 100644 --- a/gcc/builtins.c +++ b/gcc/builtins.c @@ -7082,6 +7082,33 @@ fold_builtin_cproj (location_t loc, tree arg, tree type) else return arg; } + else if (TREE_CODE (arg) == COMPLEX_EXPR) + { + tree real = TREE_OPERAND (arg, 0); + tree imag = TREE_OPERAND (arg, 1); + + STRIP_NOPS (real); + STRIP_NOPS (imag); + + /* If the real part is inf and the imag part is known to be + nonnegative, return (inf + 0i). Remember side-effects are + possible in the imag part. */ + if (TREE_CODE (real) == REAL_CST + && real_isinf (TREE_REAL_CST_PTR (real)) + && tree_expr_nonnegative_p (imag)) + return omit_one_operand_loc (loc, type, + build_complex_cproj (type, false), + arg); + + /* If the imag part is inf, return (inf+I*copysign(0,imag)). + Remember side-effects are possible in the real part. */ + if (TREE_CODE (imag) == REAL_CST + && real_isinf (TREE_REAL_CST_PTR (imag))) + return + omit_one_operand_loc (loc, type, + build_complex_cproj (type, TREE_REAL_CST_PTR + (imag)->sign), arg); + } return NULL_TREE; } -- cgit v1.2.1