[Bug tree-optimization/80937] New: redundant bcopy/memcpy/strcpy to a non-local object not eliminated
msebor at gcc dot gnu.org
gcc-bugzilla@gcc.gnu.org
Thu Jun 1 03:13:00 GMT 2017
https://gcc.gnu.org/bugzilla/show_bug.cgi?id=80937
Bug ID: 80937
Summary: redundant bcopy/memcpy/strcpy to a non-local object
not eliminated
Product: gcc
Version: 7.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 eliminates redundant calls to bcopy and memcpy involving the same local
variable but doesn't eliminate redundant calls to the same two functions when
the target is the same global variable, or a pointer to some unknown variable.
It does, however, eliminate calls to bzero and memset regardless of whether of
the storage duration of the target object. This seems like a missed
optimization opportunity.
$ cat t.c && gcc -O2 -S -Wall -Wextra -fdump-tree-optimized=/dev/stdout t.c
void sink (void*);
char a[33];
void memcpy_global (const void *s)
{
__builtin_memcpy (a, s, sizeof a);
__builtin_memcpy (a, s, sizeof a);
sink (a);
}
void bcopy_global (const void *s)
{
__builtin_bcopy (s, a, sizeof a);
__builtin_bcopy (s, a, sizeof a);
sink (a);
}
void memset_global (void)
{
__builtin_memset (a, 0, sizeof a);
__builtin_memset (a, 0, sizeof a);
sink (a);
}
void bzero_global (void)
{
__builtin_memset (a, 0, sizeof a);
__builtin_memset (a, 0, sizeof a);
sink (a);
}
void memcpy_local (const void *s)
{
char a[33];
__builtin_memcpy (a, s, sizeof a);
__builtin_memcpy (a, s, sizeof a);
sink (a);
}
void bcopy_local (const void *s)
{
char a[33];
__builtin_bcopy (s, a, sizeof a);
__builtin_bcopy (s, a, sizeof a);
sink (a);
}
void memset_local (void)
{
char a[33];
__builtin_memset (a, 0, sizeof a);
__builtin_memset (a, 0, sizeof a);
sink (a);
}
void bzero_local (void)
{
char a[33];
__builtin_memset (a, 0, sizeof a);
__builtin_memset (a, 0, sizeof a);
sink (a);
}
;; Function memcpy_global (memcpy_global, funcdef_no=0, decl_uid=1796,
cgraph_uid=0, symbol_order=1)
memcpy_global (const void * s)
{
<bb 2> [100.00%]:
MEM[(char * {ref-all})&a] = MEM[(char * {ref-all})s_2(D)];
MEM[(char * {ref-all})&a] = MEM[(char * {ref-all})s_2(D)];
sink (&a); [tail call]
return;
}
;; Function bcopy_global (bcopy_global, funcdef_no=1, decl_uid=1799,
cgraph_uid=1, symbol_order=2)
bcopy_global (const void * s)
{
<bb 2> [100.00%]:
__builtin_bcopy (s_2(D), &a, 33);
__builtin_bcopy (s_2(D), &a, 33);
sink (&a); [tail call]
return;
}
;; Function memset_global (memset_global, funcdef_no=2, decl_uid=1802,
cgraph_uid=2, symbol_order=3)
memset_global ()
{
<bb 2> [100.00%]:
__builtin_memset (&a, 0, 33);
sink (&a); [tail call]
return;
}
;; Function bzero_global (bzero_global, funcdef_no=9, decl_uid=1805,
cgraph_uid=3, symbol_order=4)
bzero_global ()
{
<bb 2> [100.00%]:
memset_global (); [tail call]
return;
}
;; Function memcpy_local (memcpy_local, funcdef_no=4, decl_uid=1808,
cgraph_uid=4, symbol_order=5)
memcpy_local (const void * s)
{
char a[33];
<bb 2> [100.00%]:
MEM[(char * {ref-all})&a] = MEM[(char * {ref-all})s_2(D)];
sink (&a);
a ={v} {CLOBBER};
return;
}
;; Function bcopy_local (bcopy_local, funcdef_no=11, decl_uid=1812,
cgraph_uid=5, symbol_order=6)
bcopy_local (const void * s)
{
<bb 2> [100.00%]:
memcpy_local (s_2(D)); [tail call]
return;
}
;; Function memset_local (memset_local, funcdef_no=6, decl_uid=1816,
cgraph_uid=6, symbol_order=7)
memset_local ()
{
char a[33];
<bb 2> [100.00%]:
__builtin_memset (&a, 0, 33);
sink (&a);
a ={v} {CLOBBER};
return;
}
;; Function bzero_local (bzero_local, funcdef_no=13, decl_uid=1820,
cgraph_uid=7, symbol_order=8)
bzero_local ()
{
<bb 2> [100.00%]:
memset_local (); [tail call]
return;
}
More information about the Gcc-bugs
mailing list