From: Simon Marlow Date: Thu, 20 Nov 2008 10:18:26 +0000 (+0000) Subject: re-instate the gcd/Integer and lcm/Integer RULES X-Git-Tag: 2009-06-25~97 X-Git-Url: http://git.megacz.com/?a=commitdiff_plain;h=8827985d7ce902bfc916e4168049c9a46a1d7fe8;p=ghc-base.git re-instate the gcd/Integer and lcm/Integer RULES Fixes a performance regression between 6.8.3 and 6.10.1 --- diff --git a/GHC/Real.lhs b/GHC/Real.lhs index 287454e..da6053e 100644 --- a/GHC/Real.lhs +++ b/GHC/Real.lhs @@ -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)]