Fix string/tst-xbzero-opt if build with gcc head.
authorStefan Liebler <stli@linux.ibm.com>
Thu, 26 Jul 2018 15:09:44 +0000 (17:09 +0200)
committerStefan Liebler <stli@linux.ibm.com>
Thu, 26 Jul 2018 15:09:44 +0000 (17:09 +0200)
On s390x, the test string/tst-xbzero-opt is failing if build with gcc head:
FAIL: no clear/prepare: expected 32 got 0
FAIL: no clear/test: expected some got 0
FAIL: ordinary clear/prepare: expected 32 got 0
INFO: ordinary clear/test: found 0 patterns (memset not eliminated)
PASS: explicit clear/prepare: expected 32 got 32
PASS: explicit clear/test: expected 0 got 0

In setup_no_clear / setup_ordinary_clear, GCC is omitting the memcpy loop
in prepare_test_buffer. Thus count_test_patterns does not find any of the
test_pattern.

This patch calls use_test_buffer in order to force the compiler to really copy
the pattern to buf.

ChangeLog:

* string/tst-xbzero-opt.c (use_test_buffer): New function.
(prepare_test_buffer): Call use_test_buffer as compiler barrier.

ChangeLog
string/tst-xbzero-opt.c

index d88a7987f273808b5e5af8ec05bee56ce9713d00..3e25bd7a18308d2dd253a5d74c4f8407df703733 100644 (file)
--- a/ChangeLog
+++ b/ChangeLog
@@ -1,3 +1,8 @@
+2018-07-26  Stefan Liebler  <stli@linux.ibm.com>
+
+       * string/tst-xbzero-opt.c (use_test_buffer): New function.
+       (prepare_test_buffer): Call use_test_buffer as compiler barrier.
+
 2018-07-26  Florian Weimer  <fweimer@redhat.com>
 
        * htl/lockfile.c (flockfile, funlockfile, ftrylockfile): Use weak
index aab4a7f715bd9ed61607fe33224c8f5da1246ac0..898345b288c6d6728d3e06af2222aee1d75f8eaa 100644 (file)
@@ -97,6 +97,17 @@ static const unsigned char test_pattern[16] =
 
 static ucontext_t uc_main, uc_co;
 
+static __attribute__ ((noinline, noclone)) int
+use_test_buffer (unsigned char *buf)
+{
+  unsigned int sum = 0;
+
+  for (unsigned int i = 0; i < PATTERN_REPS; i++)
+    sum += buf[i * PATTERN_SIZE];
+
+  return (sum == 2 * PATTERN_REPS) ? 0 : 1;
+}
+
 /* Always check the test buffer immediately after filling it; this
    makes externally visible side effects depend on the buffer existing
    and having been filled in.  */
@@ -116,6 +127,10 @@ prepare_test_buffer (unsigned char *buf)
 
   if (swapcontext (&uc_co, &uc_main))
     abort ();
+
+  /* Force the compiler to really copy the pattern to buf.  */
+  if (use_test_buffer (buf))
+    abort ();
 }
 
 static void