From: kenner Date: Sat, 25 Dec 1993 13:52:25 +0000 (+0000) Subject: (fold, case EQ_EXPR, NE_EXPR): If COMPLEX_TYPE and at least one arg is X-Git-Url: http://review.tizen.org/git/?a=commitdiff_plain;h=a77cc7ac703834b67a3846ef298c0f1beb191c12;p=platform%2Fupstream%2Flinaro-gcc.git (fold, case EQ_EXPR, NE_EXPR): If COMPLEX_TYPE and at least one arg is a COMPLEX_EXPR, split into a logical operation on the real and imaginary parts. git-svn-id: svn+ssh://gcc.gnu.org/svn/gcc/trunk@6313 138bc75d-0d04-0410-961f-82ee72b054a4 --- diff --git a/gcc/fold-const.c b/gcc/fold-const.c index 6821c06..6424737 100644 --- a/gcc/fold-const.c +++ b/gcc/fold-const.c @@ -4479,6 +4479,28 @@ fold (expr) return t1 ? t1 : t; } + /* If this is a comparison of complex values and either or both + sizes are a COMPLEX_EXPR, it is best to split up the comparisons + and join them with a TRUTH_ANDIF_EXPR or TRUTH_ORIF_EXPR. This + may prevent needless evaluations. */ + if ((code == EQ_EXPR || code == NE_EXPR) + && TREE_CODE (TREE_TYPE (arg0)) == COMPLEX_TYPE + && (TREE_CODE (arg0) == COMPLEX_EXPR + || TREE_CODE (arg1) == COMPLEX_EXPR)) + { + tree subtype = TREE_TYPE (TREE_TYPE (arg0)); + tree real0 = fold (build1 (REALPART_EXPR, subtype, arg0)); + tree imag0 = fold (build1 (IMAGPART_EXPR, subtype, arg0)); + tree real1 = fold (build1 (REALPART_EXPR, subtype, arg1)); + tree imag1 = fold (build1 (IMAGPART_EXPR, subtype, arg1)); + + return fold (build ((code == EQ_EXPR ? TRUTH_ANDIF_EXPR + : TRUTH_ORIF_EXPR), + type, + fold (build (code, type, real0, real1)), + fold (build (code, type, imag0, imag1)))); + } + /* From here on, the only cases we handle are when the result is known to be a constant.