[project @ 2003-04-01 09:35:13 by simonmar]
authorsimonmar <unknown>
Tue, 1 Apr 2003 09:35:13 +0000 (09:35 +0000)
committersimonmar <unknown>
Tue, 1 Apr 2003 09:35:13 +0000 (09:35 +0000)
Don't constant-fold (negateFloat# 0.0#), because the compiler's
internal representation of floating-point literals (Rational) can't
represent -0.0.  This means that

   main = print (-0.0)

now gives the same results with -O as it does without.

Fixes test arith005.

ghc/compiler/prelude/PrelRules.lhs

index 2c2a2e4..c13d6ed 100644 (file)
@@ -208,10 +208,12 @@ cmpOp cmp l1 l2
 
 --------------------------
 
-negOp (MachFloat f)  = Just (mkFloatVal (-f))
-negOp (MachDouble d) = Just (mkDoubleVal (-d))
-negOp (MachInt i)    = intResult (-i)
-negOp l                     = Nothing
+negOp (MachFloat 0.0) = Nothing  -- can't represent -0.0 as a Rational
+negOp (MachFloat f)   = Just (mkFloatVal (-f))
+negOp (MachDouble 0.0) = Nothing
+negOp (MachDouble d)   = Just (mkDoubleVal (-d))
+negOp (MachInt i)      = intResult (-i)
+negOp l                       = Nothing
 
 --------------------------
 intOp2 op (MachInt i1) (MachInt i2) = intResult (i1 `op` i2)