[Bug tree-optimization/93556] New: lower mempcpy to memcpy when result is unused
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Mon Feb 3 18:49:00 GMT 2020
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=93556
Bug ID: 93556
Summary: lower mempcpy to memcpy when result is unused
Product: gcc
Version: 10.0
Status: UNCONFIRMED
Severity: normal
Priority: P3
Component: tree-optimization
Assignee: unassigned at gcc dot gnu.org
Reporter: msebor at gcc dot gnu.org
Target Milestone: ---
GCC lowers calls to strpcpy whose result isn't used to strcpy, presumably
because the latter tends to be more efficient. With pr90263 resolved, GCC also
expands some calls to mempcpy to memcpy on most targets, again because the
latter is almost always more efficient. But when the result of the mempcpy
call is not used, the call could be transformed to memcpy unconditionally, on
all targets, including those like x86 where targetm.libc_has_fast_function
(BUILT_IN_MEMPCPY) returns true.
$ cat a.c && gcc -S -Wall -fdump-tree-lower=/dev/stdout a.c
void f0 (char *d, const char *s)
{
__builtin_stpcpy (d, s); // lowered to strcpy
}
void f1 (void *d, const void *s, __SIZE_TYPE__ n)
{
__builtin_mempcpy (d, s, n); // should be lowered to memcpy
}
;; Function f0 (f0, funcdef_no=0, decl_uid=1931, cgraph_uid=1, symbol_order=0)
f0 (char * d, const char * s)
{
__builtin_strcpy (d, s);
return;
}
;; Function f1 (f1, funcdef_no=1, decl_uid=1936, cgraph_uid=2, symbol_order=1)
f1 (void * d, const void * s, long unsigned int n)
{
__builtin_mempcpy (d, s, n);
return;
}
More information about the Gcc-bugs
mailing list