[PATCH v3 00/12] Allow TImode/OImode/XImode in op_by_pieces operations
H.J. Lu
hjl.tools@gmail.com
Tue May 18 15:58:07 GMT 2021
On Tue, May 18, 2021 at 12:31 AM Bernd Edlinger
<bernd.edlinger@hotmail.de> wrote:
>
> On 5/17/21 3:15 PM, H.J. Lu via Gcc-patches wrote:
> > Changes in the v3 patches:
> >
> > 1. Split the TARGET_READ_MEMSET_VALUE and TARGET_GEN_MEMSET_VALUE changes
> > into the generic part and the x86 part.
> >
> >
> > 1. Add TARGET_READ_MEMSET_VALUE and TARGET_GEN_MEMSET_VALUE to support
> > target instructions to duplicate QImode value to TImode/OImode/XImode
> > value for memmset.
> > 2. x86: Avoid stack realignment when copying data
> > 3. x86: Remov MAX_BITSIZE_MODE_ANY_INT. Only x86 backend defines it.
> > 4. x86: Use TImode/OImode/XImode integers for piecewise move and store.
> > 5. x86: Add tests for TImode/OImode/XImode for piecewise move and store.
> > 6. x86: Adjust existing tests.
> >
> > On x86-64, SPEC CPU 2017 performance impact is neutral. Glibc code size
> > differences with -O2 build are:
> >
> > Before After
> > libc.so 1906572 1906444
> >
> > Some code sequence differences in libc.so are:
> >
> > <svcudp_bufcreate@GLIBC_2.2.5>:
> > ...
> > jne <svcudp_bufcreate@GLIBC_2.2.5+0x318> | jne <svcudp_bufcreate@GLIBC_2.2.5+0x2a8>
> > test %r15,%r15 test %r15,%r15
> > je <svcudp_bufcreate@GLIBC_2.2.5+0x318> | je <svcudp_bufcreate@GLIBC_2.2.5+0x2a8>
> > mov %r13d,(%r14) mov %r13d,(%r14)
> > lea 0x10(%r14),%rdi lea 0x10(%r14),%rdi
> > mov $0x1,%ecx mov $0x1,%ecx
> > mov %r13d,%edx mov %r13d,%edx
> > mov %r15,0x40(%r12) mov %r15,0x40(%r12)
> > mov %r15,%rsi mov %r15,%rsi
> > call <xdrmem_create@GLIBC_2.2.5> call <xdrmem_create@GLIBC_2.2.5>
> > lea 0xa2f9b(%rip),%rax # <svcudp_op> | lea 0xa2fab(%rip),%rax # <svcudp_op>
> > xor %esi,%esi xor %esi,%esi
> > mov %ebp,%edi mov %ebp,%edi
> > mov %rax,0x8(%r12) mov %rax,0x8(%r12)
> > movzwl 0x12(%rsp),%eax movzwl 0x12(%rsp),%eax
> > mov $0x8,%edx <
> > lea 0xc(%rsp),%rcx lea 0xc(%rsp),%rcx
> > mov %r14,0x48(%r12) <
> > add $0x40,%r14 <
> > mov $0x4,%r8d mov $0x4,%r8d
> > > movq $0x0,0x1d0(%r14)
> > > mov $0x8,%edx
> > rol $0x8,%ax rol $0x8,%ax
> > mov %ebp,(%r12) | mov %r14,0x48(%r12)
> > movq $0x0,0x190(%r14) | add $0x40,%r14
> > mov %ax,0x4(%r12) <
> > mov %r14,0x30(%r12) mov %r14,0x30(%r12)
> > > mov %ax,0x4(%r12)
> > > mov %ebp,(%r12)
> > movl $0x1,0xc(%rsp) movl $0x1,0xc(%rsp)
> > call <setsockopt> call <setsockopt>
> > mov %r12,%rdi mov %r12,%rdi
> > movabs $0x101010101010101,%rdx <
> > test %eax,%eax test %eax,%eax
> > mov $0xff,%eax mov $0xff,%eax
> > cmove %eax,%ebx cmove %eax,%ebx
> > movzbl %bl,%eax | movd %ebx,%xmm0
> > mov %ebx,0xc(%rsp) mov %ebx,0xc(%rsp)
> > mov %rax,%rsi | punpcklbw %xmm0,%xmm0
> > imul %rdx,%rsi | punpcklwd %xmm0,%xmm0
> > mul %rdx | pshufd $0x0,%xmm0,%xmm0
> > add %rsi,%rdx | movups %xmm0,0x50(%r12)
> > mov %rax,0x50(%r12) | movups %xmm0,0x60(%r12)
> > mov %rdx,0x58(%r12) | movups %xmm0,0x70(%r12)
> > mov %rax,0x60(%r12) | movups %xmm0,0x80(%r12)
> > mov %rdx,0x68(%r12) | movups %xmm0,0x90(%r12)
> > mov %rax,0x70(%r12) | movups %xmm0,0xa0(%r12)
> > mov %rdx,0x78(%r12) | movups %xmm0,0xb0(%r12)
> > mov %rax,0x80(%r12) | movups %xmm0,0xc0(%r12)
> > mov %rdx,0x88(%r12) | movups %xmm0,0xd0(%r12)
> > mov %rax,0x90(%r12) | movups %xmm0,0xe0(%r12)
> > mov %rdx,0x98(%r12) | movups %xmm0,0xf0(%r12)
> > mov %rax,0xa0(%r12) | movups %xmm0,0x100(%r12)
> > mov %rdx,0xa8(%r12) | movups %xmm0,0x110(%r12)
> > mov %rax,0xb0(%r12) | movups %xmm0,0x120(%r12)
> > mov %rdx,0xb8(%r12) | movups %xmm0,0x130(%r12)
> > mov %rax,0xc0(%r12) | movups %xmm0,0x140(%r12)
> > mov %rdx,0xc8(%r12) <
> > mov %rax,0xd0(%r12) <
> > mov %rdx,0xd8(%r12) <
> > mov %rax,0xe0(%r12) <
> > mov %rdx,0xe8(%r12) <
> > mov %rax,0xf0(%r12) <
> > mov %rdx,0xf8(%r12) <
> > mov %rax,0x100(%r12) <
> > mov %rdx,0x108(%r12) <
> > mov %rax,0x110(%r12) <
> > mov %rdx,0x118(%r12) <
> > mov %rax,0x120(%r12) <
> > mov %rdx,0x128(%r12) <
> > mov %rax,0x130(%r12) <
> > mov %rdx,0x138(%r12) <
> > mov %rax,0x140(%r12) <
> > mov %rdx,0x148(%r12) <
> > call <xprt_register@GLIBC_2.2.5> call <xprt_register@GLIBC_2.2.5>
> > add $0x28,%rsp add $0x28,%rsp
> > mov %r12,%rax mov %r12,%rax
> > pop %rbx pop %rbx
> > pop %rbp pop %rbp
> > pop %r12 pop %r12
> > pop %r13 pop %r13
> > pop %r14 pop %r14
> > pop %r15 pop %r15
> > ret ret
> >
> >
> > H.J. Lu (12):
> > Add TARGET_READ_MEMSET_VALUE/TARGET_GEN_MEMSET_VALUE
> > x86: Add TARGET_READ_MEMSET_VALUE/TARGET_GEN_MEMSET_VALUE
> > x86: Avoid stack realignment when copying data
> > Remove MAX_BITSIZE_MODE_ANY_INT
> > x86: Update piecewise move and store
> > x86: Add AVX2 tests for PR middle-end/90773
> > x86: Add tests for piecewise move and store
> > x86: Also pass -mno-avx to pr72839.c
> > x86: Also pass -mno-avx to cold-attribute-1.c
> > x86: Also pass -mno-avx to sw-1.c for ia32
> > x86: Update gcc.target/i386/incoming-11.c
> > constructor: Check if it is faster to load constant from memory
> >
> > gcc/builtins.c | 47 +--
> > gcc/config/i386/i386-expand.c | 18 +-
> > gcc/config/i386/i386-modes.def | 15 +-
> > gcc/config/i386/i386-protos.h | 5 +
> > gcc/config/i386/i386.c | 289 +++++++++++++++++-
> > gcc/config/i386/i386.h | 35 ++-
> > gcc/doc/tm.texi | 16 +
> > gcc/doc/tm.texi.in | 4 +
> > gcc/expr.c | 10 +
> > gcc/target.def | 20 ++
> > gcc/targhooks.c | 56 ++++
> > gcc/targhooks.h | 4 +
> > .../gcc.target/i386/cold-attribute-1.c | 2 +-
> > gcc/testsuite/gcc.target/i386/eh_return-1.c | 26 ++
> > gcc/testsuite/gcc.target/i386/incoming-11.c | 2 +-
> > .../gcc.target/i386/pieces-memcpy-10.c | 16 +
> > .../gcc.target/i386/pieces-memcpy-11.c | 17 ++
> > .../gcc.target/i386/pieces-memcpy-12.c | 16 +
> > .../gcc.target/i386/pieces-memcpy-13.c | 16 +
> > .../gcc.target/i386/pieces-memcpy-14.c | 17 ++
> > .../gcc.target/i386/pieces-memcpy-15.c | 16 +
> > .../gcc.target/i386/pieces-memcpy-16.c | 16 +
> > .../gcc.target/i386/pieces-memcpy-7.c | 15 +
> > .../gcc.target/i386/pieces-memcpy-8.c | 14 +
> > .../gcc.target/i386/pieces-memcpy-9.c | 14 +
> > .../gcc.target/i386/pieces-memset-1.c | 16 +
> > .../gcc.target/i386/pieces-memset-10.c | 16 +
> > .../gcc.target/i386/pieces-memset-11.c | 16 +
> > .../gcc.target/i386/pieces-memset-12.c | 16 +
> > .../gcc.target/i386/pieces-memset-13.c | 16 +
> > .../gcc.target/i386/pieces-memset-14.c | 16 +
> > .../gcc.target/i386/pieces-memset-15.c | 16 +
> > .../gcc.target/i386/pieces-memset-16.c | 16 +
> > .../gcc.target/i386/pieces-memset-17.c | 16 +
> > .../gcc.target/i386/pieces-memset-18.c | 16 +
> > .../gcc.target/i386/pieces-memset-19.c | 17 ++
> > .../gcc.target/i386/pieces-memset-2.c | 12 +
> > .../gcc.target/i386/pieces-memset-20.c | 17 ++
> > .../gcc.target/i386/pieces-memset-21.c | 17 ++
> > .../gcc.target/i386/pieces-memset-22.c | 17 ++
> > .../gcc.target/i386/pieces-memset-23.c | 17 ++
> > .../gcc.target/i386/pieces-memset-24.c | 17 ++
> > .../gcc.target/i386/pieces-memset-25.c | 17 ++
> > .../gcc.target/i386/pieces-memset-26.c | 17 ++
> > .../gcc.target/i386/pieces-memset-27.c | 17 ++
> > .../gcc.target/i386/pieces-memset-28.c | 17 ++
> > .../gcc.target/i386/pieces-memset-29.c | 17 ++
> > .../gcc.target/i386/pieces-memset-3.c | 18 ++
> > .../gcc.target/i386/pieces-memset-30.c | 17 ++
> > .../gcc.target/i386/pieces-memset-31.c | 17 ++
> > .../gcc.target/i386/pieces-memset-32.c | 17 ++
> > .../gcc.target/i386/pieces-memset-33.c | 17 ++
> > .../gcc.target/i386/pieces-memset-34.c | 17 ++
> > .../gcc.target/i386/pieces-memset-35.c | 17 ++
> > .../gcc.target/i386/pieces-memset-36.c | 17 ++
> > .../gcc.target/i386/pieces-memset-37.c | 15 +
> > .../gcc.target/i386/pieces-memset-38.c | 17 ++
> > .../gcc.target/i386/pieces-memset-39.c | 16 +
> > .../gcc.target/i386/pieces-memset-4.c | 16 +
> > .../gcc.target/i386/pieces-memset-40.c | 17 ++
> > .../gcc.target/i386/pieces-memset-41.c | 16 +
> > .../gcc.target/i386/pieces-memset-42.c | 17 ++
> > .../gcc.target/i386/pieces-memset-43.c | 17 ++
> > .../gcc.target/i386/pieces-memset-5.c | 12 +
> > .../gcc.target/i386/pieces-memset-6.c | 16 +
> > .../gcc.target/i386/pieces-memset-7.c | 16 +
> > .../gcc.target/i386/pieces-memset-8.c | 16 +
> > .../gcc.target/i386/pieces-memset-9.c | 16 +
> > gcc/testsuite/gcc.target/i386/pr72839.c | 2 +-
> > gcc/testsuite/gcc.target/i386/pr90773-1.c | 10 +-
> > gcc/testsuite/gcc.target/i386/pr90773-14.c | 2 +-
> > gcc/testsuite/gcc.target/i386/pr90773-15.c | 14 +
> > gcc/testsuite/gcc.target/i386/pr90773-16.c | 14 +
> > gcc/testsuite/gcc.target/i386/pr90773-17.c | 14 +
> > gcc/testsuite/gcc.target/i386/pr90773-18.c | 15 +
> > gcc/testsuite/gcc.target/i386/pr90773-19.c | 14 +
> > gcc/testsuite/gcc.target/i386/pr90773-20.c | 13 +
> > gcc/testsuite/gcc.target/i386/pr90773-21.c | 13 +
> > gcc/testsuite/gcc.target/i386/pr90773-22.c | 13 +
> > gcc/testsuite/gcc.target/i386/pr90773-23.c | 13 +
> > gcc/testsuite/gcc.target/i386/pr90773-24.c | 22 ++
> > gcc/testsuite/gcc.target/i386/pr90773-25.c | 20 ++
> > gcc/testsuite/gcc.target/i386/pr90773-4.c | 2 +-
> > gcc/testsuite/gcc.target/i386/sw-1.c | 1 +
> > 84 files changed, 1509 insertions(+), 82 deletions(-)
> > create mode 100644 gcc/testsuite/gcc.target/i386/eh_return-1.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-10.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-11.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-12.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-13.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-14.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-15.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-16.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-7.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-8.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memcpy-9.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-1.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-10.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-11.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-12.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-13.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-14.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-15.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-16.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-17.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-18.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-19.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-2.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-20.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-21.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-22.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-23.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-24.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-25.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-26.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-27.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-28.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-29.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-3.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-30.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-31.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-32.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-33.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-34.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-35.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-36.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-37.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-38.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-39.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-4.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-40.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-41.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-42.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-43.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-5.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-6.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-7.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-8.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pieces-memset-9.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-15.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-16.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-17.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-18.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-19.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-20.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-21.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-22.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-23.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-24.c
> > create mode 100644 gcc/testsuite/gcc.target/i386/pr90773-25.c
> >
>
> Hello,
>
> I've tried this patch series, and found it seems to cause the following regression
> on x86_64-pc-linux-gnu:
>
> FAIL: gnat.dg/opt87.adb scan-tree-dump store-merging "1 stores to replace old one of 6 stores"
The problem is that
* config/i386/i386.h (MOVE_MAX): Set to 64.
MOVE_MAX should be set to MOVE_MAX_PIECES and MAX_MOVE_MAX should be
defined to 64 instead. I am testing a fix.
--
H.J.
More information about the Gcc-patches
mailing list