i386: Improve memory copy from named address space [PR111657]
The stringop strategy selection algorithm falls back to a libcall strategy when it exhausts its pool of available strategies. The memory area copy function (memcpy) is not availabe from the system library for non-default address spaces, so the compiler emits the most trivial byte-at-a-time copy loop instead. The compiler should instead emit an optimized copy loop as a fallback for non-default address spaces. PR target/111657 gcc/ChangeLog: * config/i386/i386-expand.cc (alg_usable_p): Reject libcall strategy for non-default address spaces. (decide_alg): Use loop strategy as a fallback strategy for non-default address spaces. gcc/testsuite/ChangeLog: * gcc.target/i386/pr111657.c: New test.
This commit is contained in:
parent
e866d08d8b
commit
c6bff80d78
2 changed files with 19 additions and 1 deletions
|
@ -8320,6 +8320,11 @@ alg_usable_p (enum stringop_alg alg, bool memset, bool have_as)
|
|||
{
|
||||
if (alg == no_stringop)
|
||||
return false;
|
||||
/* It is not possible to use a library call if we have non-default
|
||||
address space. We can do better than the generic byte-at-a-time
|
||||
loop, used as a fallback. */
|
||||
if (alg == libcall && have_as)
|
||||
return false;
|
||||
if (alg == vector_loop)
|
||||
return TARGET_SSE || TARGET_AVX;
|
||||
/* Algorithms using the rep prefix want at least edi and ecx;
|
||||
|
@ -8494,8 +8499,12 @@ decide_alg (HOST_WIDE_INT count, HOST_WIDE_INT expected_size,
|
|||
gcc_assert (alg != libcall);
|
||||
return alg;
|
||||
}
|
||||
|
||||
/* Try to use some reasonable fallback algorithm. Note that for
|
||||
non-default address spaces we default to a loop instead of
|
||||
a libcall. */
|
||||
return (alg_usable_p (algs->unknown_size, memset, have_as)
|
||||
? algs->unknown_size : libcall);
|
||||
? algs->unknown_size : have_as ? loop : libcall);
|
||||
}
|
||||
|
||||
/* Decide on alignment. We know that the operand is already aligned to ALIGN
|
||||
|
|
9
gcc/testsuite/gcc.target/i386/pr111657.c
Normal file
9
gcc/testsuite/gcc.target/i386/pr111657.c
Normal file
|
@ -0,0 +1,9 @@
|
|||
/* { dg-do compile } */
|
||||
/* { dg-options "-O2 -fdump-rtl-expand -mno-sse" } */
|
||||
|
||||
struct a { long arr[30]; };
|
||||
|
||||
__seg_gs struct a m;
|
||||
void bar (struct a *dst) { *dst = m; }
|
||||
|
||||
/* { dg-final { scan-rtl-dump-not "libcall" "expand" } } */
|
Loading…
Add table
Reference in a new issue