re-instate the gcd/Integer and lcm/Integer RULES
authorSimon Marlow <marlowsd@gmail.com>
Thu, 20 Nov 2008 10:18:26 +0000 (10:18 +0000)
committerSimon Marlow <marlowsd@gmail.com>
Thu, 20 Nov 2008 10:18:26 +0000 (10:18 +0000)
Fixes a performance regression between 6.8.3 and 6.10.1

GHC/Real.lhs

index 287454e..da6053e 100644 (file)
@@ -449,16 +449,16 @@ lcm x y         =  abs ((x `quot` (gcd x y)) * y)
 
 {-# RULES
 "gcd/Int->Int->Int"             gcd = gcdInt
+"gcd/Integer->Integer->Integer" gcd = gcdInteger'
+"lcm/Integer->Integer->Integer" lcm = lcmInteger
  #-}
 
--- XXX these optimisation rules are disabled for now to make it easier
---     to experiment with other Integer implementations
--- "gcd/Integer->Integer->Integer" gcd = gcdInteger'
--- "lcm/Integer->Integer->Integer" lcm = lcmInteger
+-- XXX to use another Integer implementation, you might need to disable
+-- the gcd/Integer and lcm/Integer RULES above
 --
--- gcdInteger' :: Integer -> Integer -> Integer
--- gcdInteger' 0 0 = error "GHC.Real.gcdInteger': gcd 0 0 is undefined"
--- gcdInteger' a b = gcdInteger a b
+gcdInteger' :: Integer -> Integer -> Integer
+gcdInteger' 0 0 = error "GHC.Real.gcdInteger': gcd 0 0 is undefined"
+gcdInteger' a b = gcdInteger a b
 
 integralEnumFrom :: (Integral a, Bounded a) => a -> [a]
 integralEnumFrom n = map fromInteger [toInteger n .. toInteger (maxBound `asTypeOf` n)]