summaryrefslogtreecommitdiff
path: root/gcc/builtins.c
diff options
context:
space:
mode:
authorKaveh R. Ghazi <ghazi@caip.rutgers.edu>2010-04-20 20:12:47 +0000
committerKaveh Ghazi <ghazi@gcc.gnu.org>2010-04-20 20:12:47 +0000
commit3c642f929e645b645c03b6d2490da25d46d6f4e7 (patch)
tree0571f6c98a4bec862a18389e5fe90d9a038b4cf5 /gcc/builtins.c
parent43272bf5fd3d66bf2fd05d11cf66dc0d1116a701 (diff)
downloadgcc-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.c27
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;
}