Ticket #1978 (reopened bug)
possible problem with g++ --optimize (t/pmc/float.t failure)
Reported by: | mikehh | Owned by: | |
---|---|---|---|
Priority: | normal | Milestone: | |
Component: | build | Version: | 3.0.0 |
Severity: | medium | Keywords: | |
Cc: | Language: | ||
Patch status: | Platform: | linux |
Description
In testing t/pmc/float.t it failed a test when built with g++-4.5 with --optimize.
Failed test: 102 - comparison ops: cmp_p_p: equality (passes g++ without --optimize and gcc - Ubuntu 10.10 i386)
kid51 reported that the test passed for him using g++ v4.3.2
I did some further tests with Ubuntu 10.04 i386 and Ubuntu 10.10 i386 and it failed (g++ --optimize only) with g++ v4.4.3 and v4.5.1
NotFound and cotto both managed to reproduce the error using g++ v4.4.5
NotFound proposed a patch, which fixed the problem and cotto committed
diff --git a/src/pmc/float.pmc b/src/pmc/float.pmc index e31cf55..dc8e06e 100644 --- a/src/pmc/float.pmc +++ b/src/pmc/float.pmc @@ -285,8 +285,9 @@ Returns the result of comparing the number with C<*value>. } MULTI INTVAL cmp_num(DEFAULT value) { - const FLOATVAL diff = - SELF.get_number() - VTABLE_get_number(INTERP, value); + volatile FLOATVAL n1 = SELF.get_number(); + volatile FLOATVAL n2 = VTABLE_get_number(INTERP, value); + const FLOATVAL diff = n1 - n2; return diff > 0 ? 1 : diff < 0 ? -1 : 0; }
this fixed the failure.
The main reason for creating the ticket (apart from cotto asking me to) is that we had a failure with g++ --optimize 32 bit (later versions) that did not occur without --optimize or with gcc. The test did not fail on 64 bit (perhaps because of different ways of handling floating point).