diff --git a/gcc/ChangeLog b/gcc/ChangeLog index 034d6cc7767..82c26bc4b38 100644 --- a/gcc/ChangeLog +++ b/gcc/ChangeLog @@ -1,3 +1,8 @@ +2003-06-03 Roger Sayle + + * optabs.c (expand_binop): Optimize complex multiplication for + the case of squaring a complex argument. + 2003-06-03 Roger Sayle * optabs.c (expand_binop): Attempt to reuse pseudos for duplicate diff --git a/gcc/optabs.c b/gcc/optabs.c index 171d13f2d6e..c693e80079a 100644 --- a/gcc/optabs.c +++ b/gcc/optabs.c @@ -1647,8 +1647,13 @@ expand_binop (mode, binoptab, op0, op1, target, unsignedp, methods) temp1 = expand_binop (submode, binoptab, real0, imag1, NULL_RTX, unsignedp, methods); - temp2 = expand_binop (submode, binoptab, real1, imag0, - NULL_RTX, unsignedp, methods); + /* Avoid expanding redundant multiplication for the common + case of squaring a complex number. */ + if (rtx_equal_p (real0, real1) && rtx_equal_p (imag0, imag1)) + temp2 = temp1; + else + temp2 = expand_binop (submode, binoptab, real1, imag0, + NULL_RTX, unsignedp, methods); if (temp1 == 0 || temp2 == 0) break;