On Wed, Jun 27, 2012 at 02:36:14PM -0700, Richard Henderson wrote:
> As noticed by Igor Zamyatin.  Committed.

> PR target/53749
>         * config/i386/i386.c (ix86_rtx_costs): Fix typo vs UNITS_PER_WORD
>         in 2012-06-23 change.  Adjust two other DImode tests as well.

This change broke cost computation for vector PLUS/MINUS/AND/IOR/XOR,
the vector modes are all wider than word, but they are now all handled as
double word integer arithmetics.

> ---
>  gcc/ChangeLog          |    6 ++++++
>  gcc/config/i386/i386.c |    8 +++-----
>  2 files changed, 9 insertions(+), 5 deletions(-)
> 
> diff --git a/gcc/config/i386/i386.c b/gcc/config/i386/i386.c
> index edfc649..aae8a4d 100644
> --- a/gcc/config/i386/i386.c
> +++ b/gcc/config/i386/i386.c
...
> @@ -32441,7 +32440,7 @@ ix86_rtx_costs (rtx x, int code_i, int outer_code_i, 
> int opno, int *total,
>      case AND:
>      case IOR:
>      case XOR:
> -      if (!TARGET_64BIT && mode == DImode)
> +      if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
>       {
>         *total = (cost->add * 2
>                   + (rtx_cost (XEXP (x, 0), outer_code, opno, speed)

Fixed thusly, bootstrapped/regtested on x86_64-linux and i686-linux, ok for
trunk?

2012-09-18  Jakub Jelinek  <ja...@redhat.com>

        PR target/54592
        * config/i386/i386.c (ix86_rtx_costs): Limit > UNITS_PER_WORD
        AND/IOR/XOR cost calculation to MODE_INT class modes.

        * gcc.target/i386/pr54592.c: New test.

--- gcc/config/i386/i386.c.jj   2012-09-13 18:29:08.000000000 +0200
+++ gcc/config/i386/i386.c      2012-09-18 08:55:08.747028184 +0200
@@ -32792,7 +32792,8 @@ ix86_rtx_costs (rtx x, int code_i, int o
     case AND:
     case IOR:
     case XOR:
-      if (GET_MODE_SIZE (mode) > UNITS_PER_WORD)
+      if (GET_MODE_CLASS (mode) == MODE_INT
+         && GET_MODE_SIZE (mode) > UNITS_PER_WORD)
        {
          *total = (cost->add * 2
                    + (rtx_cost (XEXP (x, 0), outer_code, opno, speed)
--- gcc/testsuite/gcc.target/i386/pr54592.c.jj  2012-09-18 09:06:09.399013382 
+0200
+++ gcc/testsuite/gcc.target/i386/pr54592.c     2012-09-18 09:13:04.482914236 
+0200
@@ -0,0 +1,17 @@
+/* PR target/54592 */
+/* { dg-do compile } */
+/* { dg-options "-Os -msse2" } */
+/* { dg-require-effective-target sse2 } */
+
+#include <emmintrin.h>
+
+void
+func (__m128i * foo, size_t a, size_t b, int *dst)
+{
+  __m128i x = foo[a];
+  __m128i y = foo[b];
+  __m128i sum = _mm_add_epi32 (x, y);
+  *dst = _mm_cvtsi128_si32 (sum);
+}
+
+/* { dg-final { scan-assembler "paddd\[^\n\r\]*(\\(\[^\n\r\]*\\)|XMMWORD PTR)" 
} } */


        Jakub

Reply via email to