On 5/15/19 8:10 AM, Michael Matz wrote:> On Tue, 14 May 2019, Aaron Sawdey wrote: > >> memcpy -> expand with movmem pattern >> memmove (no overlap) -> transform to memcpy -> expand with movmem pattern >> memmove (overlap) -> remains memmove -> glibc call > ... >> However in builtins.c expand_builtin_memmove() does not actually do the >> expansion using the memmove pattern. > > Because it can't: the movmem pattern is not defined to require handling > overlaps, and hence can't be used for any possibly overlapping > memmove. (So, in a way the pattern is misnamed and should probably have > been called cpymem from the beginning, alas there we are). > >> So here's my proposed set of fixes: >> * Add new optab entries for nonoverlapping_memcpy and overlapping_memmove >> cases. > > Wouldn't it be nicer to rename the current movmem pattern to cpymem > wholesale for all ports (i.e. roughly a big s/movmem/cpymem/ over the > whole tree) and then introduce a new optional movmem pattern with > overlapping semantics?
Yeah that makes a lot of sense. I was unaware of that history, and was led astray by the fact that the powerpc implementation of movemem works by doing a bunch of loads into registers followed by a bunch of stores and so (I think) would actually work for the overlap case. Thanks, Aaron -- Aaron Sawdey, Ph.D. acsaw...@linux.vnet.ibm.com 050-2/C113 (507) 253-7520 home: 507/263-0782 IBM Linux Technology Center - PPC Toolchain