Folding constants for floats

Isaac Dupree ml at isaac.cedarswampstudios.org
Tue Jan 14 19:54:09 UTC 2014


On 01/14/2014 11:48 AM, Sven Panne wrote:
> My point was: As much as I propose to keep these current semantics,
> there might be users who care more about performance than
> IEEE-754-conformance.

Adding a -ffast-math flag could be fine IMHO.

> For those, relatively simple semantics could be:
> Regarding optimizations, numbers are considered "mathematical"
> numbers, ignoring any rounding and precision issues,

How do you plan to constant-fold things like "log(cos(pi**pi))" without 
rounding?

I checked C, and apparently the optimizer is entitled to assume the 
default floating-point control modes (e.g. rounding mode, 
quiet/signaling NaN) are in effect except in scopes where "#pragma STDC 
FENV_ACCESS ON" is given.  However the standard does not entitle the 
optimizer to change rounding in any other way.  This is sufficient for 
constant-folding in regions where FENV_ACCESS is off.  GCC also has 
flags to control floating-point optimization: 
http://gcc.gnu.org/wiki/FloatingPointMath

Probably it's best not to touch floating point optimization without 
understanding all these issues.

Hmm, I can't see how non-default floating point control mode is 
compatible with Haskell's purity... Even without optimizations, (1/3 :: 
Double) could evaluate to two different values in the same program if 
the floating-point rounding mode changes during execution (e.g. by C 
fesetenv()).

-Isaac


More information about the ghc-devs mailing list