https://gcc.gnu.org/bugzilla/show_bug.cgi?id=91446

            Bug ID: 91446
           Summary: Wrong cost for scalar_load/scalar_store of vector type
           Product: gcc
           Version: 10.0
            Status: UNCONFIRMED
          Severity: normal
          Priority: P3
         Component: target
          Assignee: unassigned at gcc dot gnu.org
          Reporter: hjl.tools at gmail dot com
  Target Milestone: ---
            Target: i386

[hjl@gnu-skx-1 skx-3]$ cat x.i
typedef struct
{
  unsigned long width, height;
  long x, y;
} info;

extern void bar (info *);

void
foo (unsigned long width, unsigned long height, long x, long y)
{
  info t;
  t.width = width;
  t.height = height;
  t.x = x;
  t.y = y;
  bar (&t);
}
[hjl@gnu-skx-1 skx-3]$ make x.s
/export/build/gnu/tools-build/gcc-tuning-debug/build-x86_64-linux/gcc/xgcc
-B/export/build/gnu/tools-build/gcc-tuning-debug/build-x86_64-linux/gcc/ -Ofast
-march=skylake-avx512 -S x.i
[hjl@gnu-skx-1 skx-3]$ cat x.s
        .file   "x.i"
        .text
        .p2align 4
        .globl  foo
        .type   foo, @function
foo:
.LFB0:
        .cfi_startproc
        subq    $40, %rsp
        .cfi_def_cfa_offset 48
        movq    %rdi, (%rsp)
        movq    %rsp, %rdi
        movq    %rsi, 8(%rsp)
        movq    %rdx, 16(%rsp)
        movq    %rcx, 24(%rsp)
        call    bar
        addq    $40, %rsp
        .cfi_def_cfa_offset 8
        ret
        .cfi_endproc
.LFE0:
        .size   foo, .-foo
        .ident  "GCC: (GNU) 10.0.0 20190812 (experimental)"
        .section        .note.GNU-stack,"",@progbits
[hjl@gnu-skx-1 skx-3]$ 

The problem is

(gdb) f 0
#0  ix86_builtin_vectorization_cost (type_of_cost=scalar_store, 
    vectype=0x7fffea63abd0)
    at /export/gnu/import/git/intel/gcc-tuning/gcc/config/i386/i386.c:21090
21090                                 : ix86_cost->int_store [2]) / 2;
(gdb) p mode
$7 = E_V2DImode
(gdb) 

     case scalar_load:
        /* load/store costs are relative to register move which is 2. Recompute
           it to COSTS_N_INSNS so everything have same base.  */
        return COSTS_N_INSNS (fp ? ix86_cost->sse_load[0]
                              : ix86_cost->int_load [2]) / 2;

      case scalar_store:
        return COSTS_N_INSNS (fp ? ix86_cost->sse_store[0]
                              : ix86_cost->int_store [2]) / 2;

2 DImode stores/loads are needed to store/load V2DImode.

Reply via email to