This is the mail archive of the
gcc-bugs@gcc.gnu.org
mailing list for the GCC project.
[Bug rtl-optimization/23561] New: nonoverlapping_memrefs_p returns true even for overlapping memory references
- From: "jakub at gcc dot gnu dot org" <gcc-bugzilla at gcc dot gnu dot org>
- To: gcc-bugs at gcc dot gnu dot org
- Date: 25 Aug 2005 15:34:38 -0000
- Subject: [Bug rtl-optimization/23561] New: nonoverlapping_memrefs_p returns true even for overlapping memory references
- Reply-to: gcc-bugzilla at gcc dot gnu dot org
struct A
{
char a1[1];
char a2[5];
char a3[1];
char a4[2048 - 7];
} a;
typedef __SIZE_TYPE__ size_t;
extern void *memset (void *, int, size_t);
extern void *memcpy (void *, const void *, size_t);
extern int memcmp (const void *, const void *, size_t);
extern void abort (void);
void
bar (struct A *x)
{
size_t i;
if (memcmp (x, "\1HELLO\1", sizeof "\1HELLO\1"))
abort ();
for (i = 0; i < sizeof (x->a4); i++)
if (x->a4[i])
abort ();
}
int
foo (void)
{
memset (&a, 0, sizeof (a));
a.a1[0] = 1;
memcpy (a.a2, "HELLO", sizeof "HELLO");
a.a3[0] = 1;
bar (&a);
return 0;
}
int
main (void)
{
foo ();
return 0;
}
is miscompiled on ppc-linux at -O2 and -O3 (assuming the testcase is valid).
The 2 memcpy (a.a2, ...) instructions get swapped with a.a3[0] = 1 insn during
sched2, because nonoverlapping_memrefs_p says:
(mem/s:HI (plus:SI (reg/f:SI 29 29 [120]) (const_int 5 [0x5])) [0 a.a2+4 S2 A8])
and
(mem/s:QI (plus:SI (reg/f:SI 29 29 [120]) (const_int 6 [0x6])) [0 a.a3+0 S1 A8])
don't overlap (as they have recorded different fields of the same structure).
The patch that introduced this optimization was:
http://gcc.gnu.org/ml/gcc-patches/2001-12/msg00072.html
Now, is that valid C to overflow from one field into another one within the
same structure? If yes, I think nonoverlapping_memrefs_p would need to take
into account offsets, sizes and relative distance of the fields.
If not, then perhaps glibc -D_FORTIFY_SOURCE=2 should use __builtin_offset_size
(dst, 1) rather than (dst, 0) even for memcpy/etc.
--
Summary: nonoverlapping_memrefs_p returns true even for
overlapping memory references
Product: gcc
Version: 4.0.2
Status: UNCONFIRMED
Severity: critical
Priority: P2
Component: rtl-optimization
AssignedTo: unassigned at gcc dot gnu dot org
ReportedBy: jakub at gcc dot gnu dot org
CC: gcc-bugs at gcc dot gnu dot org,rth at gcc dot gnu dot
org
GCC target triplet: ppc-linux
http://gcc.gnu.org/bugzilla/show_bug.cgi?id=23561