https://gcc.gnu.org/bugzilla/show_bug.cgi?id=78605

--- Comment #1 from joseph at codesourcery dot com <joseph at codesourcery dot 
com> ---
On Tue, 29 Nov 2016, msebor at gcc dot gnu.org wrote:

> As an independent issue, since the type of the arguments to the %f directive 
> is
> float (not double), the checker should use -FLT_MAX rather than -DBL_MAX to
> determine the output.

That may not be safe in general, because of excess range and precision.

In the -fexcess-precision=standard case, the front end will have dealt 
with the excess precision as needed, involving wider types explicitly and 
truncating anything wider than double to double for the variable 
arguments.  Given that these checks are done in the middle end, it will 
see IR where the excess precision is explicit and shouldn't have problems 
with it.

In the -fexcess-precision=fast (default) case, however, the fact that a 
float value might have long double range and precision is invisible to the 
middle end.  On 32-bit x86 the truncation to double will happen as a 
result of storing the argument on the stack, but the double value could 
be outside the range of float without anything in the IR indicating this.

(Remember that with -fexcess-precision=fast, even values stored in 
variables can have excess range and precision, not just direct results of 
arithmetic.  Generally, the issue is where there is implicit excess 
precision in the back end; explicit excess precision inserted in the IR by 
the front end shouldn't be an issue, except for affecting portability of 
testcases.)

Reply via email to