diff options
author | Kaveh R. Ghazi <ghazi@caip.rutgers.edu> | 2010-04-20 20:12:47 +0000 |
---|---|---|
committer | Kaveh Ghazi <ghazi@gcc.gnu.org> | 2010-04-20 20:12:47 +0000 |
commit | 3c642f929e645b645c03b6d2490da25d46d6f4e7 (patch) | |
tree | 0571f6c98a4bec862a18389e5fe90d9a038b4cf5 /gcc/builtins.c | |
parent | 43272bf5fd3d66bf2fd05d11cf66dc0d1116a701 (diff) | |
download | gcc-3c642f929e645b645c03b6d2490da25d46d6f4e7.tar.gz |
builtins.c (fold_builtin_cproj): Fold more cases.
* builtins.c (fold_builtin_cproj): Fold more cases.
testsuite:
* gcc.dg/torture/builtin-cproj-1.c: Test more cases.
From-SVN: r158574
Diffstat (limited to 'gcc/builtins.c')
-rw-r--r-- | gcc/builtins.c | 27 |
1 files changed, 27 insertions, 0 deletions
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; } |