[PATCH xf86-input-libinput] test: fix a test failure on ppc64(le) and aarch64

Peter Hutterer peter.hutterer at who-t.net
Tue Feb 28 05:31:20 UTC 2017


Caused by different results in -O0 vs -O2. The resulting array differs only
slightly but the initial sequence has one extra zero. That triggers our
assert, no other compiler flag seem to be affecting this.

Compiled with -O0:
Breakpoint 1, test_nonzero_x_linear () at test-bezier.c:157
157			assert(bezier[x] > bezier[x-1]);
(gdb) p bezier
$6 = {0 <repeats 409 times>, 1, 2, 4, 5, 7, 9, 10, 12, 14, 15, 17, 19, 21, 22,

Compiled with -O2:
(gdb) p bezier
$1 = {0 <repeats 410 times>, 1, 3, 5, 7, 9, 10, 12, 14, 15, 17, 19, 20, 22,

Printing of the temporary numbers in the decasteljau function shows that a few
of them are off by one, e.g.
    408.530612/0.836735 with O0, but
    409.510204/0.836735 with O2
Note: these are not rounding errors caused by the code, the cast to int
happens afterwards.

Hack around this by allowing for one extra zero before we check that the rest
of the curve is ascending again.

https://bugs.freedesktop.org/show_bug.cgi?id=99992

Signed-off-by: Peter Hutterer <peter.hutterer at who-t.net>
---
I tried narrowing this down but it comes down to the difference between -O0
and -O2 and nothing else that I could identify. Printing all the
intermediate numbers shows that a few of them differ in the nth decimal but
for most that doesn't matter. A few are propagated to the digit before the
decimal though and one triggers our assert. it's not worth digging further
into this, imo.

 test/test-bezier.c | 7 +++++++
 1 file changed, 7 insertions(+)

diff --git a/test/test-bezier.c b/test/test-bezier.c
index 1b290a4..9a6e59e 100644
--- a/test/test-bezier.c
+++ b/test/test-bezier.c
@@ -153,6 +153,13 @@ test_nonzero_x_linear(void)
 		assert(bezier[x] == 0);
 	} while (++x < size * 0.2 - 1);
 
+	/* ppc64le, ppc64, aarch64 have different math results at -O2,
+	   resulting in one extra zero at the beginning of the array.
+	   some other numbers are different too but within the error
+	   margin (#99992) */
+	if (bezier[x] == 0)
+		x++;
+
 	do {
 		assert(bezier[x] > bezier[x-1]);
 	} while (++x < size * 0.8 - 1);
-- 
2.9.3



More information about the xorg-devel mailing list