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.