re PR tree-optimization/38051 (Miscompilation of glibc's memcmp)

PR tree-optimization/38051
	* gcc.c-torture/execute/pr38051.c (buf): Remove aligned attribute.
	(buf2): Removed.
	(main): Only run on little endian targets with
	sizeof (long) == sizeof (void *).  Use just one buffer, align the
	pointers at runtime.

From-SVN: r141983
This commit is contained in:
Jakub Jelinek 2008-11-19 00:01:35 +01:00 committed by Jakub Jelinek
parent 042fed7915
commit 890154a8b6
2 changed files with 25 additions and 6 deletions

View File

@ -1,3 +1,12 @@
2008-11-18 Jakub Jelinek <jakub@redhat.com>
PR tree-optimization/38051
* gcc.c-torture/execute/pr38051.c (buf): Remove aligned attribute.
(buf2): Removed.
(main): Only run on little endian targets with
sizeof (long) == sizeof (void *). Use just one buffer, align the
pointers at runtime.
2008-11-18 Thomas Koenig <tkoenig@gcc.gnu.org>
PR libfortran/38135

View File

@ -188,18 +188,28 @@ int mymemcmp (const void *s1, const void *s2, size_t len)
return mymemcmp3 (srcp1, srcp2, len / (sizeof (unsigned long int)));
}
char buf[256] __attribute__((aligned (16)));
char buf2[256] __attribute__((aligned (16)));
char buf[256];
int
main (void)
{
__builtin_memcpy (buf + 9,
char *p;
union { long int l; char c[sizeof (long int)]; } u;
/* The test above assumes little endian and long being the same size
as pointer. */
if (sizeof (long int) != sizeof (void *) || sizeof (long int) < 4)
return 0;
u.l = 0x12345678L;
if (u.c[0] != 0x78 || u.c[1] != 0x56 || u.c[2] != 0x34 || u.c[3] != 0x12)
return 0;
p = buf + 16 - (((long int) buf) & 15);
__builtin_memcpy (p + 9,
"\x1\x37\x82\xa7\x55\x49\x9d\xbf\xf8\x44\xb6\x55\x17\x8e\xf9", 15);
__builtin_memcpy (buf2 + 24,
__builtin_memcpy (p + 128 + 24,
"\x1\x37\x82\xa7\x55\x49\xd0\xf3\xb7\x2a\x6d\x23\x71\x49\x6a", 15);
if (mymemcmp (buf + 9, buf2 + 24, 33) != -51)
if (mymemcmp (p + 9, p + 128 + 24, 33) != -51)
__builtin_abort ();
return 0;
}