Workaround failed constant-folding for zeroBits
authorHerbert Valerio Riedel <hvr@gnu.org>
Sat, 1 Mar 2014 13:45:48 +0000 (14:45 +0100)
committerHerbert Valerio Riedel <hvr@gnu.org>
Sat, 1 Mar 2014 13:45:48 +0000 (14:45 +0100)
For some reason GHC fails to constant fold `zeroBits :: Int` and
`zeroBits :: Integer`; `ghc -show-iface` shows

  $fBitsInt_$czeroBits :: GHC.Types.Int
     {- Strictness: m,
        Unfolding: (GHC.Types.I# (GHC.Prim.andI# 1 (GHC.Prim.notI# 1))) -}

Otoh, constant-folding works as expected, reducing `zeroBits` to 0 constant
for the other integer-types (= {Word,Int}{8,16,32,64}` and `Word`). So this
quickfix is actually just treating the symptom rather than the cause.

Signed-off-by: Herbert Valerio Riedel <hvr@gnu.org>
libraries/base/Data/Bits.hs

index e771624..28cd024 100644 (file)
@@ -363,6 +363,8 @@ instance Bits Int where
     {-# INLINE bit #-}
     {-# INLINE testBit #-}
 
+    zeroBits = 0
+
     bit     = bitDefault
 
     testBit = testBitDefault
@@ -437,6 +439,7 @@ instance Bits Integer where
                      | otherwise = shiftRInteger x (negateInt# i#)
    testBit x (I# i) = testBitInteger x i
 
+   zeroBits   = 0
    bit        = bitDefault
    popCount   = popCountDefault