Commit 95aa28ae by Richard Kenner

(fold...

(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.

From-SVN: r6313
parent 75326e8c
......@@ -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.
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment