Add some rules; fixes #5767 ghc-7.4.1-release integer-gmp-0.4.0.0-release
authorIan Lynagh <igloo@earth.li>
Thu, 26 Jan 2012 13:58:04 +0000 (13:58 +0000)
committerIan Lynagh <igloo@earth.li>
Thu, 26 Jan 2012 13:58:04 +0000 (13:58 +0000)
We now have rules for
    integerToInt    (smallInteger    x) = x
    integerToWord   (wordToInteger   x) = x
    integerToInt64  (int64ToInteger  x) = x
    integerToWord64 (word64ToInteger x) = x

GHC/Integer/Type.lhs

index 401544d..94bd4dd 100644 (file)
@@ -90,6 +90,11 @@ smallInteger i = S# i
 wordToInteger :: Word# -> Integer
 wordToInteger w = case word2Integer# w of (# s, d #) -> J# s d
 
+{-# RULES
+"integerToInt/smallInteger"   forall x . integerToInt  (smallInteger  x) = x
+"integerToWord/wordToInteger" forall x . integerToWord (wordToInteger x) = x
+ #-}
+
 {-# NOINLINE integerToWord #-}
 integerToWord :: Integer -> Word#
 integerToWord (S# i) = int2Word# i
@@ -120,6 +125,11 @@ int64ToInteger i = if ((i `leInt64#` intToInt64# 0x7FFFFFFF#) &&
                    then smallInteger (int64ToInt# i)
                    else case int64ToInteger# i of
                         (# s, d #) -> J# s d
+
+{-# RULES
+"integerToInt64/int64ToInteger"   forall x . integerToInt64  (int64ToInteger  x) = x
+"integerToWord64/word64ToInteger" forall x . integerToWord64 (word64ToInteger x) = x
+ #-}
 #endif
 
 integerToInt :: Integer -> Int#