[testsuite] Fix up execute/pr38051.c

Jakub Jelinek jakub@redhat.com
Tue Nov 18 18:20:00 GMT 2008


Hi!

This testcase was distilled from preprocessed glibc memcmp.c,
and is little endian specific, in addition to requiring sizeof (long)
the same as sizeof (void *).

The following patch checks that before running it, and also stops
relying on aligned attribute for targets that don't support such alignment.

Ok for trunk?

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.

--- gcc/testsuite/gcc.c-torture/execute/pr38051.c	2008-11-18 14:36:59.000000000 +0100
+++ gcc/testsuite/gcc.c-torture/execute/pr38051.c	2008-11-18 18:50:43.000000000 +0100
@@ -188,18 +188,28 @@ int mymemcmp (const void *s1, const void
     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;
 }
-

	Jakub



More information about the Gcc-patches mailing list