Fix string/tst-xbzero-opt if build with gcc head.
Commit Message
Fix string/tst-xbzero-opt is build with gcc head.
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 introduces a compiler barrier just after filling the buffer.
If okay, shall this be committed before or after the release?
Bye
Stefan
---
ChangeLog:
* string/tst-xbzero-opt.c (prepare_test_buffer):
Add compiler barrier.
Comments
On Thu, Jul 12, 2018 at 10:22 AM, Stefan Liebler <stli@linux.ibm.com> wrote:
> Fix string/tst-xbzero-opt is build with gcc head.
...
> 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 introduces a compiler barrier just after filling the buffer.
I think I understand why the call to swapcontext in
prepare_test_buffer is not a sufficient compiler barrier, but I am not
a fan of asm volatile ("" ::: "memory"), because I fully expect some
future compiler to decide that there are no actual assembly
instructions being inserted so the statement can be completely
ignored. I would prefer us to find some kind of construct that
actually does make externally-visible side effects depend on the
contents of 'buf' in terms of the C abstract machine.
zw
commit 65f9b078c5053faa93e1f572282463685a869864
Author: Stefan Liebler <stli@linux.ibm.com>
Date: Thu Jul 12 16:07:26 2018 +0200
Fix string/tst-xbzero-opt if build with gcc head.
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 introduces a compiler barrier just after filling the buffer
and the filling of the test_pattern is not omitted.
ChangeLog:
* string/tst-xbzero-opt.c (prepare_test_buffer): Add compiler barrier.
@@ -106,6 +106,9 @@ prepare_test_buffer (unsigned char *buf)
for (unsigned int i = 0; i < PATTERN_REPS; i++)
memcpy (buf + i*PATTERN_SIZE, test_pattern, PATTERN_SIZE);
+ /* Force the compiler to really copy the pattern to buf. */
+ __asm__ __volatile__ ("" ::: "memory");
+
if (swapcontext (&uc_co, &uc_main))
abort ();
}