optabs.c (expand_binop): Optimize complex multiplication for the case of squaring...
authorRoger Sayle <roger@eyesopen.com>
Wed, 4 Jun 2003 04:42:14 +0000 (04:42 +0000)
committerRoger Sayle <sayle@gcc.gnu.org>
Wed, 4 Jun 2003 04:42:14 +0000 (04:42 +0000)
* optabs.c (expand_binop): Optimize complex multiplication for
the case of squaring a complex argument.

From-SVN: r67418

gcc/ChangeLog
gcc/optabs.c

index 034d6cc..82c26bc 100644 (file)
@@ -1,5 +1,10 @@
 2003-06-03  Roger Sayle  <roger@eyesopen.com>
 
+       * optabs.c (expand_binop): Optimize complex multiplication for
+       the case of squaring a complex argument.
+
+2003-06-03  Roger Sayle  <roger@eyesopen.com>
+
        * optabs.c (expand_binop): Attempt to reuse pseudos for duplicate
        non-volatile operands of binary operations.
        (prepare_cmp_insn): Likewise.
index 171d13f..c693e80 100644 (file)
@@ -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;